C语言--简易版扫雷总结

发布时间:2024年01月01日

游戏的大概流程:

  1. 在地图上布置10个雷
  2. 排查雷,是雷,炸死,游戏结束
  3. 不是雷,显示周围雷的个数
  4. 10个雷都排查出来,游戏胜利

代码实现思路;设置两个字符数组,一个表示雷的存在状态,即雷的位置信息,可用字符'0','1',表示,‘1’表示雷。另一个数组则来显示周围雷的个数,当选择的不是雷时,及时进行反馈周围雷个数的情况,便于玩家进行下一步选择。

大概思路

进入菜单,进行选择,选择1,则进入游戏,选择0,退出游戏,选择了其他,则重新进行选择,由于有多条分支所以用Switch语句来实现。此外因为一场游戏结束和选错都需要重新进行选择是否进入游戏,所以在Switch语句外套用do...while循环(选择退出游戏的选项为0,所以选择0后while的循环条件为假,故不进入循环)。

当选择1时,进入游戏,即进入game函数。这里使用define宏定义,定义数组的行和列,以及雷的个数,方便在后续游戏升级时对相关参数进行统一的更改

首先建立两个数组,一个为mine[ROWS][COLS],来表示雷的位置信息,另一个为show[ROWS][COLS]显示周围雷的个数。需要注意的是,在统计周围的雷的个数的时候,容易访问越界,所以将棋盘扩大一圈这就是ROWS=ROS+2和CLOS=CLO+2的由来和原因。

两个数组建立好后,我们需要对数组进行初始化,initboard为自定义的初始化数组的函数initboard(mine, ROWS, COLS,'0');将mine数组初始化为‘0’。initboard(show, ROWS, COLS,'*');将show数组初始化为‘*’。

initboard的代码实现

初始化数组后,打印数组。displayboard为自定义的打印数组的函数。displayboard(show, ROW, COL);想要实现的效果为下图所示,所以首先要打印出每一列的序号所以用到了第一个for循环,i从1开始。之后打印二维数组,用两个for循环的嵌套来完成。

布置雷(雷的个数:EASR_COUNT)

setmine为自定义的布置雷的函数。我们需要随机找10个坐标来确定10个雷的位置,则需要用到rand函数随机生产1到9的数(因为扫雷规格是9*9的),rand()%row得到1到8的数字加1,则x的范围为1到9,y同理。当[x][y]坐标不是雷的时候,则将将其赋值为‘1’,即设为雷。这个样可以有效避免同一位置多次埋雷,导致埋雷的总数小于10.

寻找雷

输入一个坐标,这个坐标要符合扫雷规格在9*9的要求,即x,y在1到9之间。如果输入坐标的对应值为‘1’,则踩中雷,游戏结束。若不是则应显示该位置周围8个位置一共有多少个雷。这里判断周围雷的个数用到getminecount自定义函数,该函数的返回值为周围雷的个数。该返回值赋值到输入的坐标当中。该游戏一共有81-10=71个非雷的坐标。所以需要输入坐标的前提是没有踩到雷和找到非雷的个数小于71,当找到了71个非雷的坐标即游戏成功。

getminecount自定义函数

将输入坐标的周围八个坐标中的‘0’或‘1’转化成整型相加(由于‘0’+1=‘1’所以‘1’-‘0’=1,同理可得),从而得出周围雷的总数。

全部代码展示:

文章来源:https://blog.csdn.net/2302_81705247/article/details/135258884
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。