扫雷游戏设计(从零开始)(2)

本文介绍了如何在二维数组中实现扫雷游戏,包括初始化数组、放置雷、遍历非雷元素并更新其值,以及使用辅助区避免数组越界。关键步骤包括九宫格遍历和区分游戏区与辅助区的填充策略。
摘要由CSDN通过智能技术生成

我们来回顾一下之前的内容,之前我们讲到如何去定义一个二维数组,二维数组怎么去给它全部初始化为零,然后去打印二维数组当中所有的元素,这个东西很简单。那么,我们之前的重点呢在于这个数组当中全部都是零,那么我们用负一去表示雷。那有多少个雷呢?我们之前规定的是十个雷,所以咱们用了这样一个布雷的方式啊。

我们来看一下啊,这个扫雷游戏。

这个扫雷游戏他到底怎么玩?我们拿二这个值来看。为什么这里是二?是因为在这个二的周围呢,它有八个元素,加上它自己本身有九个。在这九个格子里面,它有两个雷。所以它是二。那么同样的一也是一样。

所以我们回到我们的程序里边来,我们最开始把所有数组元素全部赋值为零,然后咱们在里面放了十个雷,那其他的都是零。那么我们怎么样把这些零变成它应该有的数值呢?那它跟咱们雷是有关系的。

首先我们来打开我们的第一个图片。这个是咱们现在的这个数组十行十列,那么我随便在里面加一些-1。这些-1呢,都是我们所谓的雷。我们加十个吧。

好,我们来看一下,现在的话呢,我们十行十列的数组里面有十个雷啊,我们要把这个二维数组当中所有不为负一的,所有不是雷的地方,咱们必须来确定它的值。那意味着咱们需要去遍历到咱们所有的元素。i=0;i<ROW;i++

第二个for循环int类型的j=0;同样的j<COL;j++。这样的话,咱们是不是遍历了所有的元素?那么我们只要给定一个if(map[i][j]!=-1)咱们的数组名map[i][ j],它不等于-1。

那么就保证说我们遍历到的是每一个不为雷的元素,也就是这些空格的地方。

你比如说这个值最开始是零,咱们给他一个红色的,找到这个值之后,这个值的行和列是多少?我们通过这个for循环来找到它的,并且它不是雷,那么我们要知道它应该是在第i行第j列。找到了这个零之后呢,咱们要来看它周围的这些格子,这里面是不是雷呀啊?是雷。

是雷呢,我就要让这个值,加一。要按顺序来啊。这里面加了几次一呢?加了一次,也就意味着它的值应该是1。那么我们来看怎么去改变它的数值的呢?我们是去遍历它周围的这个九宫格好,关键问题来了,那么我们到底怎么去遍历他的九宫格呢?大家要知道它的行是i,列是j。那么我们从i- 1行开始遍历,遍历到i+1行,我们从j- 1列开始遍历到j+1列。那我们不就可以得到这里面每一个元素的值吗?再根据这些元素来写一下啊。那这个时候咱们用一个for循环,遍历二维数组,然后找到不为零的元素。找到之后咱们要来遍历九宫格啊,这个九宫格怎么遍历?通过咱们的i- 1,i和 i+1,j- 1,j和j+1。那for循环定义一个int类型的m。这个m呢,让它等于i- 1;m<i+1;m++。再来第二个for循环定义一个int类型的n=j- 1;n<j+1;n++。

大家注意,这里是有问题的。i- 1没问题,i也没问题,i+1是有问题的,如果说要遍历他的九宫格呢,必须要小于等于啊。遍历九宫格,我们说如果在这个九宫格里面,我们找到一个map [m][n],它是等于负一的说明什么?说明我们找到一个雷。找到雷的话呢,咱们就得把中间这个零的地方,让map[i][j]++。

咱们来运行一下。大家要注意了,这个时候呢,有问题了,比如说这个啊,它周围有几个呢?

大家一看诶,只有一个雷,但是显示的是2。那这个时候咱们程序就出现问题了啊,注意为什么出现问题,这是一种非常特殊的情况啊,就是他有九宫格,那其实我们在遍历的过程当中有很多地方是没有九宫格的,你比如说。你比如说这个零它有九宫格吗?很明显没有啊。

那我们在这种情况下面。我们怎么去辨认?比如说我找到这个黄色的值,那我再去画它的九宫格的时候就是这个样子了,外面的这个东西他就越界了,我们就只能找到他的i行和i+1行,j和j+1列。

它会出现很多种情况,我们必须要把每一种情况都给它写出来,那这样会显得很麻烦。那么,我们到底怎么来做呢?它不是没有九宫格吗?我们能不能让它有九宫格呢?

大家注意,这里面黑色的部分就是咱们刚才的那个数组啊,现在呢,咱们想让这个数组扩大范围。就像我这个样子,让他上面多一行,下面多一行,左边多一列,右边多一列。我们应该怎么样去定义这个数组呢?我们回到我们整个程序,从头开始,首先多了两行,加二。多了两列,也要加二。

其次呢,我们往下面走,我们在初始化函数的时候,我们要把所有的元素都给它初始化,包括咱们的外圈和内圈。所以呢,咱们得把所有的数组呢都给它初始化。

但是注意,布雷的时候,这个蓝色的部分,咱们给他叫做辅助区。这个黑色的部分呢,咱们给它叫做游戏区。

那么我们来看,这个辅助区就是咱们用来防止数组越界的,就是咱们要用来玩游戏的,就是我们刚才比较重要的前面图里面的数组。所以我们回到头来看,我们初始化数组赋初值为零,很明显可以全部做,但是咱们布雷的时候,大家想一想,这个雷我们能够让它出现在咱们的辅助区吗?肯定是不可以的,它必须要出现在咱们的游戏区。那么我们来看游戏区,看下图。

所以我们在布雷的时候,我们就得注意了,r呢它必须是从1到ROW。列呢,它必须是从第一列到COL列,所以这个地方我们得加一个1。

这样的话满足咱们的情况。那么同样的这个时候呢,咱们再回过头来,我们雷布好之后,在这个地方根据雷的分布去填充我们其他不为雷的数据。

那么大家想我们的辅助区要管它吗?辅助区里面它全都是零,而且这里面它也没有雷,所以这个东西咱们不用去考虑它。所以我们在填充数据的时候,咱们也只要填充游戏区的路径,游戏区的这个数据就可以了。同样的,我们在遍历二维数组的游戏区的时候,同样的i等于一,j等于一,i小于等于ROW,j等于COL。

这就是遍历咱们二维数组的游戏区。那么找到这个游戏区里面看一下这个值它到底是不是负一,如果不是负一,咱们遍历九宫格,找到一个雷,然后++。当然咱们打印数组的时候,我们要不要去打印辅助区呢?不要。我们打印的时候,其实咱们也只要打印游戏区。如果说你从零开始,会把辅助区也打印进来了。所以咱们让这个地方打印咱们的游戏区。

咱们来运行。

咱们在这个时候咱们再来看周围的,比如说这个是零,那他周围雷的数量是零,没问题。我们就看刚才比较容易出错的地方,这个是一,那么它的九宫格是不是就是一了?为什么这个时候它就对了呢?

我们用红色标注。当我们遍历到这些地方的时候,因为我们的数组的大小是12行12列,所以它不会越界。而外面这一层辅助区的值呢?它永远都是零,而我们遍历到这红色里面的值跟什么有关系,跟他周围的-1有关系,跟零是没有关系的,所以我们在编辑这个九宫格里面,我们外层辅助区为零的话,它对我们这个数值是没有任何影响的。

这就是根据咱们的雷的分布去填充其他不为雷的数据,咱们来总结一下啊。第一个事情就是,咱们原理是遍历这个九宫格。那九宫格是怎么遍历的呢?根据咱们的这个九宫格的i- 1, i,i+1。j- 1,j,j+1,这样去遍历它的九宫格。第二个,咱们在边上的数据,它在遍历的时候,会越界。那么我们怎么去解决这个问题呢?咱们加入了咱们的辅助区啊,咱们把咱们的这个数组扩大两行两列,那么产生了咱们的辅助区和游戏区。在这个辅助区和游戏区里面,大家一定要记住辅助区呢,它仅仅是作为咱们在遍历这个九宫格的时候,让它产生一个有这样的一个九宫格,所以我们在初始化的时候,我们要去考虑辅助区要不要初始化?咱们去布雷的时候要考虑辅助区,要不要有雷啊?咱们再去填充不为雷的数据的时候,这个时候辅助区它到底要不要填充?解决这几个问题,你就能够想得明白今天的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值