2.棋盘的初始化
二维数组创立好后,我们首先要对两张棋盘分别进行初始化,这里我们就要构建一个初始化函数,我命名为defineboard,函数要传入二维数组本身,以及我们的RWOS和COLS,我们既然初始化就要对整体的11*11初始化,在前面也提到这个事情,这里我们定义第一张游戏棋盘的空格全盘由*来初始化,第二张则是由0来定义,用1表示雷,注意,我们这里的’1‘,’0‘ ’*‘都是字符,这个要记住,后面很重要,先留一个悬念。函数内部的写法如下:
注意,我们要在头文件内部也声明一下
注意我们传参的对象是,数组,行列的整数以及一个字符,这里这个字符很巧妙,因为这样我们就可以灵活传入0 1或*,只需要写一个函数即可实现 。
这些都写好后,我们游戏函数就写好了创建的过程
再次拿出这张图,我们接下来就开始打印棋盘
3.打印棋盘,在我们创建好并初始化好棋盘之后,我们就要打印棋盘了,打印之前,我在棋盘创建的结尾说到我们玩游戏时要利用的是第一张*棋盘而不是带有数字的棋盘,所以,我们这里构建好打印函数后首先要打印*棋盘 ,我这里构建了一个printfboard函数用来打印棋盘,我们输入的参数还是二位数组showboard以及行和列,值得注意的是我们这里输入的就是9*9了,因为我们打印出来的结果就是9*9,函数内部主题如下
首先我们要在函数开始和结束打印出两行分割线,,然后利用双循环来依次打印出我们的棋盘的所有位置的字符,注意我这里是从1开始到row结束,同时你要注意我传入二维数组的行数和列数,是ROWS和COLS,这就为我提供了最外层一个空行,空行除了用来放字符0,也可以用来标识行号和列号,比如我的第一个循环i从0开始,与后文的循环i,j从1开始,这样就完美的不仅避开了串行也实现了对应标识,效果如下:
打印完第一个棋盘,我们就进入下一步,布雷。
4.布雷:
在扫雷游戏中,布雷是随机的,也就是说,我们需要构建一个随机的行和列的生成的程序,使雷可以在9*9的棋盘上随机散步,联想到之前学过的猜数字游戏生成的数字的方式,我们这里也采用相同的方式:如图:
利用srand函数,传入一个时间戳的随机参数,从而构建一个随机数的种子,然后:
我们创建一个布雷的函数setboard,同样传入二维数组和行列,在这里我们打算布置10颗雷,如同ROW和COL一样,我们也在头文件中将其10定义为BOOM(在这里我不演示了,就像图中显示的一样,我们这里利用while循环,同样利用count从BOOM到0自动跳出循环的特点,在循环内部生成10颗雷,用rand()%row+1和rand()%col+1来随机一个1到10的随机数,这样,我们的布雷函数就写好了。
在布雷的后面,我在这里加上了一个打印雷区布局棋盘的函数(其实没必要,我主要是为了测试游戏的运行逻辑,你实际上不用写这个函数,只打印*棋盘即可)
在布雷结束后,我们就即将进入最后一个步骤,即排查雷和判定游戏结果。
5.排查雷和判定游戏输赢:
我将排查雷的函数命名为cleanboard函数,在这个函数内部,我们就需要两个棋盘都要打印了,因为游戏结束时无论输赢都会将布雷棋盘显示出来告诉玩家你踩雷了。函数内容如下:
由于这里要求我们输入坐标,所以我们默认scanf输入x和y作为行和列,那么对于输入者,我们除了输入规定的坐标外,还有可能输入坐标范围外的坐标,所以我们这里首先考虑两个大的分支,即在坐标范围内和在坐标范围外,就如同我写的else语句情况,首先确认如果输入到坐标范围外,即输出无效的输入,倘若输入坐标范围内,我们就考虑踩雷和不踩雷两个分支情况:1.假设踩雷,即你选的坐标对应的为字符’1‘,那么输出踩雷语句同时引用打印棋盘函数将雷区棋盘打印出来,游戏结束下一轮开始。2.假设没踩雷,那么我们就要扫描这个坐标为中心的3*3范围内有几颗雷并将数目以字符串的形式显示在你选择的坐标对应的位置上,比如有3颗雷,则这个位置对应为3,如果你71颗空位都选出来,则判定游戏结束,输出成功语句,进行下一局游戏,对于这个71个空位,我们采用循环的形式,也就是定义一个win变量初始化为0,每成功一次就加一,直到加到等于总格子数减去雷数即判定玩家成功,并显示雷区棋盘。
以上就是我们这个函数执行起来的逻辑,下面我们来详解。
a.对于如何将字符变为对应的3*3范围内对应的雷区个数的字符,这里我们提供一种方法,首先,我们要明确一个概念,C语言中,每一个字符都对应一个ASCII值,相应的字符串相减得到的结果是其ASCII值相减的结果,例如’1‘-’0‘就等于1,因为’1‘与’0‘ASCII值差1,同理,一个字符加上对应的整型也相当于ASCII值去参与运算,从而得出一个ASCII值对应的字符,有了这个概念,我们就这样实现雷区的显示,首先在没踩雷的分支语句内构建一个函数research,我们输入参数为雷区棋盘和我们输入的坐标x和y,然后进入函数内部,如图:
我们在这个函数内部,让它返回一个整型,其目的是与’0‘相加得出一个对应的字符来显示雷的个数,我们让这个函数返回以x和y为中心的周围3*3格子内的对应的字符分别于’0‘相减从而得出一个总的ASCII值,这样我们就成功的实现了显示雷区的操作。
最后一个函数构建完毕后,我们的扫雷游戏就可以正常运行了!很简单是不是?但这个小游戏依旧有很多值得优化的点,比如插旗,如何让空白区展开,如何设置不同难度的棋盘,如何实现积分表,这些东西都值得大家探索,希望大家可以自行去实现。
游戏运行实测: