写个简易控制台阉割版扫雷游戏

我们来看一下扫雷的基本规则:在一些方格中随机分布着一些雷,点击任意一个方格,若此方格中含雷,则被炸死,若无雷,被点击的方格中就会显示周围八个方格中雷的个数,也就是周围一圈方格中雷的个数。

要写的话,先得想好怎么搭建一个棋盘,方格可以用字符代替,不妨用'*',到时候我们想打印出的棋盘应该是这样的

这是一个10*10方阵。接下来会在里面随机的生成若干个雷,并且需要统计某个'*'周围的雷个数。为了表达清楚这个意思,可以在另外生成一个棋盘,由'0'组成,这个棋盘大小与'*'棋盘完全相同,可以做到一一对应。

然后再随机的生成雷,这里我们用'1'表示雷。

这样的'0','1'棋盘与'*'棋盘中的'*'一一对应,可以得出每个'*'周围的雷数。

接下来问题是如何统计一个位置周围雷的个数,一种方法可以是,遍历这个位置周围的元素,若为'1',则加1,这种方法还需要判断这个位置是否在边界,比较麻烦。还可以创建数组,始终比要打印出的棋盘多两行两列。比如打印10*10的棋盘,就创建12*12的二维数组,这样做就不需要判断位置是否在边界。同时也可以使用一种更巧妙的方法求周围雷数。

我们知道'1'-'0'==1,'2'-'0'==2,字符1减字符0等于数字1,那么我们只用计算'0'周围'1'数量就可以了,将选择的位置周围元素全部相加再减去7*'0',就得到了周围的雷数。那么只需要把这个雷数赋值给所选位置的'*'就好。效果如下图

这个'1'就表示周围有1个雷。

最后只需要判断游戏是否结束,游戏如果结束,要么是点到了雷,要么是完全没点到雷。

分析完了,开始写代码。

不妨建立三个文件,game.c用来写实现上述功能的函数,test.c用来测试,game.h用来写函数声明。

不妨先写个简易菜单

void menu(void)
{
	printf("***************************************\n");
	printf("*************1.start 2.exit************\n");
	printf("***************************************\n");
}

首先定义出需要的变量和包含必要的头文件。

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define col 10
#define row 10
#define cols col+2
#define rows row+2
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

这是目前能想到的头文件game.h要写的。

然后需要两个二维数组并将其初始化,如果想打印10*10的棋盘,那么得创建12*12的数组。不妨将两个数组取名为myboard和bombboard,分别表示'1','0'数组和'*'数组,将其初始化的函数

void initmy(char arr[rows][cols], char ch)
{
	for (int i = 0; i < cols; i++)
	{
		for (int j = 0; j < rows; j++)
		{
			arr[i][j] = ch;
		}
	}
}

初始化后将两棋盘打印的函数

void printboard(int ROW, int COL, char ch[rows][cols])
{
	printf("\n");
	for (int k = 1; k < ROW-1; k++)
		printf("%d ", k);
	printf("\n");
	for (int i = 1; i < ROW-1; i++)
	{
		for (int j = 1; j < COL-1; j++)
		{
			printf("%c ",ch[i][j]);
		}
		printf("%d", i);
		printf("\n");
	}
	printf("\n");
}

接下来要生成雷

void generatebomb(char arr[rows][cols],int bombnum)
{
	while (bombnum)
	{
		int x = rand() % row+1;
		int y = rand() % col+1;
		if (arr[x][y] != '1')
		{
			arr[x][y] = '1';
			bombnum--;
		}
	}
}

然后用户输入坐标扫雷

char Findbombnum(char arr[rows][cols], int x, int y)
{
	x = x % 10+1;
	y = y % 10+1;
	return arr[x][y + 1] + arr[x][y - 1] + arr[x + 1][y] + arr[x - 1][y] + arr[x + 1][y + 1] + arr[x - 1][y + 1] + arr[x - 1][y - 1] + arr[x + 1][y - 1] - 7 * '0';
}//返回数字,需要字符

最后判断是否结束即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值