扫雷游戏
前言:
大家应该都听说过一款小游戏扫雷,相信大家或多或少都玩过这款游戏,今天我们来用C语言来实现一个简易版的扫雷游戏。
扫雷
1.扫雷的原理
基础版的扫雷就是在一个 9x9 的格子里随机放置10个雷,点击格子没有雷会周边展开直到碰到周边有雷的格子停下来。
简易版的扫雷是借助控制台来实现,输入坐标,没有雷时显示以当前格子为中心的九个格子的雷的数量,并不会向周边展开。
2.扫雷游戏代码的实现
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在99的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个99的数组来存放信息。
那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.
假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1
但是当我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三个坐标就会越界。
为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的99的坐
标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成1111是⽐较合适。
我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那么将(1)放在当前坐标上到底是有雷呢?还是周围有一个雷,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。
为了解决这个问题这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。
同时为了保持神秘,show数组开始时初始化为字符 ‘*’,为了保持两个数组的类型⼀致,可以使⽤同⼀套函数处理,mine数组最开始也初始化为字符’0’,布置雷改成’1’。
对应的数组应该是:
char mine[11][11] = {0};//⽤来存放布置好的雷的信息
char show[11][11] = {0};//⽤来存放排查出的雷的个数信息
由于代码的量较多,使用多⽂件的形式对函数的声明和定义可以有条理的编写代码。
test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等
首先在test.c文件中编写大体框架
参照此简易版扫雷图片
为了有条理的编写代码,我们将游戏封装在一个test函数中
在test函数中先编写出大体框架
在此图中可看待一个mune函数和一个game函数
mune函数中是我们的菜单栏
game函数中是我们的游戏的实现
在创建两个数组时为了方便后续难度的添加更改数据将数组中的11改为ROWS和COLS,此时我们就要在头文件game.h中定义ROWS和COLS
创建数组后首先我们要将数组进行初始化
在棋盘初始化完成后,我么要开始布置雷
在布置雷是为了方便后期添加难度更改数据,在头文件game.h定义雷的个数
下一步就是打印棋盘
在打印棋盘后,就迎来了最后一步排查雷
在排查雷中还涉及到一个统计该坐标周围雷的函数
此前已说明使用多⽂件的形式编写代码,因此在头文件中包含了对于各函数的声明
至此简易版扫雷就完成了。
下面是扫雷的代码链接
https://gitee.com/immortal-sleep/first/tree/master/game/game