从零开始实现扫雷游戏

1.建立初始菜单并实现菜单的循环与结束

       这是一个雷数为10,9*9大小的扫雷游戏.

        在游戏开始写之前,首先需要一个能够互动的界面,之后再在其中增加内容。

这是一个简单的打印操作

可以通过定义一个函数来实现,也可以直接在主函数中打印,但是为了显得主函数简洁,这边选择的自定义函数。

        这之后需要做的是:输入1时游戏开始,输入0时游戏结束,而输入1游戏结束后能够再次打印游戏菜单界面。对此需要一个循环,能够做到先执行再判断循环条件,即do-while循环;而要实现选择1or0or其他的操作既可以用if分支也可以用Switch分支,这边选择了switch分支.

写完这些后就得到了一个可以互动的界面.

2.建立棋盘并进行初始化

        好了,现在有游戏界面了,现在要向游戏中增加内容——自定义函数test。

        test中几乎集合了所有的功能,第一步就是建立并初始化棋盘.

        建立棋盘是两个简单的二维数组创立,一个是明面上的棋盘,可以表现棋盘的变化,另一个是暗地里的棋盘,是在游戏开始就固定不变的。

        在建立二维数组的时候可以发现是使用了#define的,

        使用更大范围的ROWS和COLS,是为了保证棋盘的坐标的选择从1开始从9结束,避免了数组的越界,而使用#define是为了在后续改变棋盘大小时只需要改变define后的数字,避免了大量参数的修改.

        接下来就是初始化棋盘,使用到了自定义的Reset函数.

        这是一个for循环嵌套给二维数组赋值的函数,会将提供的字符全部赋值到数组中.

        对两个数组分别赋值字符0和*后就完成了数组的初始化.

3.在游戏中展示棋盘

        为了能够看到我们初始化的数组,我自定义了一个Present()函数.

        这个函数能打印9*9范围的数组,而不是11*11.

        但是这并不方便对于坐标的提取,于是对Presen()函数需要一定的修改.

        第一个部分在循环外,打印的是一行0-9;第二个部分在循环内,实现了从循环开始,在每一行开头加上一个序号。

        便于在游戏中选取坐标。

4.在棋盘中随机放置地雷

        

        这是打印出来的mine数组,现在需要在这个数组中随机选定10个“地雷”记为'1'.

       这时候利用随机数,来保证选取的随机。

        这一行将随机数与时间挂钩,确保了无序的随机.

        此时也照例对雷数使用一个define.

        自定义一个在mine数组中设置雷的函数,x和y分别余ROW和COL使得x和y的范围在0~ROW/COL-1但是+1后就变成了1~ROW/COL,while确保地雷的数量只有10个,而if保证地雷不重复放置造成雷数小于10。

        以上就完成了地雷的布局

5.选择未扫雷地区并判断是否有雷

        自定义一个函数Select(),来判断输入的坐标

        抛开循环条件不谈,先让循环走起来,外层if控制数组取值正确与否,内存if判断地雷与否,并进行游戏结束亦或是格子展开的操作。如果选择的地方为'0'那么则需要改变show数组的对应位置为周围雷的数量.那么如何知道这一点?

        定义函数Undermine(),返回值需要char类型,将坐标为(x,y),周围的八个格子全部减去'0'再加上一个'0',我们可以得到一个字符数字,而这个数字就是周围的雷数。打个比方就是,假设周围有一个雷,即'1',那么七个'0'一个'1'减去八个'0',会得到一个1,此时再加上'0'就会得到'1'.

        于是我们返回地雷的数量来替代arr2数组,即show数组,中的对应值.

        就有了如下效果.

6.获胜原理

        为了循环,我们选择了while死循环,但是如何判断胜利呢?

        这个是一个9*9的棋盘,有10个雷,为了胜利,需要翻开71个空位,那么这时候,我们可以定义一个win初始化为0,当我们每翻开一个非雷的位置,win+1,直到win=71时,必然是胜利的。所以可以有以下修改

        但是由于这个扫雷游戏略显简陋,如何证明游戏能够正常获胜呢?

        此时可以把雷数设置为80个

        并且展示我们隐藏的mine数组

        运行代码我们就可以见到

        此时我们就可以选择唯一一个空位。

        游戏能够正常结束,这说明代码正常运行,扫雷游戏也就写完了。

        虽然说还能增加其他功能像是一次性扫开一大片,亦或是选择难度,可惜学习程度不够目前只能写到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值