扫雷游戏的实现---数组与函数的结合

最近学了函数与数组,结合已经学习过的C语言知识,就可以写出一个简单的扫雷游戏。

下面分享一下实现这个游戏的过程:

1.游戏菜单的设计:

首先,在开始游戏之前,我们肯定是要能够选择进入游戏,这里,利用简单的if语句判断即可,再想想,将菜单和选择功能(test函数)混合在一起,放在menu函数中,就完美实现了开始游戏和结束游戏的功能;首先,程序进入main函数,接着就到menu,打印选择开始游戏还是推出给用户选择,然后,进入test函数,用于判断用户选择开始游戏还是退出游戏;使用switch语句判断,只需注明开始和结束的值即可,输入1的时候进入游戏,我们将游戏的实现放在game函数中,还需要注意的情况就是当输入的值既不是1也不是0的时候,应该提醒输入错误,重新选择。

2.排雷的实现

我们先来分析扫雷游戏的逻辑,一般的格子是9*9的,也有16*16的;要是将格子数再函数中声明,那么想要扩展游戏的格子数的时候,需要改动的地方就会很多,在这里我们先有个印象,要用宏定义来定义格子的数目;接着在这些格子数中布置雷,雷的数量和格子数的道理也一样;不管是9*9的格子还是16*16的格子,本质上都是同样的数据放在二维数组里,只是需要把雷和空格子加以区别;此处,用0表示空格子,1表示雷,具体原因后面会解释;扫雷的时候,当点到雷的时候,直接就炸死了;但是,没有踩到雷的时候,格子上会有数字,数字表示该格子周围有几个雷;那么,当我们要标记这个格子周围有几个雷的时候,如果直接在原来的二维数组中标记,那么标记的1或者其他(最大是8),和数组中的表示雷的1,就会矛盾,不好加以区分,那么,该怎么办呢?对了,就是创建一个和原有的相同大小的二维数组就可以。还有个问题,排雷的时候,我们在中间的格子排雷,倒是一切正常;但是,如果在格子的边缘,会不会......没错,数组在访问的时候,会越界

在图中,绿色的格子周围有一个雷,但是,蓝色的部分,已经超出9*9的格子范围了,这样在程序中肯定是不行的;这样的话,那就加大格子,没错,加到11*11就可以了。又有个要注意的点了,那我们定义宏变量的时候,就定义为11吗?Nonono,我们排雷、初始化棋盘的时候都只需要排查9*9,这样定义,

当我们需要排雷的时候,就用ROWS和COLS即可,改便格子数的时候也只需要改变ROW和COL,提高了代码的灵活性。

3.游戏函数的实现

进入game函数,定义完二维数组之后,对数组进行初始化,同样,利用函数对这两个数组进行初始化。这里涉及到二维数组的传参问题,当二维数组传参的时候,数组还是原来那个数组,不能做改变,我们需要对11行11列全部初始化,放置雷的数组初始化为’0‘;放置排雷的数组初始化为’*‘

在这里,我们还传了一个参数,用于控制初始化的内容,这样就不用写两个函数分别初始化,用一个参数就可以很好的控制初始化的对象。在这里,可以写一个函数用于打印两个数组,可以打印初始化之前的数组,也可以打印初始化之后的数组,还可以打印当雷布置好之后的数组;

在这里,我们只需要看的是9*9的格子,所以传参的时候,只需要ROW和COL就可以,下面是函数的主体内容;

现在位置已经放好了,就差把雷放进去了,雷的位置肯定是随机的,放十个雷,就要产生十个随机数,下面是随机数的产生;不过,想让rand函数生成真正的随机数,还需要提供一颗随机的种子--“时间”

这样生成的数字就是随机的了,上面布置雷的函数里,我们也只需要9*9的格子将产生的1-9的随机数放在二维数组里,并且将它们的值赋为1,到此,雷就布置成功了,当然了,前面说到的打印数组的函数,现在就可以调用来打印看是否布置成功;

接下来,就是排查雷的函数了,我们要排查的数组是放置雷的数组,但是我们要把排查后的结果放在初始化为*的数组中,所以两个数组都需要使用,不过,还是只需要9*9的部分;

下面让我们来分析排雷的过程,当选择要排查的坐标时,两种情况,要么是雷直接炸死,退出循环;要么不是雷,然后又有两种情况,要么就是这个坐标周围一个雷都没有,打印0,要么是统计它周围的雷的个数,1/2/3/4/5/6/7/8;在此还需要一个统计雷的函数;

统计坐标周围的函数,也需要用到这个数组;

统计周围雷的方法有多种;

这里我们利用确定它周围的坐标,然后再加上一条结论

以此类推,非零数的ASCII码值减去0的ASCII码值就等于它的数值,所以我们再统计坐标的时候,周围有8个坐标,最后减去8*‘0’就可以,注意‘0’相当于48,这里体现为什么用1表示雷,0表示非雷的好处了;这样,就完成了坐标周围雷的统计;当用户输入的坐标已经排查过的时候,给出提示,这样的话,只需要再加上if(show[x][y]=='*')这样的语句就可以,因为当这个坐标的值不是'*‘的时候,就已经被排查了,那要是用户输入的坐标超过了1-9呢?对,那就添加if (x >= 1 && x <= row && y >= 1 && y <= col),else就提醒用户重新输入即可;那么,当所有非雷的坐标都已经被排查了,如何结束游戏呢?添加flag(再代码里用的是win),当排查的坐标不是雷的时候,就加1,9*9=81,共有10个雷,那么当win=81-10=71的时候,就可结束游戏,while(win<row*col-thun),当满足win小于9*9-10的时候就可以一直排查雷;注意,在这里,当游戏成功的时候也可以利用打印数组的函数将雷的位置给用户看,同理,要是用户被雷炸死的时候,也可以给用户看雷的位置。

下面是函数的声明:

到此,这个简单的扫雷游戏就完成了!!!!!!有不和逻辑的地方,欢迎大家指出,学习C语言加油!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值