如何用C语言写出你自己的第一款游戏-----扫雷

目录

1. 扫雷游戏长什么样子?游戏逻辑是什么?

2.如何用C语言逻辑来写这种的扫雷游戏呢?我们的逻辑思路是什么?


1. 扫雷游戏长什么样子?游戏逻辑是什么?

        

         这是基础版的扫雷游戏的界面,如图我们页面内展示的,游戏开始的时候,整个页面内全是空白的格子,这时候我们需要随机点开一个格子后,就会得到我页面所展示的这样,这时候呢,我们扫雷页面呢就会出现数字,这些数字代表什么含义呢?

大家看我红色格子框出来的区域,这个红色方框中间是数字1,这个 数字1代表的含义就是以这个数字为中心的“九宫格”内的区域中有一个雷,那结果就很明显了,这里就剩最后一个格子了,所以我们如图这个位置呢就是一个雷。那么数字2就代表以这个数字为中心的“九宫格”内的区域中有两个雷,以此类推。

 而当我们把所有不是雷的区域都点开后游戏就胜利了!!

2.如何用C语言逻辑来写这种的扫雷游戏呢?我们的逻辑思路是什么?

首先,我们观察到这个基础版的扫雷是一个9*9的大方格,里面有81个格子,而这81个格子里有10个雷,所以剩下了71个格子,我们需要把这71个雷全部排查完毕,游戏胜利,这时候我们可以想到用二维数组来创建这个扫雷页面,但是我们要创建的数组是否是9行9列呢?大家思考一下,答案是“NO”,为什么呢?

大家看一下我们下面这个红色方格最下面有个以数字1为中心的九宫格,因为这个1已经是最下面了,所以下面红色方框的三个就根本不需要排查,但是呢?如果我们创建了9*9的棋盘,尽管下面这三个格子根本不在游戏里,我们也要创建出来,防止我们二位数组的越界访问,SO?我们要创建一个什么规格的棋盘呢?答案很显然,那就是在9*9的基础上,上下都加上一行左右都加上一列,这时候我们的数组就变成了11*11的规格了 ,但我们要打印出来的是9*9的棋盘,而在C语言程序中要怎么设计出来这个11*11的棋盘而打印9*9的棋盘呢?这里呢我们先打印一个菜单吧提示用户是玩游戏还是退出游戏?

void menu()
{
	printf("**************************\n");
	printf("*******   1.play  ********\n");
	printf("*******   0.exit  ********\n");
	printf("**************************\n");
}
int main()
{
	int input = 0;
	//设置随机数的生成
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

我们可以利用数字1和数字0来让用户决定是否玩游戏,这时候我们可以利用do while循环来实现,如果用户输入1的话就执行game(),如果输入0的话这时候我们就提示用户“退出游戏”结束循环,如果用户输入了1和0以外的数字,我们就提示用户“选择错误”结束循环即可,是不是很简单啊!这时候我们就可以写game()里的程序了,首先呢我们要设置棋盘对吧,我们可以把棋盘内不是雷的地方设置为字符‘0’,把雷的位置设置为字符‘1’如下图。

但是呢如果这个‘0’的周围有1个雷的话我们就要让它显示为1,这时候我们就发现这与雷‘1’矛盾了,信息量太大,我们不好辨别雷和周围雷的个数,这时候我们就可以再创建一个一模一样的棋盘,第一个棋盘用来存储我们雷,第二个棋盘用来排查雷,这时候我们就可以设置这两个数组了 

void game()
{
	char mine[11][11] = { 0 };//存放布置好雷的信息
	char show[11][11] = { 0 };//排查布置好雷的信息
}

 这时候我们两个二位数组已经设置好了,但是我们发现如果我们“基础版”的扫雷不想玩了,要玩“中级”或者“专家”的时候我们后面的这些数据都要改很麻烦,这里我们不妨自定义一个行和列“ROW”“COL”代表9行9列“ROWS”“COLS”代表11行11列,但是呢如果把这么多信息放在一个.c文件里就会显得很乱,到时候我们代码出现小bug很难检查出来对错,所以我们可以把这些信息放到头文件.h里如图所示

这时候只要我们的.c文件里包含了这个game.h的头文件就可以使用里面的数据了,然后我们就可以在这两个棋盘里填充信息,我们想一下,第一个棋盘是布置雷的信息,第二个棋盘才是用户用来排查雷的信息的,所以我们第一个棋盘所有格子要初始化为‘0’后续再设置雷就可以了,而第二个棋盘要设置的有神秘感,我们可以设置为‘*’,这时候初始化这两个数组的信息就可以写出来了

 

我们初始化好两个棋盘的信息后就开始下一个步骤:随机设置雷。这里我们要设置的雷在9*9的棋盘里,所以我们传参的时候千万不敢传错,如何保证我们设置的雷伪随机数呢?这时候我们就可以回顾我们之前所学的srand操作,这时候我们可以定义两个坐标横坐标x纵坐标y,让srand随机生成坐标,然后我们再把坐标设置为雷即可,我们要在mine数组里设置雷的,所以我们传参要传mine数组,我们就可以把SetMine(mine, ROW, COL);作为函数,因为简单模式的雷为10个所以我们可以在头文件定义一下EASY_COUNT 10,我们要设置雷可以用while循环当我们10个雷全部布置好之后就可以了。怎么生成雷呢?,我们上面提到了生成两个坐标,把数组坐标的元素设置为‘1’即可。如果设置好一个雷,count就--,直到全部雷设置完毕,我们就可以跳出循环了,这里随机生成的坐标的范围大家可以想一下,因为我们的棋盘是9*9,所以坐标x和y的范围也应该是1-9,这里如下图

我们设置好雷的信息后我们可以先尝试打印一下mine数组看一下我们的10个雷是否设置成功了,

这里为了提示用户的每一行每一列,我们可以在第一行打印出来列号,每一列都打印出来行号,这时候我们打印mine可以看到10个雷确实是设置成功了,这时候我们更有信心进行下一步的分析

 

下一步我们就要开始排查雷了,我们可以先思考一下怎么排查雷,我们要先给用户一个提示说:请输入要排查雷的坐标,这时候用户就输入坐标,如果这时候输入的坐标是雷的话,就提示“很遗憾,你被炸死了”,退出游戏即可,如果输入的坐标不是雷,我们要让坐标的位置显示以它为中心的九宫格附近的雷的个数,那么这个雷的个数怎么统计呢?我们可以画个图让大家直观的感受有一下

我们可以把周围8个位置的坐标用x和y表达出来,我们只需要把这八个位置的数组元素相加即可,但是,这里都是字符,我们要怎么转化为数字呢?我们都知道‘0’的ASCALL的值为48,‘1’的ASCALL值为49,我们可以把8个全部加起来再减去8*‘0’即可,这时候我们雷的个数就已经表示出来了,但要表示在show数组中我们还要用字符的形式表示出来,这时候我们直接+‘0’就可以变成字符的形式了,但是怎么样才算排雷成功呢?我们可以定义一个win,如果win<=row*col-EASY_COUNT就说明我们的雷还没有排查完毕,排查一个不是雷的话我们就win++,继续这个循环,但如果用户输入了两个一模一样的坐标,我们就可以提示用户说这个坐标已经被排查过了,如果win==row*col-EASY_COUNT就说明我们成功了,但如果用户失败了,我们也要给他打印出来我们的mine数组给用户看一下我们雷的位置,让用户知道自己真真正正的排雷错误了,

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("请输入要排查雷的坐标\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排查过,不能重复排查\n");
			}
			else
			{
				//如果是雷
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}
				//如果不是雷
				else
				{
					win++;
					//统计周围雷的个数
					int count = get_mine_count(mine, x, y);
					show[x][y] = count + '0';//转化成数字字符
					DisplayBoard(show, ROW, COL);
				}
			}

		}
		else
		{
			printf("输入错误,请重新选择\n");
		}

	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

 这时候我们基础版的排雷程序已经写完了,我们来运行一下看是否可以运行出来

这时候我们运行出来的每一步都可以展示出来,就说明我们的逻辑是正确的,但是一个合格的程序员要把所有雷都排查完,效率太低了,所以我们这时候把雷直接设置为80个,这时候就相当于只有一个不是雷,我们可以看着,mine展示的雷的位置来对show进行排查,看我们能不能排雷成功

 

 我们可以看到把雷设置为80个后,只有(2,4)这个坐标不是雷,我们输入坐标后,提示我们恭喜你,排雷成功,这时候就可以完完全全地说明我们地程序和思路都完全成功了。

制作不易,希望大家可以点点赞,我也会继续努力,不负大家希望,以后会把自己听课记录写博客,希望更多的人能看到,也希望大家指出我的失误和不足,也希望大家上课没听懂的地方看了我的文章能有头绪,谢谢大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值