目录
- 前言
- 一. 扫雷游戏介绍
- 二. C语言扫雷游戏的设计
- 三. 扫雷初阶实现
- 四. 扫雷进阶实现
- 五.完整扫雷进阶代码
-
- test.c文件
- game.h文件
- game.c文件
- 结语
前言
扫雷游戏整体的代码架构和我上一篇写的n子棋的实现差不多,都是分为game.h文件,game.c文件和test.c文件来写的。这一篇主要讲在C语言中扫雷游戏的设计和扫雷进阶的实现,不过多阐述语法知识。
一. 扫雷游戏介绍
扫雷游戏是一种单人益智游戏,玩家需要在一个方格矩阵中找出所有的地雷,同时避免触雷。游戏开始时,玩家需要选择难度级别,不同难度级别的方格矩阵大小和地雷数量不同。游戏中,玩家可以通过点击方格来揭开它们,如果揭开的方格上没有地雷,则会显示周围八个方格中地雷的数量,如果揭开的方格上有地雷,则游戏结束。玩家需要根据周围地雷的数量来推断哪些方格是安全的,哪些方格可能有地雷,最终找出所有的地雷并标记它们。游戏的目标是在最短的时间内找出所有的地雷。
二. C语言扫雷游戏的设计
- 在玩家开始扫雷之前就要把所有地雷的位置信息存储好,所以需要一个二维数组存储数据。把有雷的位置设为字符 ‘1’,没有雷的位置设为字符 ‘0’。
- 玩家扫雷时,为了避免在同一个界面里显示周围八个方格中地雷的数量1与地雷的位置1产生矛盾,我们使用两个二维数组,一个二维数组存放雷的位置信息,另一个二维数组存放排查雷的信息(周围雷的数目)。为了让两个数组的信息方便产生联系,可以把两个二维数组定义成一样的大小。
- 在玩家排查到一个边缘的非雷的位置时,为了防止在统计周围雷的个数的时候越界,可以让玩家能操作的扫雷界面比整个存放排查雷的信息的二维数组小一圈。比如玩家能操作的扫雷界面是9乘9,那么二维数组的大小需要定义11乘11的大小。
- 存放雷的位置信息的二维数组可以都初始化为字符 ‘0’,存放排查雷的信息可以都初始化为字符 ‘#’(这里都初始化为字符数组,初始化什么字符可以选比较适合的,为什么这里要初始化为字符‘0’到后面的代码会体现这样定义的到处),所以可以定义两个同样大小的字符数组。
5. 我实现的扫雷玩家需要输入坐标来排查某个位置,为了缓解输入坐标前要一个一个数格子,希望代码运行时能让玩家看到界面旁边的横纵坐标。
有了上面的想法,就能写一个初级的C语言扫雷游戏了。
三. 扫雷初阶实现
game.h文件(包含库函数,由#define定义的常量,游戏函数的声明):
game.c文件(游戏函数的实现):
测试(设MINE为3,ROW为5,COL为4):
java扫雷基础原理
通过本次测试可以发现:右下角明知道都没有雷却要一个一个输好几个坐标,这还是5乘4界面的情况下,太麻烦了,能否像下图真正的扫雷游戏一样,排查了一个非雷的坐标,就能够打开一大片?进阶实现就讲它。
四. 扫雷进阶实现
- 玩家排查的这个坐标不是雷。
- 这个坐标的周围也没有雷。如果这个坐标的周围有雷,就停止扩展。
举个例子:比如我排查了下图中用红框框起来的地方,它满足上面两个前提条件,向外扩展到周围8个坐标。
但是在周围8个坐标中的任意一个,排查周围是否有雷,一定会再次排查到最开始的坐标(黑色圆圈框住的坐标),如果一直排查最开始的坐标会进入死递归。所以还要再加一个条件:
3.该坐标还没有被排查过。
通过上面的三个条件,就能用递归实现这个功能了。
对于解决这个问题的函数,我取名为Extend函数,我的代码实现如下:
既然已经不是一个一个排雷了,那FindMine函数里不能直接记录玩家排雷的方格的个数,我再写了一个Judge函数判断玩家排雷排的是否只剩雷了。
其他地方的代码与扫雷初级实现一样。
代码测试(设MINE为5,设ROW和COL为12):
五.完整扫雷进阶代码
test.c文件
game.h文件
game.c文件
结语
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1892.html