1.扫雷游戏分析和设计
扫雷游戏的功能说明:
1) 使用控制台实现经典的扫雷游戏
2) 游戏可以通过菜单实现继续玩或者退出游戏
3) 扫雷的棋盘是9*9的格子
4) 默认随机布置10个雷
5) 可以排查雷:
如果位置不是雷,就显⽰周围有⼏个雷
如果位置是雷,就炸死游戏结束
把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
2.游戏的分析和设计
1) 数据结构的分析
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9*9的数组来存放信息。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
6 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
8 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
如果这个位置布置雷,就存放1,没有布置雷就存放0
假设我们排查(2,5)这个坐标时,访问周围的⼀圈8个黄色位置,统计周围雷的个数是1
假设我们排查(8,6)这个坐标时,访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下面的三
个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11是比较合适。
2) 文件结构的设计
test.c
//文
件中写游戏的测试逻辑
game.c
//文
件中写游戏中函数的实现等
game.h
//文
件中写游戏需
要的数据类型和函数声明等
3.扫雷游戏的代码实现
1.编辑基本框架与试运行
![](https://img-blog.csdnimg.cn/direct/de323752133445cfac0b5557878f1488.png)
在试运行之后,调节了一些语法错误和换行的问题,程序能初步正常运行。
2.初始化棋盘
这里我们采用⼀种⽅案,我们给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。同时为了保持神秘,show数组开始时初始化为字符 '*',为了保持两个数组的类型⼀致,可以使⽤同⼀套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'
![](https://img-blog.csdnimg.cn/direct/2f685ff22519434eadfee5d6e555e8f8.png)
在test.c中写大体逻辑,在game.c中实现函数
![](https://img-blog.csdnimg.cn/direct/b16a4375cbc547d3bbaf068685cc4345.png)
3.打印棋盘
由于只需将show棋盘呈现给玩家,故只需调用一个函数
![](https://img-blog.csdnimg.cn/direct/f9583e6c09c24d2598ebae08852fb594.png)
考虑到最好要加一个纵横基准点,巧妙地采用了如下代码:
![](https://img-blog.csdnimg.cn/direct/d6666878e2f14696ba93e68a0ee61510.png)
最终呈现的效果如下:
![](https://img-blog.csdnimg.cn/direct/2b9dc575f257461ab6dadc6fff1045a4.png)
4.布置雷
布置雷的具体位置的时候需要用到随机数的生成,故要在主函数内加上srand函数
![](https://img-blog.csdnimg.cn/direct/432175ba194c4d8087c4689c5239d13e.png)
在game.c中通过count计数来完成雷的布置,
注意一定要避免重复!(后期才发现的问题)否则雷会少
![](https://img-blog.csdnimg.cn/direct/3b094d88359e47d6a35ccbbb7a397669.png)
5.排雷
此时,呈现给玩家的界面是布满 * 的未知雷区,且雷区已经布置完毕。玩家要输入坐标进行排雷,若该位置是雷,游戏结束,若该位置不是雷,要显示这个坐标周围有几个雷,当玩家输入完所有非雷区的坐标时,获得胜利。
![](https://img-blog.csdnimg.cn/direct/44544405f46d4c548184883cc0d0a154.png)
上面是test.c中的文件,用于引用排雷函数,下面是game.c中的文件,为排雷函数的详细说明
![](https://img-blog.csdnimg.cn/direct/3c487105319542679872ba928345acb8.png)
4.总代码全览
1.test.c
2.game.c
3.game.h
![](https://img-blog.csdnimg.cn/direct/e5ba27fa2fa34e4c8a1eaa61116a9e73.png)
5.问题总结
实际上,在起初设计改代码的时候,遇到了很多问题,后来才逐步解决
1.如何使得玩家看不到真实的雷区却能同步输入的信息?
答:创建两个雷区,一个放0,1,另一个放*,利用数组和函数将输入的信息同步到雷区。
2.排查边缘的雷越界怎么办?
答:将9*9扩展为11*11,多出来的放0。
3.含有常量的参数传参不熟练
4.‘0’ 和 ‘1’均为字符,以ASCII码形式储存,不能直接当成数字