用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 ,同样的三部曲,为了能够更直观的知道格子的位置,我们要在第一行第一列加入坐标数字,和 j 都要从1开始,因为我们是在11*11的格式中打印9*9的棋盘,效果图如下

(3)设置雷的函数

1、在 mine 数组中布置雷,并且先用 DisplayBoard 函数验证一下是否埋了10个雷,要在主函数调用一次 srand 。

2、三部曲实现 SetMine 函数,EASY_COUNT 是日后方便更改雷的个数,rand % row + 1 函数会随机生成1-9board[x][y] == '0' 作为限制条件,当发现坐标存放0时,则把存放的0改为1count-1

(4)排查函数和返回雷个数函数

1、FindMine 函数需要在被炸死后显示需要 mine 数组,同时没炸死也需要将 mine 数组的数值传递到 show 数组中,所以需要传递4个变量。

2、FindMine 函数实现需要确保坐标在 9*9 的范围之内,输入其他坐标会提示坐标错误,内部又分两种情况,一种是踩到雷的情况,一种是没有踩到雷的情况,

第一种:打印被炸死的信息并打印 mine 的棋盘给玩家看。第二种:显示该坐标的附近 个坐标有多少个雷。

3、get_mine_count 函数就是用来显示该坐标附近有多少雷,实现原理:将 个数字字符全部加在一起减去 8 个字符 ,就可得到一个数字(雷的个数)。因为 ‘1’ - ‘1’ = 0 ‘1’ - ‘0’ = 1 ,这样就可以将数字字符转化为数字了。

(5)游戏胜利的判断

1、一共有 81 个坐标,我们排查出 71 个坐标且不被炸死,就算游戏胜利。

2、所以当成功排查一次时,win+1 ,直到排查完 71 个坐标,所以while的限制条件如图,红色框的限制条件是为了防止玩家重复排查,导致 win 计算错误。

3、当 win 排查完除雷之外的全部坐标,打印排雷成功并显示棋盘。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值