如何写一个经典的扫雷游戏?下面我将简单介绍一下原理:
1.首先需要写一个游戏的基本框架,比如菜单,让玩家选择游玩或者退出;
如图:图二为menu(),菜单,用于引导玩家选择,然后利用do while循环实现多组输入,多次
选择开始或者结束游戏,选择1,进入游戏,选择0,退出游戏,还有数据错误的选项。第137行的
代码有点超纲(对于甚至没有学到指针的人来说)
简单解释一下:就是创造随机数用的,我在后面会讲到其用处
2.进入游戏后,就要开始制作游戏内容。显而易见,扫雷游戏的界面长得很像二维数组吧? 其实也
就是二维数组,于是我们就需要一个数组,就初步定为9*9的吧,然后再初始一下数组,全部
放‘0’。初始化后需要放雷,我们使‘1’为雷。但是放了雷又不能让玩家直接看到,于是我们可以再开
一个字符的二维数组,全部放'*',然后再展示给玩家看。前面这些完成后,就是开始排查地雷。
基本框架如图:
由于排查雷的时候需要排查一个坐标的周围八个位置是否有雷,当排查mine[1][1]的时候,就会越
界访问了, 所以我们在9*9雷区的基础上,再扩展2行2列(9*9区域是有效区域,所以雷布置在9*9
区域),即11*11,这样的话排查1,1坐标时就不会越界,代码实现:
#define row 9 //row,行
#define col 9 //col ,列
#define rows row+2 //为了代码的可移植性,定义为row+2,若直接定为11,要改雷区大小时就
要一处一处地方改
#define cols col+2 //同理
知道以上以后,就可以开始写函数实现,初始化,展示,设置地雷,排查地雷的功能了。
首先1:initboard:初始化
利用循环遍历字符数组所有元素,并赋值set(即‘*’和‘0’);
2:displ : 展示
这也是比较基础的内容,利用for循环打印元素,但是需要注意的是,只需要打印中间9*9的内容,
即 i 和 j 从1开始,到row,col结束。
并且为了展示的可观性,可以在第一行开始前利用for循环输入0-9列号,在每一列开始前输入1-9列
号,并且在打印数组前打印一句话表示游戏开始,实现效果如图所示:
3.setmine 设置地雷
int x = rand() % r + 1; int y = rand() % c + 1;
//这两句话的意思是创造随机数的坐标,并且x和y都在1-9之间,前面
说的超纲代码就用在这里、
easy_count是设置雷数量 #define easy_count 10
接着利用while循环,如果雷没有重复给在同一个坐标,就说明此地方没有设置过雷,然后再设置
一个雷上去,然后count自减,最终设置满10个雷
4.findmine 排查雷
首先判断坐标合法性,即坐标是否落在9*9雷区内,如果落在外面就打印重新输入。
如果落在里面,就判断是否落在雷上,如果落在雷上,就炸死了,然后打印雷的布局,让玩家死的
明目一点,然后break打破循环
如果没落在雷上,那就统计该坐标周围的雷的个数,然后打在用于展示的数组上,用雷的个数代
替‘*’,这里用到了total函数:
道理都一样,利用循环查找是否有雷,有雷就记数自增,最后返回计数,用 r 来接收,需要注意的
是循环时 i 和 j 的值,从-1到1,因为是周围一圈坐标的点集。
回归正题,统计完后赋值给用于展示的数组,因为统计出来的数字是整型2,所以赋值时要用
show[x][y]= r + ‘0’; 或者把‘0’换成48。完成一次赋值后令cnt自减,其中cnt是r*c-easy_count, 雷
区总大小减去布雷数,即剩余空间。当cnt等于0时,说明无雷区域全部排完,然后结束循环后来到
if判断语句,符合条件(炸死,cnt不等于0,不符合条件),打印排雷成功。
至此,扫雷游戏的基本逻辑以及部分代码实现就完成了。
这是运行起来的样子:
看起来还是挺简陋的,哈哈,不过会好起来,坚持才是胜利,各位再见~