用C语言实现一个简易扫雷游戏

举报
昔皮笑脸 发表于 2023/06/28 20:05:01 2023/06/28
【摘要】 制作一个简易扫雷游戏

一、扫雷游戏规则

 

 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 COLROWS 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改为1count--

(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 排查完除雷之外的全部坐标,打印排雷成功并显示棋盘。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。