今天白白要和大家分享扫雷的奥秘,让我们一起去见证自己“制作”出来的扫雷游戏吧~
设计游戏前,我们需要分析游戏的构造
1.要有菜单,让参与者选择玩游戏还是退出游戏
2.要显示出棋盘(以9*9为例)
3.布置雷的位置
4.可以排查雷,不是雷的位置可以显示出周围有几个雷
分析过后我们就开始吧!
设计菜单
在扫雷游戏开始之前,设计菜单让玩家选择玩游戏还是退出游戏,那么我们可以用函数menu来表示,当然玩家进行选择是需要输入东西的,那我们就可以设定一个整型,选择1即参与游戏,选择0即退出游戏。但是玩家不小心输错数字,那我们可以用switch来解决这个问题。
参与游戏需要进入到游戏中,我们就可以用do while,完成一次游戏后,while(input)来判断玩家是否想要继续进行游戏。代码如下
接下来我们就要进入游戏,所以游戏本身的代码全部写在game函数中
设计棋盘
我们以9 * 9为例来设计棋盘。
我们都知道扫雷的棋盘是矩形的,因此我们可以借助二维数组,用数字或者符号来表示盘面。
玩家在玩游戏的时候是看不到雷的位置的,所以可以应用两个二维数组,一个放置雷,一个展现在玩家面前。
如果一个位置不是雷的话,会统计周围雷的个数,那么我们的9 * 9棋面实际上需要11 * 11,这样玩家的9 * 9棋面上的边缘处才不会出现问题。
这时我们创建一个新的头文件来放置我们定义的数字,那么在接下来的代码中只需要输入数字的代号即可。
把main函数的头文件放在我们自己设定的头文件中,那么我们的源文件就可以直接用我们自己的头文件了(我们自己设定的头文件需要用双引号)
初始化棋盘
初始化存放地雷的棋盘,全为0;初始化展示在玩家面前需要排雷的棋盘,全为* ,此时可以借助循环来实现,当然我们还需要用到字符数组。当然初始化的函数中需要包括四部分:数组名、行、列、字符
为了简洁,我们可以增加一个源文件game.c专门存放函数的声明,test.c调用函数,同时在头文件中也可说明一下
(图1:test.c;图2:game.c ;图三:game.h)
设置打印棋盘
打印的棋盘是二维数组,所以可以用for循环来实现,代码如图
(函数的调用)
(函数的声明)
代码运行结果
我们可以看到运行的结果挤在一块,玩家不能很好地输入自己需要排查的坐标。所以我们需要把数组的下标表示出来,同时加入分割线,便于玩家排查。
由于我们自定的数组为11 * 11,但是我们打印出来的是9 * 9,所以在11 * 11中去掉上下左右边缘的行和列,在9 * 9中刚好下标为1~9,便于玩家输入坐标,代码如图
布置雷
在地雷棋盘中,1为雷,0为安全位置
这时就用到了随机数,当然这些随机数(雷)的坐标仍满足1~9,所以让随机数除以9的余数是0~8 , +1为1~9,符合棋盘上标的行和列
然后就要判断生成的雷是否重复,在同一位置,那么就可以运用if循环,当生成的数组元素等于1,则表明重复,则不能进入if循环,如果数组元素为0,则可进入if循环生成雷
当然在9 * 9棋盘中有10个雷,我们可以在头文件定义雷的个数,在后来的代码中就不需要再输入10了,设置了一个雷后要减1,知道10个雷都设置完
排查雷
因为总共有10个雷,所以我们需要排查10个雷,即在9 * 9棋盘中,我们应该输入81-10=71个坐标
当我们排查雷的个数<71,那么我们仍可以排雷,同时不是雷的位置需要标出周围有几个雷
当我们排查雷的个数=71,则我们排雷成功
当排查的位置不是雷时,该位置会显示出周围8个位置有多少个雷
x-1,y-1 | x-1,y | x-1,y+1 |
x,y-1 | x,y | x,y+1 |
x+1,y-1 | x+1,y | x+1,y+1 |
因为x,y都有+(-1),+0,+1,所以可以用for循环来统计
下面我们来看一下整体的代码吧~