一、概况
要实现扫雷游戏,首先需要打印一个界面:
因为需要输入坐标进行排雷,最好在行和列打印一下相关数字,像这样:
然后需要埋地雷,再实现探查。
二、问题预测和解决方案
1.在书写过程中,我们可能会遇到:
(1).统计一个坐标周围雷的个数时(因为打印列表要用二维数组),可能会出现数组的越界问题
(2).存放的数据有重叠性,容易乱(数组打印隐蔽用字符和是否是雷,两组数据叠加起来)
(3)头文件繁杂,函数众多,书写占地很大
2.针对这三个问题,我们采取对应的解决方案
解决(1).打印的时候,使用比目标行和列多两行的数组,例如
目标:ROW行,COL列
数组:
ROWS=ROW+2;
COLS=COL+2;
show[ROWS][COLS]
解决(2).两组数据分别存到一个数组,例如:
隐蔽用数组:show[ROWS][COLS]
埋雷数组:mine[ROWS][COLS]
解决(3).建立两个源文件
game.c存储过程中复杂的函数
test.c实现主函数
建立一个头文件
game.h实现头文件的整合
三、代码实现
1.首先创建main函数,函数中实现:
①打印菜单(在此笔者选用函数来实现打印菜单,当然也可以直接打印,不过主函数会不够简洁)
②读入用户输入数据决定是否运行
2.进行二维数组的定义:
①给出两个数组的定义:
在此,我们在game.h头文件中用#define将行和列设置为ROWS和COLS,方便之后修改行数和列数
3.进行隐藏数组和埋雷数组的初始化:
因为要隐藏地雷需要用字符来作为数组的元素,
因此,为了数据转换方便(隐藏字符转雷),
我们采用字符'0'来进行初始化,字符'1'来表示雷。
首先要在game.h中声明要写的函数
(小提示:此处声明不可以传参int COLS亦或是int ROWS,因为我们是在头文件game.h中定义的ROWS和COLS,下文传参row和col也是同理)
函数存储初始化过程
(小技巧:可使用多传一个字符char set的方式来用一个函数同时初始化两个数组)
在主函数game()中,加上
4.打印棋盘
初始化完毕以后,数组便可以进行打印了,但因为我们所定义的数组实际上比需要打印的多出来两行两列,所以可以在打印时for循环从1开始,到需要的行/列数ROW/COL结束。
我们在打印完后还需要添加数字,方便玩家确认坐标位置更加方便一些,因此,下文笔者将一气呵成给出打印符号+行号列号的代码
主函数传参
game.h声明
函数实现
5.布置雷
布置雷的时候,我们可以利用随机生成数来为mine[ROWS][COLS]数组实现元素的替换,
{
注:①随机生成数我们使用rand()函数,同时用srand()来为其修改作为“种子”的基准值,来确保rand()函数生成的随机数不会呈现一定规律
②电脑中的time()函数所表示的时间戳是一个不具备重复性的数字,我们可以利用其来获得为srand传递的数字
头文件新加
主函数新加
③准备完毕,我们可以开始进行生成地雷了,提前在头文件定义好
方便以后修改雷的个数。
}
主函数传参
game.h声明
函数实现(利用变量s值的变化来实现控制雷的个数)
注:任意数除以row(传来的其实是ROW)再加一都会保证生成的数在1~row之间,col同理。
6..排查雷
{
①排查的过程,需要保证玩家输入的坐标正确,可以使用if语句来进行限制
②初级扫雷程序:一次扫一个格,所以扫过ROW*COL-MineNumber就是胜利
③每次扫雷都要统计格子周围雷的个数,可以使用一个函数来实现
}
主函数传参
game.h声明
排查雷函数实现
统计雷个数函数实现
至此,函数便可以运行了。
四、源码(供copy)
请查看gitee
九州空城 (kyushu-empty-city) - Gitee.com
仓库c_code_yv
test_10_29(扫雷)