一、扫雷游戏介绍
相信现在可以查看这篇文章的人肯定都看过或者亲自体验过吧,下面是一个扫雷游戏的界面,
我们可以看到,每点击一个格子,只要它不是雷,那么就会在这个格子上显示周围8个格子的数量之和,从整体上看,可以将这个排雷界面看成一个二维数组,我们可以用0来表示一个格子不是雷,用1来表示雷,游戏中未点击前的马赛克用‘*’表示,我们知道一个数组的一个元素只能存放一个字符,因此我们需要使用俩个数组来完成这个游戏,我们知道,‘*’是一个字符,所以1和0也应该使用字符‘1’和字符‘0’来表示,以便后续操作。
二、游戏开始界面设计
我们知道,但我们在开始玩游戏时,最先出现在屏幕上的就是选择开始游戏或者退出游戏,因此我们可以设计一个简单的代码表示这一界面,但在开始之前,由于这个游戏所需的代码数量较多,我们不能把所有代码放在一个文件中,因此我创建了test.c game.c game.h三个文件,其中test.c用来进行游戏测试,game.c用来进行具体代码的实现,game.h用来进行函数的声明,具体如下图所示
此时所需的文件已创建好,接下来是代码的实现,首先我们先写主函数,在其中使用自定义函数test进行具体代码逻辑的实现
现在进行游戏开始界面的设计,如图
我们在test函数中调用了菜单函数menu,用来表示游戏开始界面,我们知道,用户在完成一把游戏的时候可能还想再玩一次,并且至少选择一次,因此使用do-while循环会好一点,其中当input=0时,即选择退出游戏时,循环结束,如果选择开始游戏,那么将调用game函数。
三、扫雷棋盘设计及其初始化
具体代码如下:
在这里我们定义了两个数组,以及使用一个函数对这两个数组进行初始化,其中数组的行和列,ROWS和COLS是在头文件定义的,如图
其中ROW和COL是具体显示给用户看的行和列,那为什么要定义ROWS和COLS,使来扩展这个数组呢?前面我们提到,我们在点击一个不是雷的格子的时候会统计周围8个格子的雷的数目,如图:
如图可以看到,如果用户点击的是棋盘边缘的格子,该怎么统计呢?因为这个时候该格子的边缘只有5个格子,为了减少代码量,我,我们可以将数组的行和列都增加2行,但是这两行实际上是不会打印给用户看的,只为了方便代码的书写,如图:
知道了这些之后,以下便是初始化函数的实现:
我们把mine数组全部元素初始化为‘0’,show数组全部初始化为’*‘,至于这里为什要再传一个参数ret,主要是为了减少代码量,因为不传多一个参数,就需要再定义一个函数,一个函数将mine数组初始化为‘0’,另一个函数将show数组初始化为‘*’,这显然比较麻烦,这样一来,数组就完成了初始化。
四、雷的布置以及数组的打印
接下来是布置雷的过程,我们需要思考的问题是如何布置呢?1.考虑到后期可能要更改雷的数目等问题,我们可以在头文件定义一个宏MINE_count 2.考虑到布置的雷应该具有随机性我们可以使用rand函数,但在调用它之前务必先调用srand函数!具体如以下代码所示:
可以看到,我们在setmine函数中完成了雷的布置,其中我们定义了x,y来表示横纵坐标,值得注意的是,我们只需要在9*9的格子里布置雷,而不是在11*11的格子上布置,因此,我们将rand()%row+1就得到了1到9的数字范围,完美解决了这一问题。接下来就是打印棋盘,我们需要将布置好雷的show数组打印出来,当然也可以把mine数组打印出来,方便我们测试,但是到给用户使用的时候就打印mine数组哦!打印数组比较简单,看下面的代码:
五、排雷
接下来就到了最后一步了,排雷,我们定义一个函数getmine来进行排雷,排雷一共分为三种情况,1.用户可能输入不合法的坐标;2.用户可能第一次输入坐标就被炸了;3.如果第一次输入坐标没被炸,我们需要统计周围雷的数目显示在show数组上,在这里我使用了show函数进行统计,下面请看代码:
我们知道,如果第一次输入坐标就被炸,就表明排雷失败;如果排完了10个雷,也就是输入了71个坐标,就意味着排雷成功即如果排雷数达到ROW*COL-MINE_count意味着排雷成功。到这里就意味着排雷游戏已经初步完成了,但是其中也还有许多可以完善的地方,就交给大家了