设计思路与分析
• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷
◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束
数据结构的分析
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放信息。
那如果这个位置布置雷,我们就存放1,没有布置雷就存放0。


数据结构的实现
我们知道在扫雷游戏中,点击一个位置,如果这个位置没有雷,会显示周围有几个雷,那么如果像图中最边上的位置(例如(0,0),(1,0),(0,1)),它们周围是没有数字的,我们该怎么解决这个问题呢?
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11 是⽐较合适。

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某 ⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录 存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布 置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。
这⾥我们肯定有办法解决,⽐如:雷和⾮雷的信息不要使⽤数字,使⽤某些字符就⾏,这样就避免冲 突了,但是这样做棋盘上有雷和⾮雷的信息,还有排查出的雷的个数信息,就⽐较混杂,不够⽅便。
这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再 给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期 排查参考。

对应的数组应该是
char mine[11][11] = {0};⽤来存放布置好的雷的信息
char show[11][11] = {0};⽤来存放排查出的雷的个数信息
文件结构的设计
利用函数的声明和定义,这⾥我们实践⼀下,我们设计三个⽂件:
1 test.c //⽂件中写游戏的测试逻辑
2 game.c //⽂件中写游戏中函数的实现等
3
game.h //⽂件中写游戏需要的数据类型和函数声明等
4 在text.c和game.c里面一定要加上#include"game.h"。
扫雷游戏的代码实现
游戏界面的设定
menu()函数打印游戏界面。

利用do while 和switch 循环语句完成游戏开始结束的实现。
里面srand((unsigned int)time(NULL))是随机值的产生。后面为埋雷的实现做铺垫。

创造棋盘
我们利用数组创造棋盘,在这以前我们需要在头文件里面对数字进行定义。
我们在game.h里面给数字定义。

在text.c里面创造数组。

接下来我们利用函数进行初始化棋盘。
text,c里面我们写好参数。

game,h中写好函数声明。

game.h中进行函数实现。

打印棋盘
棋盘已经创造完毕,接下来我们进行打印棋盘。
在text里面写好函数参数。

在game.h中写好函数声明。

在game.c中进行函数实现。

埋雷实现
在text.c中写好函数参数。

在game.h中写好函数声明。

在game.c中进行函数实现。

找雷实现
为了实现显示周围雷数的问题,我们这样设计代码。
game.c中我们先用函数解决范围周围雷数的问题。

还有一种设计方法。

接下来绝对找雷过程的设计。
在text.c中写好函数参数。

在game.h里面写好函数声明。

在game.c进行函数实现。

扫雷游戏全部代码详细
game.h

text.c


game.c



