一、游戏介绍及规则
规则:当排查的方格有雷,则直接被炸死,游戏结束;
当排查的方格没有雷,则显示周围8个方格中雷的个数;
当排查的方格周围的方格中也没有雷,则显示该区域,从而展开一片区域(由于是简易版,这一步不实现)
说明:本博客实现的扫雷是9 * 9区域,雷的个数为10,用NUM表示,行数用HANGS,列数用LIES
二、游戏的整体框架
对于这个游戏,我们首先需要一个菜单能够让玩家知道如何开始或结束游戏,例如:
在此基础上,我们需要能够使玩家重复游戏,那么就需要使用循环,在这里我使用了do-while,确保执行程序时能够打印出菜单让玩家判断是否游戏,这里我们可以用一个变量input接受玩家输入的数据,代码可以这样写:
在这里使用了switch为了应对玩家的任何输入,而game()函数中就是我们扫雷游戏的核心代码。
三、核心代码讲解
1. 雷区初始化
首先,在布置雷区之前,我们要思考一下用什么来表示有雷,什么表示没有雷,在这儿规定:'0'表示没有雷,'1'表示有雷,这对后面排查雷区有所帮助。由于我们雷区是9 * 9的,很自然会想到使用char leiqu[9][9]表示雷区,但这有个问题:当我们排查雷区时,在边界的方格怎么排查,单独再写额外的代码吗?
就像这样,排查红圆圈的方格,都没不是我们自己的空间,不能使用,而额外写代码太复杂,所以我们不妨在最外面加上一圈方格,这些方格不放入雷就能完美解决我们的问题:
所以,我们需要将前面的leiqu[9][9]变为leiqu[11][11]。
对于雷区的存储空间我们弄好了,但展示给玩家的是遮盖的雷区,所以我们需要在创建一个二维数组用来给玩家查看的,char show[11][11],规定使用‘*’遮挡。
接下来就是如何初始化雷区了:
由于要初始化两个数组,里面元素的值不一样,所以要能传一个char型参数来进行不同的初始化:
2. 雷区布置
在布置雷区时,我们需要对随机的行,随机的列的方格布置雷,而这随机数怎么得到呢?
接下来介绍两个函数:rand()和srand(),这两个函数会提供为随机数。
这是这两个函数的官方介绍,感兴趣的可以深入了解一下,在这我进行简单的介绍。
这两个函数都是定义在 stdlib.h 这个头文件中,所以我们使用这两个函数需要包含这个头文件。
rand()括号中可以放入整型的数,作为函数的种子,而且只要在第一次使用给种子即可;在每次运行程序时,如果种子都相同,则会得到相同的随机值,这叫做伪随机。
这两次的随机值很明显完全一样。
srand()会将括号中的数值作为种子给到rand(),这样,rand()括号中就不用放值。
要能获得真正的随机值,这就需要种子每次都不一样,这里再介绍time()函数,每秒钟time()返回的值都不一样,time - C++ Reference 这里是time()函数详细介绍,这不过多介绍。
有了随机数后,我们只需要知道布置雷的个数,然后循环获得随机值并布置就行,对于在相同位置重复布置,可以加个if语句判断该区域是否布置了雷区,即leiqu[h][l] == '1';
3. 展示雷区
将雷区进行展示很简单,只用将二维数组中的元素的值打印出来即可,但我们可以给与玩家一点小便利,例如:将雷区的行数和列数标记到旁边,方便玩家输入要排查的方格。
展示一下雷区leiqu和给玩家看的show:
4. 排查雷区
接下来就是最关键的排查雷区。
首先,再让玩家输入排查的方格之前,我们需要先将遮盖后的雷区展示给玩家看,能排查哪些方格,然后让玩家输入他们想要排查的方格的行数和列数。由于需要玩家重复排查雷区,所以我们需要使用循环,用n表示没有雷的方格个数,每排查一个不是雷的方格,n就自减1.
然后,对玩家输入的方格判断是否有雷,如果有雷,则输出被炸死了,游戏结束,用break跳出循环。
如果该方格已经没排查过了,则输出已排查过,并且此时n不自减1,而判断该方格是否被排查,只需要判断show[h][l] == '*',如果不等于则表示该方格不是遮盖状态,已排查,用continue跳过后面语句,立刻再次循环。
如果前面都不是,则该方格一定不是雷,且没排查过,那么该方格就只能没有雷,不用加上判断语句,只需要将该方格周围雷的个数赋给该方格就行,并让n自减1.
最后,我们如何得到周围雷的个数呢,由于我们使用'0','1'表示没有雷和有雷,我们只需要将该方格周围8个方格中的值累加 - 8 * '0',最后赋给show[h][l]时加上'0'就行了
接下来是完整代码:
码字不易,给小萌新一点三连鼓励!!!