扫雷游戏的分析及设计
一、功能说明:
(1)设置一个简易的菜单用来选择开始游戏和退出游戏
(2)扫雷棋盘默认9*9格子
(3)在棋盘中布置雷 默认为10个雷
(4)排查雷 若某位置不是雷则显示其附近的八个格子中有几个雷
若某位置为雷则被炸死,游戏结束
若除雷之外的所有非雷都可以找出来则排雷成功,游戏结束
二、游戏逻辑的设计
首先要设计一个主程序表明选择开始游戏和结束游戏等一系列操作
然后游戏的具体内容我们通过函数来实现,这样可以清晰地表达出程序结构
那么对于游戏开始,我们首先打印菜单然后通过用户的选择来决定是否开始游戏或者结束游戏,并且如果开始游戏那么在结束时是否要重新开始游戏或者退出游戏
对于这两点功能实现,我们考虑循环加上switch语句
那么主程序代码如下:
主程序代码实现后,我们接下来每个函数具体实现
三、菜单函数menu()
打印一个简洁直观的菜单 将其封装为一个函数
代码如下:
四、游戏内容函数game()
在这里我们创建另一个源文件game.c和头文件game.h 头文件中用于存放函数声明 源文件中用于函数实现 在头文件中将接下来需要的stdio stdlib time全都包含进去 并在主源文件中包含该头文件
分析:我们首先要存放布置雷和排查雷的信息,考虑到扫雷棋盘的形状 这里我们用二维数组合适
然后我们需要初始化数组信息 ,用来布置雷的棋盘初始化为字符0 排查雷的棋盘布置为字 符*表示隐藏棋盘的具体内容 这里需要创建两个数组来表示两个棋盘
接下来我们需要创建一个打印棋盘的函数用于每次排查完后重新打印棋盘更新信息
那么还有最重要的布置雷和排查雷的函数
需要注意的是 :布置雷时我们需要考虑每次布置的随机性
排查雷时我们要注意对于边上和角上的位置其周围不足8个位置,为了写代 码时简便我们需要将其统一,因此将整个棋盘扩大一圈变为11*11 但我们只 排查时只考虑中间的9*9
我们一个一个来看
1、创建数组存放信息
此时ROWS和COLS表示拓宽后的棋盘行和列数 因此ROWS=ROW+2 COLS=C信息 OL+2 同时我们在头文件中定义#define ROW 9 #define COL 9 以及ROWS和COLS
2、初始化数组
对于mine棋盘将其初始化为字符'0' show棋盘初始化为'*'
那么此时我们在game.c中实现该函数具体代码如下:
3、实现打印棋盘的函数
初始化2完成后我们可以打印棋盘观察一下
4、布置雷
通过上面的观察我们发现目前没有问题可以顺利打印棋盘
那么接下来我们需要在布置雷的棋盘上布置十个雷先在头文件中定义雷的个数
为了在不同的位置布置雷 这里我们采用坐标来表述雷的位置 因为此时ROWS和COLS为11
因此我们产生坐标需要在1~9 而为了产生随机坐标需要引入stdlib中的rand库函数以及time库
主函数中加上srand保证每次产生的随机数不相同
布置雷函数
布置好后我们打印出来看一下 确实布置成功且每次产生的坐标不相同
5、排查雷
首先我们可以考虑使用循环来实现一次次排雷
如果某位置不是雷,就显示其周围有几个雷 如果是雷被炸死 游戏结束
如果全部排查完非雷坐标 那么游戏胜利 游戏结束
那么对于循环的次数怎么确定呢?对于每次游戏有9*9个格子 10个雷 那么排查次数<9*9-10就需要继续排查
逻辑如下:
那么在写排查雷的函数过程中我们发现还需要写一个得到非雷周围的雷的个数 因为此操作重复较多所以用函数来代替 这里我们定义为GetMineCount()
因为我们前面定义雷是字符‘1’非雷是字符‘0’ 那么上述操作将返回其周围八个字符减去八个字符0的值 字符1减字符0实际是其ASCII码相减会得到1 因此此方法课统计出其周围的雷个数
那么返回个数以后
我们这里令排查雷的棋盘上的该位置显示这个数字 那么该数字c加上’0‘得到‘c’ 而当初创建的数组均为字符数组因此此处需用‘c’替换 那么该位置显示周围雷个数
五、效果显示
从结果来看,游戏取得初步实现。
六、源代码
上述过程为主程序源代码图 函数实现的源代码在另一个game.c中 上文已全部提及
另外函数声明和定义常量均在头文件game.h中 下面展示:
以上就是此处对该扫雷游戏的简单分析以及尝试,感谢观看!!!