扫雷游戏的实现
扫雷游戏的实现主要核心是:
- 布置雷
- 设置雷
◎在我们开始前,我们可以在vs上创建个空项目,然后创建两个源文件(一个可以游戏界面的实现,一个可以函数的实现)和一个头文件,以方便写。
但我们可以首先从简单的步骤一步步来实现这个游戏,通常我们玩小游戏,初入眼帘的是游戏菜单。因此,我们可以通过定义一个菜单函数在里面用printf函数实现简单的游戏菜单打印,如图所示:
我们不需要这个界面菜单返回任何值,所以设置为空函数类型
然后,我们想要实现输入1就能进行操作,我们可以使用switch语句来实现,当然,我们不仅仅是输入一次就行,往往需要几次的输入,所以,我们想要多次输入这样的效果,就要用到do while循环,如图所示:
然后开始我们扫雷游戏的下一部分内容,就是创建棋盘(接触扫雷游戏发现基本的是一个棋盘)和初始化棋盘的内容(用0和1分别代表不是雷和雷),棋盘的大小我们可以用9*9的棋盘打印
但是我们可以发现一个问题,当我们打印出9*9的棋盘出来后,后面放置雷,然后访问雷,最后统计周围8个位置的雷的时候,会发现有可能出现越界现象,例如,当我们的棋盘(7,6)是1,(8,6)是0,然后去统计(8,6)周围的8个位置是否有雷,机会出现越界,所以为了防止越界,我们可以在原基础上扩大棋盘,变成11*11大小的棋盘,但是,我们每个人需求不一致,想玩的棋盘大小不一致,所以我们的头文件派上用场了,我们在头文件里进行宏定义我们的行和列,然后在函数实现源文件和游戏实现的源文件里包含头文件,当我们想修改棋盘大小时,就直接在宏定义里修改数值就行,很方便。如图所示:
图上,为什么选择定义两个char数组呢,因为我们我们放的’0’和’1’是字符类型,且两个数组可以方便后面的测试。然后,我们在写chushi函数时,用for循环把arr数组填充,但是我们我们发现,一个chushi函数只能写入一个数组的数据,那我们自然而然想到,那就再写多一个函数,再用for循环一次,但这样太麻烦了,所以,我们在函数调用时,比如像这样chushi(cunlei,ROWS,CLOS,'0'),再写入个‘0’以及‘*’,然后在chushi函数形参中定义个char set来接收‘0’和‘*’,这样就不用定义两个函数了。
现在,数组初始化完后,到了打印棋盘,首先在我们的game函数中再写出一个函数用来打印棋盘,然后在头文件里声明,我这里定义了print函数来打印棋盘,如图所示:
然后在函数实现的源文件中,用for循环来打印棋盘,但是当我们打印棋盘出来后发现有个小问题:
当我们后面选择坐标排雷时,发现要数一下,坐标在那个位置,有点麻烦,所以我们可以在打印棋盘之前选择打印行和列来标记一下,甚至可以加点装饰,代码和效果图所示
接着我们开始布置雷,布置雷同样我们也可以设置个函数放在game函数里面,直接上代码图:
代码里面我们用到rand函数进行随机布置雷,但是rand函数布置雷需要我们调用头文件:#include <stdlib.h>,以及我们要在主函数中写一个随机种子函数(并使用时间戳),但是,我们我们为了简单实现,就随便布置了10个雷,但也不一定都是10个雷,我们也可以修改,所以我们在头文件了进行宏定义easy_count,然后我们只需在头文件修改想要有几个雷就行。同时,在setcunlei函数中,我们定义count布置雷,每布置一次雷就count--,然而,在布置雷的时候,我们也要判断当前是否有雷,没有雷就不布置了,所以用到了if语句。
布置雷后,游戏代码的书写就接近尾声了。最后就是,排查雷环节
,排查雷环节,我们的思路是,用while循环,接着输入你的坐标,当你输入的坐标刚好是‘1’的位置时,就被告诉炸死了,然后打印棋盘,告诉雷的状况,没被炸死时反馈周围有多少个雷,代码如图所示:
同样的我们也要在game函数中再写个函数来实现排雷,然后在头文件里说明。
代码里小细节说明:我们的循环结束实现,可以定义一个变量win,当我们没有被炸死时,win++,一旦我们win>row*clo-esay_count时,说明不符合while循环的条件,跳出循环且用if语句判断是否相等,相等的话,就告诉排雷成功,并打印棋盘。
写到这里,简洁版的扫雷游戏就实现了。