实现扫雷游戏(超级初级版)

1、引言

扫雷这个游戏相信大家都玩过,也都不陌生。但是这样一个小小的游戏怎么用C语言来实现呢?下面,就由我来教教大家吧。

2、扫雷游戏的实现

为了使得代码更具有可读性,我将游戏框架的实现、游戏内部的实现、各种函数的声明分为三个文件,并都放在一个工程里。以下是我文件的命名:游戏的框架(prime_saolei.c)、游戏的内部(game.c)、各种函数的声明(game.h)

①游戏菜单及基本框架的实现

首先,在运行这个程序的时候,我们想,是否可以先给玩家一个选择,当他玩完一把的时候,如果他不想玩了可以选择退出游戏,或者他还想玩的话可以选择再来一把。这时候就需要我们的程序“可视化”——简而言之,打印一个菜单到屏幕上给玩家选择,玩游戏或者退出游戏。

代码:为了使游戏程序能够不断地运行起来用到了 do...while 循环,那么之所以用 do...while 循环,而不用 for 循环,while 循环,是因为do后面的语句可以先执行,再用 while 后面的条件来判断,恰好满足我们要先输出菜单,后根据玩家输入的值来运行程序的需求。

然后,在使用各种库函数以及自定义函数之前,我们都需要引头文件。但是由于无论是在prime_saolei.c 这个文件里使用各种库函数以及自定义函数,还是在game.c这个文件里使用各种库函数以及自定义函数,都需要引用 game.h(各种自定义函数的声明都在这里面)这个头文件,所以,我们干脆将stdio.h文件的引用放在 game.h 里。

如下:

②game函数的实现

既然是函数的实现,那么肯定是在 game.c 内具体化代码啦。

㈠实现前言

⑴通过观察,我们不难发现,扫雷这个游戏是由二维数组、雷的图案、数字组合而成的。于是,就创建了一个 9*9 的二维的元素是字符类型的数组,然后先初始化为 ‘0’ ,再在里面随机放上 ‘1’ 当作雷。这似乎看上去是挺不错的一个初级的扫雷的实现。但是,通过上面的图片我们可以发现,当没有雷的地区其周围如果有雷,应该在它的位置上显示周围雷的个数,倘若周围只有一个雷,那么显示周围的雷的个数 1 不就和 ‘1’ 相冲突了吗?所以,我们通过多设置一个数组来解决这个问题。

假设说咱要排(2,2)这个地方不是雷,那么应该显示在红框框内的除了蓝框框内的总共有多少雷,这个没有什么特别的。但是,要是排(2,1)这个位置,我们就发现它左边越界了

所以,为了防止越界,我们可以在外面再添一周 “方块” 。

像这样,即便是排查(1,1)坐标,也不会存在越界的情况。

再者,为了使二维数组的行和列在以后方便更改,我在 game.h 这个头文件内定义了行和列。

代码:

第一个数组Mine用来存放 ‘0’ 和 ’1‘ ,第二个数组用来显示给玩家看。

Mine数组的示意图:                                            Show数组的示意图:                  

                       

㈡数组的初始化

 将数组进行初始化操作只需要用到 for 循环即可(不懂的老铁可以看看我上一篇对于循环语句的介绍)。我们首先要清楚操作的对象是数组 Mine 和数组 Show ,其次还有 ROWS 和 COLS(为方便阐述,以下都用 ROWS 和 COLS 来表示 11 行和 11 列,用 ROW 和 COL 来表示 9 行和 9 列),以及要初始化成的内容(否则就只能够初始化成一种样子)。

代码:

首先要在头文件 game.h 内对函数进行声明

其次在 game.c 内对函数进行实现

最后再在 prime_saolei.c 内进行调用(以后的函数实现都是如此)。

㈢数组的输出

既然棋盘都已经初始化好了,那必然是要将 Show 数组打印出来,然后玩家才能够进行排雷。但是,单纯的将数组的内容打印出来玩家的游戏体验感是不好的,为什么?图片如下:

要是这样的棋盘,玩家岂不是每排一次雷就需要数上半天,所以我们要将数组的行跟列都打印出来,如下:

这样,玩家每一次排雷就不需要再数上半天,游戏体验感也会大大提高!

将数组的内容打印出来,与将内容输入到数组内部相似(唯一的不同就是不需要再形参处设置要传过去的字符),所以在此不再赘述,还请读者见谅。

代码实现如下:

声明:

实现:

调用:

㈣雷的随机放置

既然讲究的是随机,那么在此我就得先讲讲 rand 、srand、time 的知识了。

首先,rand 是C语言内生成随机数的一个函数,包含在 stdilb.h 这个头文件里面。

假设有这串代码:

好像这 rand 函数生成的数是挺随机的。但是当我们运行第二次、第三次、第 n 次后发现,居然每次的随机数都是一样的! 其实,在 rand 函数后面的括号里的内容起到了极大的作用,括号内是用来放“种子”的,当括号内没有输入任何东西,rand 会默认这个值为 0 ,所以上面每次输出的数都是跟上次一摸一样,那么我们就需要一个随机数来初始化 rand 的种子,srand 这个函数就是用来生成 rand 函数括号内的种子的函数,可能读者们会有这样的疑问:要生成随机数,但是你这里又需要一个随机数,那不是无解了吗?非也,这个时候就需要请出我们的 time 函数,妇孺皆知时间是一个一直在变化的量,但是,时间的变化又过于有规律,所以,这个时候我们就可以将 time 函数后的括号里给它插入一个空指针 NULL ,即 time(NULL),这样就会生成一个时间戳(时间戳是指北京时间1970年01月01日08时00分00秒起至现在的总秒数),这样每次 seand 生成的种子就会不一样,即每次 rand 生成的随机数就会不一样(随机数的生成范围为 0~32767 ,不同的编译环境下最大值会不一样)。

回归正题,既然要在 9*9 棋盘内的随机位置生成雷,那该雷的坐标肯定不能够小于 1 、大于 9 ,所以我们可以用 rand ()%9 ,让 rand 生成的数的范围在 0~8 内,然后再 +1 ,生成的随机数的范围就是 1~9 了,最后就是将该位置的 ’0‘ 改成 ’1‘。

由于,设计的是最简单的扫雷游戏,所以将雷的个数定义为 10 个。

代码声明:

实现:

调用:

㈤扫雷

前面将准备工作都做好了,现在开始实现玩家扫雷这个操作。

首先,得让玩家输入要排查的位置的坐标,如果输入的坐标不在 ROW 和 COL 的范围内,就要提示玩家:输入的坐标有误请重新输入,当玩家输入正确后,如果该坐标为雷,那么就告诉玩家:很遗憾,你被炸死了!并且结束游戏。要是该坐标没有雷,那么就得告诉玩家该坐标周围有多少雷,当雷排完之后游戏就结束。

代码声明:

实现:

调用:

3、结束语

初级的扫雷游戏的实现到这里就完成了,倘若还有什么不足,希望有高人能够斧正。最后,感谢大家的阅读!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值