扫雷游戏(函数和数组能力的检验)

根据之前讲解的数组和函数,简单做一下最基础模式的扫雷游戏。当然这个可以精进,后期有时间的话,也可以做的更好一点,现在就基于所讲知识,简单做一下游戏。

首先,要写游戏的代码,先要明白,游戏该怎么玩,同时,在写代码之前,要明确自己要做的内容,这样不仅节约时间,也能提高工作效率。

目前能做的是可以完成下列操作:

1.使用控制台实现经典的扫雷游戏(cmd窗口)(cmd窗口就是底层逻辑代码)

2.可以通过菜单实现继续完或者退出游戏

3.扫雷的棋盘式9*9的格子(这样后面可以再加,9*9是最基础的游戏)

4.默认随机布置10个雷

5.可以排查雷:

如果位置不是雷,就显示周围有几个雷

如果位置是雷,就炸死游戏结束

把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束

先讲一下,函数有函数的声明,函数的应用,可以分开写,那就是可以写三个文件去去实现这个代码。add.h           add.c          test.c

扫雷游戏网页版 - Minesweeper//这是扫雷的网页版,可以根据这个游戏,来想你下一步要干什么,提前做好规划,方便接下来去写代码。

目录

main函数:

为什么设计两个数组?

对棋盘进行初始化

布置雷

展示棋盘(其中打印列号和行号):

检验:

排查雷:

为什么是c+'0':

验证正确与否:

最后完整代码:

add.h:

add.c :

test.c :


那现在就开始写代码了:

main函数:

首先,先写出main主函数来

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//玩游戏
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

这样的代码,我相信看过我之前的写的,再加上自己的勤加练习还是可以做到的,我就简单解释一下吧,方便大家理解,input输入,这个很简单,我就不过多解释了,为什么用do while 呢?do while 它是无论条件成不成立,都会循环一次,能够在你什么都不输入的情况下,展示菜单,这样就验证了2.可以通过菜单实现继续完或者退出游戏。switch语句也很明白,我就不说了。

void menu()
{
	printf("*********************\n");
	printf("****** 1.play *******\n");
	printf("****** 0.exit *******\n");
	printf("*********************\n");
}

这是menu(菜单)。相信大家都能看懂。

game()这个是重点,毕竟你主要工作就在忙这个。

void game()
{
	char mine[11][11] = { 0 };
	char show[11][11] = { 0 };
	//完善游戏代码
	//棋盘初始化
	//mine 数组初始化全为'0'--表示还没有布置雷,所有位置都不是雷
	//show 数组初始化全为'*'--表示所有位置没有排查
	InitBoard(mine,11,11,'0');
	InitBoard(show,11,11,'*');

	//布置雷
	SetMine(mine,ROW,COL);
	//打印棋盘
	DisplayBoard(mine,9,9);
	DisplayBoard(show,9,9);
	//排查雷
	Findmine(mine,show,9,9);
}

可以提前把要做的操作提前写出来,当然也可以提前一步,不用提前这个多,为什么是11呢?因为9*9的话,你要统计周围的雷的个数的话,肯定要把边缘位置的那些统计全了,也就上下左右各加上一行或者一列。

这里可以做一个简单的优化,因为什么呢?

如果你要后面做点改动,这个比如你觉得9*9对你来说太过简单了,单纯改9的话,要改的地方太多了,当然你可以也会漏改,大大影响工作效率。

当然你们可能会问这样一个问题:

为什么设计两个数组?

因为一个数组是设置雷

另一个数组是如果那个坐标是雷,被炸死了,没什么好说的

那如果不是雷,统计周围雷的个数,那那个数和你一开始设置雷的数字能够混淆,所以设置两个数组。

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//完善游戏代码
	//棋盘初始化
	//mine 数组初始化全为'0'--表示还没有布置雷,所有位置都不是雷
	//show 数组初始化全为'*'--表示所有位置没有排查
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');

	//布置雷
	SetMine(mine,ROW,COL);
	//打印棋盘
	DisplayBoard(mine,ROW,COL);
	DisplayBoard(show,ROW,COL);
	//排查雷
	Findmine(mine,show,ROW,COL);
}

初始化棋盘式ROWS,COLS,是因为要包括上下左右加的那一列

布置雷的时候,肯定是放在中间9*9里面,所以是ROW,COL

打印展示的时候,也是ROW,COL,就像你玩扫雷游戏的时候,9*9模块,不会给你展示11*11的一样

排查雷,和布置雷类似,布置雷是布置在9*9里面,排查雷,也肯定是排查9*9里面布置的雷

这就是修改后的代码。 

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

这个在头文件里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值