嗨!大家好,我是小蚂蚁。
上一节中,我们学习了泡泡龙游戏中的查找算法,这个算法可以帮助我们找到所有相邻的相同颜色的泡泡,在查找完泡泡之后,再通过判断满足条件的泡泡的数量是否大于等于 3,来决定是否应该进行消除。
这是泡泡停靠后的查找和消除的过程,但是这只是消除过程的一部分,还有另一部分需要处理。
来看一下上方这张图,发射一个蓝色的泡泡,这个蓝色的泡泡停靠后,通过查找算法,找到了它右侧的两个相同的蓝色泡泡,因为数量满足了 3 个,所以这 3 个蓝色泡泡会进行消除。
3 个蓝色泡泡被消除了之后,就成了上面图中的样子,剩下了 3 个“悬空”的泡泡。而我们知道这是不对的,在一个正常的泡泡龙游戏中,是不会有“悬空”的泡泡的,下方的这 3 个泡泡也应该被消除。
我们暂且把这个叫做“连锁消除”吧!因为上方的与它连接的泡泡被消除了,所以它也应该顺带着进行消除。
“连锁消除”应该如何去处理呢?我们仍然需要使用之前学过的查找算法,只是这次查找的起点不再是停靠的泡泡,而是最上方第一行的所有泡泡。
还是先把泡泡进行一下数据抽象,不同的颜色对应的不同的数字,空的位置对应的是 0 。如图,下方 3 个“悬空”泡泡的上方的蓝色泡泡都是 0 ,因为它们满足消除条件,被消除了,所以这里成了空位置(设置为 0)。
我们以第一行的第一个泡泡为起点开始查找,依次查看与它相邻的泡泡,只要相邻的泡泡不是 0 ,那么就以它为新的起点继续查找。具体的查找步骤我们在上一节中已经演示过了,在此就不多讲了。
总之,经过了所有的查找之后,所有上方的 3 行泡泡都能够被找到。剩余的泡泡,也就是下方的 3 个“悬空”的泡泡,因为中间被 0 个隔开了,所以无法查找的到。
经过这一轮的查找之后,我们找到了所有不应该消除的泡泡,反之,没有被找到的那些就是应该被消除的泡泡。
这里有一个需要注意的地方,就是我们要依次的以第一行的每一个泡泡为起点进行查找,这样才能够找到所有不能消除的泡泡。上方举的例子由于前 3 行都是满的,所以理论上以其中任何一个泡泡为起点进行查找,都能够找到所有前 3 行的泡泡。但是不要忘了,还有下方这样的情况。
如果只以第 1 行第 1 个泡泡为起点进行查找的话,那就只能找到左上方的 4 个泡泡,找不到右侧的这些泡泡了。所以整个遍历查找的过程是依次以第 1 行的每一个泡泡为起点进行遍历查找,直到查找完所有的泡泡。
来看一下这个“连锁查找”的积木逻辑。
跟之前的查找算法一样,都是使用递归查找,唯一的区别是,只要相邻的泡泡不是 0 ,就满足查找条件。
最后,来看一下全部两次查找过程的积木逻辑。
第一次查找以停靠的泡泡为起点,目的是找到所有与它相邻的颜色相同的泡泡。第二次查找是依次以第一行的每一个泡泡为起点,目的是找到所有的需要进行“连锁”消除的泡泡(没被找到的就是要被消除的)。
预览一下,看看消除以及连锁消除。
红色的泡泡满足消除条件被消除,下方的黄色泡泡因为失去了连接,也顺带被连锁消除了。
我们用了两篇文章来讲泡泡龙游戏消除的两个过程,其实这两个过程使用的是几乎一样的查找算法,只不过是起点和判断条件有些差异。这些东西就是一个消除游戏中的核心查找算法了,如果你能够详细清楚的了解这整个过程,就会发现很多的消除游戏都大同小异,不信就找几个不同类型的消除游戏来看一看,测试一下你是否具备了一双能够洞悉游戏表象,看穿其本质的眼睛。
表象的世界总是千变万化,内在的实质却依旧始终如一。