一.分析游戏并整理思路
1.1游戏玩法的分析:
扫雷游戏是在一个由9*9的小方格组成的大方格里放入一定数量的雷,并让显示界面无法看到雷的分布。让玩家选择要排查的小方格,如果排查位置不是雷,则在该位置显示周围的雷的个数,如果是雷,则玩家被诈死,直到玩家将所有的非雷位置找到后则可赢得游戏。
1.2游戏玩法对应的数据结构:
通过上面的游戏玩法分析,我们来分析出对应的编程思路。上面的分析只是对游戏的实现的分析,而一个游戏都需要菜单来显示游戏的开始与结束以及其他的相关信息。
1.我们需要实现游戏的菜单,用来引导玩家开始或结束游戏。
2.设想控制开始游戏或结束游戏的代码。
3.关于主体部分游戏功能的实现。首先,“9*9的小方格组成的大方格”来放炸弹,我们可以想到定义一个二维数组mine[9][9],可用1来当作雷存入数组;同时扫雷时我们时看不到雷的位置,我们需要另一个二维数组show[9][9],可用‘*’初始化来掩盖第一个二维数组,因而数组类型为char。其次,显示非雷位置周围的雷的个数,只需对存雷的数组的所对应的位置的周围进行查询并统计雷的个数,将雷的个数赋值给show数组中对应的元素。但我们从下图看,会出现数组的访问越界的问题
解决的问题我们可以将数组的大小改为11*11就行了。
4.其他的扫雷的失败与成功只需运用关系语句就行。
二.编写代码
大概思路理清后依照上面的思路就可以实行编写代码了。在写之前,小编推荐分成三个文件来写,可以极大的使代码整洁,同时逻辑清晰,当然可以实现代码的隐藏。这三个文件就是test.c , game.c , game.h。test.c用来测试游戏,game.h用来写函数的声明和其他命令,game.c用来写游戏的主体部分的函数。
第一步:在test.c文件中,我们需要一个主体main函数和菜单(实现上诉的1和2),可以定义一个menu的函数和game的函数,同时我们多次开始游戏或结束游戏,则需要循环和switch语句。如图:
第二步:在game函数里写游戏执行过程,第一先定义两个数组,第二初始化界面的函数,第三布置炸弹的函数,第四打印界面的函数,第五扫雷的函数,并在game.h中进行声明。
这里用define定义一个常量来充当数组的长度以及雷的个数的好处是便于修改。rows,cols是数组行和列,row和col是扫雷的部分的行和列,mineCount是雷的个数。
第三步:在game.c中,对每个函数进行编写。(注:正确顺序是写完一个函数就测试一次,小编在这里只是集合在一起比较方便)
1.初始化界面
初始化只需两个参数,二维数组arr和字符类型的ch,函数体则是对二维数组的遍历
2.设置雷
这里需要随机生成10个坐标,可以用随机数的生成方法来实现,如图
count接受雷的个数的值,数组接受mine数组,因为我们排查的坐标范围是1~9,因而rand()%row的值是0~8,加上1就是1~9。当然,在生成随机坐标的时候可能重复,所以我们需要用if语句判断后赋值。
3.打印界面
要打印如图的界面
代码如下
4.扫雷
扫雷肯定需要多次进行的,所以要用到循环,输入查询坐标后,用if语句判断mine[x][y]是不是为‘1’,是则结束游戏,不是则调用扫描函数scan_round_mine,将返回值赋给show数组的对应元素,并且计数器count加1。当非雷的位置全被找到,循环的条件就是count<row*col-mineCount。