写一个简单的扫雷游戏:
代码编写最终实现的功能:
1:打印游戏菜单,让玩家决定游戏开始或结束
2:生成一个9*9的棋盘,在棋盘中随机生成10个雷
3:玩家通过选择棋盘坐标来实现所要排查的位置
4:在玩家选择位置后,在该位点显示周围一圈的雷的个数
5:在玩家排查出所有雷后,显示游戏胜利
首先是打印菜单:
然后,构建让玩家决定游戏开始或结束的程序:
这里采用do-while循环,do-while的好处是,可以先打印菜单,再根据玩家选择决定游戏是否进行。分支我采用的是switch。(别忘了break)
然后就是构建游戏代码了:
思路:
为了增加代码的可读性,我们设计三个文件:
saolei.c (这个文件是为了实现代码的运行)
add.c (这个文件是为了写游戏逻辑的代码,如某些函数等)
add.h (这个文件是放函数的声明,定义等)
其中,我们可以先把add.h中定义一些值和声明一些头文件以便将来使用:
这里提一下#define:
然后就是让saolei.c和add.c两个源文件中包含add.h这个头文件。
1,首先,我们要构建游戏棋盘,用来存放和布置雷
那我们应该用什么表示雷呢?如果用数字,比如用’0‘表示没雷的位置,用‘1’表示雷,那么便会有一个问题,玩家在选择棋盘坐标后,如果该位置没有雷,则会显示周围一圈的雷的个数,显示的个数也是数字,这时怎么分清哪个是雷,哪个是显示周围一圈雷的个数呢?
所以,不应该用数字表示雷的位置,应该用字符,比如字符'1'来表示有雷的位置,字符‘0’来表示没有雷的位置(注意,同样都是1或0,但字符1或0与数字1或0有着实质的区别)
在布置好雷的位置后,需注意,实际玩游戏过程中,玩家是无法看到雷的具体位置的,那么,如何隐藏雷的位置呢?这就需要建立两个二维数组了(即两个棋盘),一个是供玩家看的隐藏雷的棋盘,一个是供电脑判断的实际棋盘。玩家棋盘没被探索的部分则用字符‘*’表示,探索的部分,如果没有雷,则显示表示周围有几个雷的数字,如下:
在创建数组的时候,还有一个问题需要注意:就是将来在排查雷的时候,在排查边缘的位置的周围一圈时,可能会出现数组越界访问的非法行为,这时该怎么办呢?
为了防止越界,我们不妨将棋盘(数组)扩大一些,使它多一层边界,这样访问的时候就不会越界:
想好思路后,就开始创建两个数组:
其中mine是实际棋盘,show是展示棋盘
下一步就是将棋盘初始化,这里不妨写一个专门为了初始化的函数,我这里写做create函数,
既然是函数,那么就要写传入什么值,既要初始化棋盘(数组),那么肯定要传入一个数组,其次要传入棋盘行和列,以及初始化用的字符(如‘*’):把这个函数写到add.c源文件中。
然后便是,给函数传入值:
完成初始化后,下一步便是打印出棋盘,供玩家观察棋盘,便于接下来选择排查雷的位置了,这里我们也创建一个专门为了打印的函数,我把它命名为print:
打印数组也需要数组名,行,列:
由于打印的数组是给玩家看的,所以只需要打印隐藏雷的数组(棋盘)就行:
打印好数组之后,则需要开始布置雷了,那怎么才能随机产生雷呢?那么则需要用到rand函数了
rand函数:
rand:
使用rand函数,则需要包含头文件stdlib.h,rand函数会返回一个伪函数,范围在0~RAND_MAX(默认值32767)之间
而rand函数是对一个叫“种子”的基准值进行运算生成的随机数,“种子”一直默认为1,如果要使种子变化,则需要用到srand函数:
srand:
在程序中用来初始化随机数的生成器,能够使种子变化随机。
可是,这时候便有一个问题,为了生成一个随机数,则需要另一个随机数(就像鸡生蛋,蛋生鸡一样)这个随机数如何去找呢?这就需要time函数了,在程序中我们一般是使用程序运行的时间来作为种子的,因为时间是时刻变化的。
time函数:
time函数是用于获取当前时间的函数,它定义在time.h头文件中。用于表示时间值,一般是从1970年1月1日00:00:00UTC到当前时间的秒数。
因此简单来说,如果想要获取随机值,只需要下面这个公式:
如果我们要生成a~b的随机数,则套用公式:
a+rand()%(b-a+1);
即可。
我们把srand公式加入到saolei.c中:
接下来构建创建雷的函数:(我这里写做bulei)
布置好雷之后,接下来便是让玩家扫雷了,这里再创建一个扫雷的函数,我这里命名为paicha:
这里还需要创建一个函数,是为了检测玩家输入坐标周围有几个雷的函数,我这里命名为tance:
因为探测玩家输入坐标周围一圈,无非就是让输入的数组横纵坐标加或减1:
每写一个函数后,都要把该函数放到add.h里面声明一下。
函数到此就写的差不多啦,最后再检查一下,得到最后的结果:
saolei.c:
add.h:
add.c:
写代码时注意事项:
1:saolei.c 与add.c 都需要包含头文件add.h
1:创建数组的是字符数组,不是整型数组
2:创建初始化棋盘的creat函数里的行和列与print函数,builei函数都不同,因为初始化时,数组为了后续访问时越界,多了两行两列,后续布雷等操作时,不包含边缘的那两行所以有所不同
恭喜你坚持看到这里了,相信你也学会了如何写该游戏了,创作不易,支持一下吧๐·°(৹˃̵﹏˂̵৹)°·๐