前提概要:本扫雷未实现自动展开功能,此功能需要用到递归,待深入学习后可以尝试实现。
扫雷游戏1.0的功能说明:
• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 可以排查雷 ◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束 所有⾮雷都找出来,排雷成功,游戏结束
2.0拓展:
1.实现难度选择(三个难度:
简单9*9棋盘,10个雷
◦中等16*16棋盘,40个雷
困难30*16棋盘,99个雷)
2.不断的输出执行回产生很多输出字符,且字符移动不适宜长久游玩。故试图加入静态优化。
正文:
1.理论分析
扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些 信息。很容易我们就会想到用二维数组去存储信息。假定在雷场数组mine中,“1”为有雷,”0“为无雷。
这样,我们就可以通过1与0去判断是否有雷。
但是我们肯定不会向玩家展示雷场真实情况,此时我们需要另外一个同大小的数组show,作为展示雷场,全部用”*“号覆盖。在玩家排雷后又展示周围雷数情况。所以为了方便,数组类型均采用字符为好,避免强制转换带来的麻烦。
mine雷场信息像这样:
show展示雷场像这样:
在判断雷数是,会采用右图的机制,寻找所选坐标周围8个位置里的雷数并反馈。 但是存在一个问题,那在边缘的位置会有越界,需要再加判断,程序冗杂。 所以,我们可以在原有数组上在加大一圈并全部填充0,这样就解决了越界问题。
我们整体的流程如上图:
然后我们将函数声明放在名为“game.h”的头文件里,函数定义放在“game.c”的源文件里。
最后在“start.c”源文件中调用自定义头文件:
就可以先写出大致步骤,然后再去深入细化函数。
我写的扫雷2.0源码:Game_study——SaoLei · 有栖未花/历程 - 码云 - 开源中国 (gitee.com)
随机布雷就用rand还有srand就好了。
关于难度选择影响变量,我们只需要在头文件里声明,在game.c文件里判断并赋值全局变量,然后再在start.c里用extern调用外部字符就可以在三个文件中统一变量。方便好用。
视图优化就引入
然后就可以调用
删掉前面没用的视图。完成视图静态,不会上下乱窜。
这里公开代码原图,供参考:
start.c:
game.h:
game.c:
最终效果: