简易版扫雷详解

一、游戏介绍及规则

规则:当排查的方格有雷,则直接被炸死,游戏结束;

当排查的方格没有雷,则显示周围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(),这两个函数会提供为随机数。

srand - C++ Reference

rand - C++ Reference

这是这两个函数的官方介绍,感兴趣的可以深入了解一下,在这我进行简单的介绍。

这两个函数都是定义在 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'就行了

接下来是完整代码:

码字不易,给小萌新一点三连鼓励!!!

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值