手搓简化扫雷游戏(包含多点展开)

        相信大家都玩过电脑上的扫雷游戏,下面就让我们用c语言中关于函数,递归,分支语句以及二维数组的相关知识来制作弱化版的扫雷游戏。

        首先,为了方便我们我们先创建三个文件,分别命名为 game.h 、game.c 、 text.c ,其中 geme.h 用来存放我们游戏相关的函数的声明,game.c  用来写我们游戏相关函数的主体,而 text.c则是用来放置我们用来测试游戏的主函数。

        然后就是创建一个普普通通的主函数,用来测试我们的游戏

        接下来,让我们来把测试函数进行完善

        这就是我们测试函数的内容了,先写出一个死循环,在其中放入我们的菜单函数,然后用变量 input , 来接收玩家看到菜单后的输入内容。就简简单单给出两个选项,选 1 或 2, 如果选 1,就进行游戏,并且在游戏结束后利用循环再次弹出菜单供玩家选择;而选 2 就直接退出游戏,并且跳出循环;如果输入的内容不在这两个选项中,就提示玩家输入的内容不合法,并且利用循环让玩家再次选择。

        然后就是完善菜单函数和游戏游戏函数了,我们先做一个普普通通的菜单

        接着我们就开始做我们的游戏函数了

        首先,我们先创建两个二维数组,来当我们的扫雷棋盘,为什么是两个呢?目的就是为了把具有地雷位置信息的那个棋盘藏起来(下面就叫它里棋盘),给玩家展示另一个我们想要给玩家看到的棋盘(下面就叫它表棋盘)。这边我们就把 mine 数组来作为里棋盘,show 数组作为表棋盘。其中的 N 表示的是我们要展现给玩家的方形棋盘的大小,至于为什么要加 2 ,后面会讲。

        然后我们就写一个初始化函数分别把我们表里棋盘初始化为我们想要看到的样子。让里棋盘中的内容都变为 '0', 表棋盘的内容都变为 '*'。

 

这个是初始化函数的内容

        接着创建一个布置地雷的函数,用来往里函数里布置地雷。

        这是布置地雷的函数,我们用 '0' 来表示该位置不是地雷,'1' 来表示该位置是地雷。

其中的 mine_num 表示的是要安放的地雷的数量。

用库函数里有的随机数的函数来为我们创造从1 - N 之间的随机的 x 和 y,这样就可以得到随机的坐标,可以随机的安置地雷了。因为随机坐标可能会重复,所以只有这个随机的位置原本是 '0' ,才计数一次,一直循环到安放的地雷达到目标数为止。

因为随机数函数要有 srand 函数来一直改变它的随机种子,但是又不用每次函数时都加srand, 所以就把srand放在 test 函数里。

        接着创建一个打印棋盘的函数,来打印一次表棋盘来给玩家看。

        这个是print函数的内容,它会打印出给它的二维数组的棋盘样式,第一个 for 循环是为了打印出列号并附带小空格,第二个 for 循环的作用是打印出行号和二维数组中的内容并附带小空格,让棋盘看起开方正一点。

至于其中的那个打印美化,是为了当 '*' 变为 '0' 时,给它打印成空格,不然一堆 0 让人看的头晕。

这就是有美化后的效果,当然这是已经完成了全部函数后的效果(已经有了电脑上的扫雷游戏的样子)

        然后就是要达成玩家操作,程序给出反应的目的。首先我们先创建一个有返回值的函数player。

        先讲一下我们设计游戏的基本想法,和为什么要定义大小为[N+2][N+2]的数组而不是[N][N]。在之前我们往初始化的里棋盘中随机放置了mine_num个'1',这些'1'就代表了地雷,我们要达到的目的是玩家给出一个位置,如果这个位置是雷,就失败并游戏结束,如果不是雷就返回该位置周围一圈的雷的数量。如果玩家给出了一个在边缘的位置,我们要查它的周围一圈是否有雷,如果大小是N,而不是N+2,那么边缘位置周围的排查就与不是边缘位置的周围的排查有所不同,就比较麻烦,我们只要往外再加一圈的位置,玩家给出的位置其实就是下图的非黄色部分,在排查的时候,计算各个位置的周围雷数的方法都一样,就比较方便。

下面就是player函数的内容(很重要的函数)

首先设计一个循环,输入我们要排查的位置,x, y,如果该位置没有问题,就跳出循环,反之,就提示玩家错误,并再次要求输入。

然后,如果该位置是地雷,就输出失败信息,然后返回-1;不是地雷,就对该位置周围的雷数进行计算,写了一个help函数。然后判断玩家是否获胜,如果获胜就输出获胜信息并返回1。否则返回2(这个 2 只是为了保证一定有返回值)。

下面是player内部有的函数。

这个就是help函数(需要仔细想想)

        help函数是基于一个个click函数(可以先看下面的click函数),达到扫雷游戏中点击一个位置,解锁一片区域的目的,这是一个递归的函数,一进入该函数就先判断,只要该位置为'*',就click该位置,(第一次该位置必定是'*',该判断的意义在于,不对已经click过的位置进行再次操作,否则会浪费时间,甚至于出现死递归的情况,即有两个相邻的两个位置为'0',二者就会不断的进行递归)如果该位置的结果为'0',就通过递归来操作它周围一圈的位置。

这个是click函数

        因为表棋盘和里棋盘的各个位置有着相对应的坐标,应为能到此处的位置都不是雷,所以就直接计算它周围一圈的位置的'1'的数量,再把这个数量的信息变为字符形式,给它存到表棋盘中。

这个是Ifwin函数

判断表棋盘中'*'的数量,如果数量等于mine_num,就返回1,即获胜(因为点击后,如果剩下的'*',等于mine_num,表示雷都被找出来了,玩家还没有被炸飞),反之就返回-1(只是随便返回一个值,我们主要看的还是返回的1)

        我们再回头看我们的游戏主函数

player的内容已经完成,用result来接收它的返回值,返回1或者-1,代表成功或失败,都要打印地雷分布图,并跳出循环,否则就再次打印表棋盘,让玩家再次扫雷,如此直到成功或者失败。

到这里,我们这个简陋的扫雷游戏已经结束了,不过要记得在game.h的头文件中记得加上各个函数的声明哦!

其实还有可以添加的游戏模块,如插旗等,这里就不再多说了。

最后的最后,记得点赞加关注!!!😊

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值