小游戏(2)扫雷游戏
一、简述
鸽子的时间太长了,其实学完数组和函数就应该搞出来这个丐版的小游戏了,不耽误,反正总归是轮到了,嘻嘻。
二、依旧菜单\.
我们这里写的是一个丐版的扫雷游戏,难度就固定了,所以菜单写起来就是玩游戏和退出游戏两个选项。
三、扫雷的主逻辑
1.主函数
主函数没什么好说的,无非就是让用户选择玩还是不玩,玩完一次以后是否要继续,最重要的是扫雷的逻辑。
2.扫雷的逻辑
扫雷游戏就是一个棋盘,其中有数字和雷,数字显示的是九宫格以内雷的个数:
所以现在我们要创建一个棋盘,最开始的时候什么都不显示,每选择一个坐标去排除就显示相应的信息(周围的雷的个数)。
创建的棋盘的每个坐标都是一个取值,既然类似于二维平面的坐标,那我们就用一个二维数组来储存这个信息。
最开始的时候应该是一个雷都没有的状态,我们应该随机去设置雷,说到随机设置肯定离不开之前写猜数字游戏的时候用到的rand函数,rand函数又离不开srand函数,srand函数的参数我们给的又是time这个函数。
这里就说出来了两种棋盘,一种是布置好雷的棋盘,一种是我们在扫雷过程中看到的棋盘。
扫雷过程中看到的棋盘应该是由本次扫雷给出的坐标然后统计出九宫格内的雷的个数。
需要注意的是边界统计雷个数:
这个位置不够九宫格,如果正常数的话,肯定会存在越界的情况,所以我们将来为了不越界,干脆多初始化两行和两列,只不过最外面那一圈不布置雷。
扫雷过程中有以下几种情况:
1.扫到雷了,被炸死了。这种情况下游戏结束,并给出布置雷的信息。
2.没有扫到雷,展示该坐标九宫格内雷的个数,游戏继续。
3.扫完了所有不是雷的坐标,游戏成功。
接下来一步一步来实现。
四、创造所需几种棋盘
1.初始化所需棋盘
2.布置雷
在说逻辑的时候说有一个重要的特点就是如果扫的不是雷,显示的是四周雷的个数,如果我们到时候需要计算的话,布置雷的棋盘应该以0 1来实现,因为这样的话方便后续计算并展示。
为了后续方便统计雷,特别是边界的雷,假如我们最后要9×9的棋盘,就扩成11×11,即:
只要最外面这一圈不布置雷就行,即1~9行和1~9列内的元素才有可能赋值雷
这么实现:
并且为了美观,咱们把雷的位置记录下来,并且用'*'来展示,毕竟你为了好实现,0代表没雷,1代表有雷,但是展示的时候还是得展示的好像我们埋的就是雷:
布置完雷以后展示一下,将要被排查的棋盘,为扫雷做准备:
3.排查雷
布置好以后就可以让人开始排查雷:
这里就是我们所说的,坐标有效,如果是雷怎么办,如果不是雷怎么办,哦对,还得防止坐标被反复排查:
即在判断坐标有效后又加一判断,判断是否排查过。
相信眼尖的人已经注意到了,在这段代码中还有两个地方,while循环的条件还未去设置,另一个是不是雷,要展示这次排查出来的坐标九宫格内雷的个数。
循环条件暂时没想好,先管九宫格这个,这个有头绪:
只要将这八个坐标里的值遍历一下数数有几个就可以了,注意,我们初始化的时候给的可全是字符(因为展示的也是字符,索性都字符二维数组了),所以可以根据ASCII码的差值来:
'0'-'0'为整型0,'1'-'0'为整型1
其实很懊恼,我们写这个while循环是为了一个一个遍历整个棋盘,什么情况下就停止呢,当然是正常遍历完,正常遍历完是整个棋盘的大小减去雷的个数,故条件为:
五、细节处理以及不足之处
1.坐标难看
这个难看可不是不好看,而是不容易看,所以加上行号列号,便于扫雷:
2.测试运行的时候的bug
写的时候
返回的个数正好是九宫格内整数的个数嘛,但是运行不出来,因为:
show数组是一个字符类型的数组,如果直接将int值传过去的话,将会导致不能展示出来个数,因此:
用字符0强制给它凑出来。