C语言中扫雷游戏的基本逻辑以及部分代码实现

如何写一个经典的扫雷游戏?下面我将简单介绍一下原理:

1.首先需要写一个游戏的基本框架,比如菜单,让玩家选择游玩或者退出;

如图:图二为menu(),菜单,用于引导玩家选择,然后利用do while循环实现多组输入,多次

选择开始或者结束游戏,选择1,进入游戏,选择0,退出游戏,还有数据错误的选项。第137行的

代码有点超纲(对于甚至没有学到指针的人来说)

简单解释一下:就是创造随机数用的,我在后面会讲到其用处

2.进入游戏后,就要开始制作游戏内容。显而易见,扫雷游戏的界面长得很像二维数组吧? 其实也

就是二维数组,于是我们就需要一个数组,就初步定为9*9的吧,然后再初始一下数组,全部

放‘0’。初始化后需要放雷,我们使‘1’为雷。但是放了雷又不能让玩家直接看到,于是我们可以再开

一个字符的二维数组,全部放'*',然后再展示给玩家看。前面这些完成后,就是开始排查地雷。

基本框架如图:

由于排查雷的时候需要排查一个坐标的周围八个位置是否有雷,当排查mine[1][1]的时候,就会越

界访问了, 所以我们在9*9雷区的基础上,再扩展2行2列(9*9区域是有效区域,所以雷布置在9*9

区域),即11*11,这样的话排查1,1坐标时就不会越界,代码实现:

#define row 9       //row,行


#define col 9       //col ,列


#define rows row+2          //为了代码的可移植性,定义为row+2,若直接定为11,要改雷区大小时就

要一处一处地方改


#define cols col+2            //同理

知道以上以后,就可以开始写函数实现,初始化,展示,设置地雷,排查地雷的功能了。

首先1:initboard:初始化

利用循环遍历字符数组所有元素,并赋值set(即‘*’和‘0’);

2:displ : 展示

这也是比较基础的内容,利用for循环打印元素,但是需要注意的是,只需要打印中间9*9的内容,

即 i 和 j 从1开始,到row,col结束。

并且为了展示的可观性,可以在第一行开始前利用for循环输入0-9列号,在每一列开始前输入1-9列

号,并且在打印数组前打印一句话表示游戏开始,实现效果如图所示:

3.setmine 设置地雷

int x = rand() % r + 1;   int y = rand() % c + 1;

          //这两句话的意思是创造随机数的坐标,并且x和y都在1-9之间,前面

说的超纲代码就用在这里、

easy_count是设置雷数量         #define easy_count 10

接着利用while循环,如果雷没有重复给在同一个坐标,就说明此地方没有设置过雷,然后再设置

一个雷上去,然后count自减,最终设置满10个雷

4.findmine 排查雷

首先判断坐标合法性,即坐标是否落在9*9雷区内,如果落在外面就打印重新输入。

如果落在里面,就判断是否落在雷上,如果落在雷上,就炸死了,然后打印雷的布局,让玩家死的

明目一点,然后break打破循环

如果没落在雷上,那就统计该坐标周围的雷的个数,然后打在用于展示的数组上,用雷的个数代

替‘*’,这里用到了total函数:

道理都一样,利用循环查找是否有雷,有雷就记数自增,最后返回计数,用 r 来接收,需要注意的

是循环时 i 和 j 的值,从-1到1,因为是周围一圈坐标的点集。

回归正题,统计完后赋值给用于展示的数组,因为统计出来的数字是整型2,所以赋值时要用

show[x][y]= r + ‘0’;  或者把‘0’换成48。完成一次赋值后令cnt自减,其中cnt是r*c-easy_count,  雷

区总大小减去布雷数,即剩余空间。当cnt等于0时,说明无雷区域全部排完,然后结束循环后来到

if判断语句,符合条件(炸死,cnt不等于0,不符合条件),打印排雷成功。

至此,扫雷游戏的基本逻辑以及部分代码实现就完成了。

这是运行起来的样子:

看起来还是挺简陋的,哈哈,不过会好起来,坚持才是胜利,各位再见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值