用C语言实现一个简易扫雷游戏
一、扫雷游戏规则
1、扫雷为9*9的棋盘,1表示以他为中心的3*3范围内,有一个雷,如果1在边缘位置,范围如图。
2、我们需要从中找到10个雷才算胜利。
二、实现原理
扫雷的实现需要两个数组
1、char mine数组的格子需要以自我为中心地排查他周围的8个格子,位于边缘的格子无法进行排查(如果数组为9*9),所以数组要为11*11的格式方便我们排查,同时
数组也要承担布置雷的职责(雷为1),雷以外的格子则初始化为‘ 0 ’。
2、char show数组则需要展示格子周围有多少个雷,周围有一个雷,数字则为1,两个雷数字则为2,以此类推,没有被点开的格子初始化为' * ',由于mine数组的信息要与show数组的格子对应,所以show数组也必须为11*11的格式。
三、开始实现
(1)实现主框架和菜单
我们需要写一个程序大致的主框架
1、写一个菜单,由于需要用到 printf,所以我们要引入头文件 #include<stdio.h>
2、进入到主函数 int main,首先我们需要创建一个整型变量 input,用分支语句 switch 来判断玩家要选择哪一步,玩家输入1,进入游戏,玩家输入0,退出游戏并跳出循环,输入了除1和0之外的其他数字,选择错误。
3、我们用循环语句 do while 来包裹除了 int input = 0; 之外的所有代码,以便实现多次判断。
(2)创建game程序中的数组、初始化函数、打印棋盘函数
1、 在头文件定义 ROW COL 和 ROWS COLS ,虽然我们棋盘的规格为11*11,但我们在玩的时候只会用到9*9的规格。在 test.c 文件中声明头文件 #include"game.h"
2、我们需要一个函数来初始化我们的棋盘,也就是 InitBoard 函数 ,函数定义三部曲,第一步,在test.c文件中传递所需要的参数,第二步,在game.h中定义此函数,第三步,在game.c中实现此函数。值得注意的是,由于我们要同时初始化数组 mine 和 数组 show , mine 要为 ‘0’,show 要为 ‘*’,所以我们必须要多传递一个参数,也就是 char set。
3、初始化了之后,我们想要检查一下棋盘是否正确,所以写一个棋盘的打印函数 DisplayBoard ,同样的三部曲,为了能够更直观的知道格子的位置,我们要在第一行第一列加入坐标数字,i 和 j 都要从1开始,因为我们是在11*11的格式中打印9*9的棋盘,效果图如下
(3)设置雷的函数
1、在 mine 数组中布置雷,并且先用 DisplayBoard 函数验证一下是否埋了10个雷,要在主函数调用一次 srand 。
2、三部曲实现 SetMine 函数,EASY_COUNT 是日后方便更改雷的个数,rand % row + 1 函数会随机生成1-9, board[x][y] == '0' 作为限制条件,当发现坐标存放0时,则把存放的0改为1,count--。
(4)排查函数和返回雷个数函数
1、FindMine 函数需要在被炸死后显示需要 mine 数组,同时没炸死也需要将 mine 数组的数值传递到 show 数组中,所以需要传递4个变量。
2、FindMine 函数实现需要确保坐标在 9*9 的范围之内,输入其他坐标会提示坐标错误,内部又分两种情况,一种是踩到雷的情况,一种是没有踩到雷的情况,
第一种:打印被炸死的信息并打印 mine 的棋盘给玩家看。第二种:显示该坐标的附近 8 个坐标有多少个雷。
3、get_mine_count 函数就是用来显示该坐标附近有多少雷,实现原理:将 8 个数字字符全部加在一起减去 8 个字符 0 ,就可得到一个数字(雷的个数)。因为 ‘1’ - ‘1’ = 0 ‘1’ - ‘0’ = 1 ,这样就可以将数字字符转化为数字了。
(5)游戏胜利的判断
1、一共有 81 个坐标,我们排查出 71 个坐标且不被炸死,就算游戏胜利。
2、所以当成功排查一次时,win+1 ,直到排查完 71 个坐标,所以while的限制条件如图,红色框的限制条件是为了防止玩家重复排查,导致 win 计算错误。
3、当 win 排查完除雷之外的全部坐标,打印排雷成功并显示棋盘。
- 点赞
- 收藏
- 关注作者
评论(0)