C语言第十二弹--扫雷

02-27 阅读 0评论

C语言第十二弹--扫雷

C语言第十二弹--扫雷,C语言第十二弹--扫雷,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第2张
(图片来源网络,侵删)

  ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

扫雷

1、扫雷游戏分析和设计

1.1、扫雷游戏的功能说明

1.2 游戏的分析和设计

C语言第十二弹--扫雷,C语言第十二弹--扫雷,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第3张
(图片来源网络,侵删)

1.2.1、数据结构的分析

1.2.2、文件结构设计

2、扫雷游戏的结构分析

2.1、用户选择

2.2、初始化棋盘

2.3、设置雷

C语言第十二弹--扫雷,C语言第十二弹--扫雷,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第4张
(图片来源网络,侵删)

2.4、排雷

3、扫雷游戏分文件的代码实现

3.1、test.c

3.2、game.c

3.3、game.h

4、扫雷游戏的扩展

总结


1、扫雷游戏分析和设计

1.1、扫雷游戏的功能说明

使用控制台实现经典的扫雷游戏

• 游戏可以通过菜单实现继续玩或者退出游戏

• 扫雷的棋盘是9*9的格子

• 默认随机布置10个雷

• 可以排查雷
◦ 如果位置不是雷,就显示周围有几个雷

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

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

游戏的界面:

C语言第十二弹--扫雷

1.2 游戏的分析和设计

1.2.1、数据结构的分析

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。

因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9*9的数组来存放信息。

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个位置,统计周围雷的个数是1

假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个位置,统计周围雷的个数时,最下面的三

个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11是比较合适。

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和非雷的信息(0),假设我们排查了某个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。

这里我们肯定有办法解决,比如:雷和非雷的信息不要使用数字,使用某些字符就行,这样就避免冲突了,但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。

这里我们采用另外⼀种方案,我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。

同时为了保持神秘,show数组开始时初始化为字符 '*',为了保持两个数组的类型⼀致,可以使用同⼀套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'。如下如:

对应的数组应该是:

char mine[11][11] = {0};//用来存放布置好的雷的信息

char show[11][11] = {0};//用来存放排查出的雷的个数信息

1.2.2、文件结构设计

之前学习了多文件的形式对函数的声明和定义,这里我们实践⼀下,我们设计三个⽂件:

test.c //文 件中写游戏的测试逻辑 game.c //文 件中写游戏中函数的实现等 game.h //文 件中写游戏需 要的数据类型和函数声明等

建议:写一些代码就测试一些代码。

2、扫雷游戏的结构分析

2.1、用户选择

首先用户选择需要的功能,输入1则进入游戏,输入0则退出游戏,输入其他值则重新输入。

从这可以知道此处为一个循环,而且一定会进入一次,符号do while的特性,因此使用do while循环,但是此处需要打印一个选项的界面,因此可以使用创建一个菜单。

C语言第十二弹--扫雷

#include
//菜单
void menu()
{
	printf("******************************\n");
	printf("*********   1.play   *********\n");
	printf("*********   0.exit   *********\n");
	printf("******************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//游戏实现
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}
	} while (input);//为假则退出循环,即输入0退出循环,游戏结束
	return 0;
}

2.2、初始化棋盘

根据前面的分析,创建一个能够对两个棋盘初始化的函数。参数有该数组,数组行号,列号,还有初始化的值(这样才能保证一个函数能够初始化两个棋盘),一个初始化为'0',一个初始化为'*',均为字符。为了测试我们需要将棋盘打印出来,此处需要创建一个打印棋盘的函数。参数有数组,行号,列号。

//初始化棋盘
void BoardInit(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i 

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]