嗨!大家好,我是小蚂蚁。
从这一节开始,我们会接触连连看游戏中最核心的东西——连线查找算法。一提到算法有些同学就开始头大了,完全没有必要,我们会从最简单的直线开始,由浅入深,逐渐向更难的连线发起挑战。
提前准备一张纸和一支笔,遇到想不明白的地方,就试着在纸上画出来。清晰的图像利于大脑的思考,相信我,这种方法屡试不爽。
先理论
我们还是先从理论开始,上一节中我们讲过,连连看游戏中一共有 4 种类型的连线,看下图:
这四种连接线又可以归为两类:一类是起点和终点都位于同一行或列上,另一类是起点和终点位于不同的行和 列上。
如图,如果两个选中的图片位于同一行或者列上,那么它们之间的连线有可能是直线,也有可能是双折回线。如果两个选中的图片位于不同的行列上,那么它们之间的连线有可能是单折线,双折S线或双折回线。
那我们如何判断两个张选择的图片间能否创建连线呢?
如图,只需要判断两个图片之间的位置是否都为空即可。那我们如何判断两个图片之间的位置是否都为空呢?还记得我们在第二节讲过的数据表格吗?(忘了的话回去复习),只需要判断数据表格中两个位置中间的所有项都是 0 即可。
直线判断看起来比较简单,那对于其他的折线该如何判断呢?上一节中我们讲过,所有的折线都可以拆分成直线的组合,对于折线的判断,我们需要将其拆分为一条一条的直线,然后依次判断每条直线是否满足起点和终点间的位置都为空,如果每条直线都满足条件,那最终的折线就满足条件。
以上就是连线规则的理论基础,接下来我们去项目里逐一实现不同的连线判断处理。
后实践
来到项目中,增加一个新的“正方形”素材,专门用于处理连线判断(后续与连线判断有关的所有逻辑都放在这个精灵上)。
在之前项目的基础上,增加几个新的全局变量。
如图,“起点行列号”记录的是第一次选中的图片的行列号,“终点行列号”记录的是第二次选中的图片的行列号。之前只有一个“全局-选中图片索引”变量,我们再增加一个,并用于 1,2 为其区分,分别记录的是两个选中的图片的索引。
增加一个“连线判断”的新通知。
接着,来看一下“图片”上的积木逻辑的修改。
你可以对照着之前的积木逻辑,看一下图片被点击后的逻辑处理。主要修改的地方有这样几处:除了记录图片的索引之外,还记录图片在数据表格中的行列号(这个在后续连线判断中会用到)。之前我们选中两个相同的图片后,是直接进行删除,现在不直接删除了,而是发送了通知,去进行连线判断处理。
另外,消除图片的逻辑也进行了修改。因为满足连线条件后同时消除两张图片,所以这里要判断的是两张图片的索引。
最后,我们来看一下“连线判断处理”上的积木逻辑,需要 4 个局部变量,提前创建好。
这段积木逻辑看上去比较长,但是逻辑并不难理解,可以顺着“如果,否则”积木进行分解,首先判断两个图片是否位于同一行或者列,如果是的话,分两种情况,一种是直线连接,另一种是双折回线连接,我们这一节重点处理了直线连接。直线连接中又分为两种情况,一种是水平直线,一种是竖直直线。除直线连接之外的其他几种情况,我们会在后续继续学习。
在检查直线连接的时候,起始位置以及逻辑循环的次数可能比较难理解。如果你试着在纸上画一下,就会发现它很简单。
如图,两张红色方块被选中要进行连线判断,它们的行列号分别是 (3,2),(3,5),位于同一行。在游戏中我有可能先选择(3,2)位置的图片,后选择(3,5)位置的图片,也有可能先选择(3,5),后选择(3,2),这就导致了“起点列号”和“终点列号”的不同。按照前者,起点列号为 2,终点列号为 5;按照后者,起点列号为 5,终点列号为 2。为了保证起点始终小于终点(这样就能顺序递增检查),所以我们针对两种情况做了判断和处理,确保了起点始终为 2,终点始终为 5。
至于从哪个位置开始检查,以及应该循环几次,从图中立刻就可以看出来。我们要检查两个位置,从“起点+1”的位置开始检查,一共检查两次。检查的次数就是“终点-起点-1”。
最后,运行测试一下水平和竖直的直线连接消除是否正确。
总结一下
这节课的内容就到这里了,我们了解了连连看游戏中的四种连线规则(回忆一下都有哪些连线),以及在不同的情况下都可能有哪几种连线,我们重点实现了直线的检查和处理。
下一节,我们继续学习如何处理单折线和双折线。
欢迎关注我的微信公众号【小蚂蚁教你做游戏】,可领取原创的游戏开发学习路线和教程资料合集。