嗨!大家好,我是小蚂蚁。
今天我们继续来看连连看游戏制作的下一个步骤——随机的创建图片。前两节讲过游戏开始时我们会创建一个 10 x 8 的图片排列布局,一共 80 张图片。现在我们需要让这 80 张图片产生一定的随机性,例如使用 20 张不同类型的图片进行组合,共同凑成 80 张。
这会产生很多种不同类型的组合,80 张有点儿多,我们把数据缩小一下举个例子就容易理解了,假设有 A、B、C 三种图片,共同组成 8 张,那组合有可能是这样的:
A(2) B(2) C(4)
A(2) B(4) C(2)
A(4) B(2) C(2)
所有的组合都必须要同时满足这样的两个条件:
所有图片的总数加起来等于 8;
每种图片的数量必须是 2 的倍数;
第一个条件很好理解,图片总数是 8,每种图片的数量加起来必须要等于这个总数。第二个条件,为什么每种图片的数量必须是 2 的倍数呢?因为在连连看游戏中两个相同的图片满足连接条件可以消除,也就是俩俩消除,所以每种类型的图片必须要是 2 的倍数,否则的话就会出现单剩一张图片无法消除的情况,这样游戏就无法过关了。
以上的三种组合是我们将数据简化后的例子,如果游戏要用 20 张不同类型的图片组合成 80 张,那该有多少种组合呢?需要把每一种组合都考虑到吗?不需要,也没有必要。我们只需要保证最终的结果满足上方总结出的两个条件,这样就能够让游戏正常运行,至于到底是哪种组合,完全随机即可。
接下来我们就依次来看如何满足这样的两个条件。
先理论
第一个条件:所有图片的总数加起来等于 80。这个条件是一定会满足的,因为我们本来就是要创建 80 张图片的,所以图片的数量加起来一定是 80。这里我们重点需要考虑的不是总数,而是“均匀”。
什么是“均匀”呢?假设我们每创建一张图片都是从 1~20 种图片里随机一张,那每张图片被创建出来的概率都是1/20。如果 80 张图片都是这样完全随机创建出来的,那就一定会出现这样的情况,例如某一类图片出现的特别多(如同一类型的图片出现了 20 张,甚至更极端一点,有极小的概率出现同一类型的图片出现了 80 张),某一类的图片出现的特别少或者不出现,这种情况就是“不均匀”。
如何处理能让图片显的更均匀一些呢?可能有同学会这样想,一共 80 张,20 种,80/20 = 4,每种图片出现 4 张不就行了。这确实是一种解决方案,不过这种解决方案的问题就在于又太过均匀,每种图片出现的次数都严格的一致,缺少随机性。另外这是刚好能整除的情况,如果 80 张 30 种呢?
一个比较好的方案是给每种类型的图片一个最大数量的限制,例如每种类型的图片最多只能出现 8 张,如果随机的过程中发现这张图片已经有 8 张了,那就不再生成这张图片,去生成其它类型的图片。这样既能保证相对的均匀,也能够具有足够的随机性。
具体的实现思路如下:
我们为不同类型的图片进行编号(每种图片对应唯一的编号),然后使用一个列表来记录每种图片出现的次数,每当随机生成图片的时候,先检查一下列表中当前生成的图片数量是否超过最大数量,如果不超过的话,就生成当前图片,并且将列表中记录的当前图片的数量加 1,如果超过的话,就重新生成图片再检查,直到生成能满足条件的图片为止。
后实践
接下来,我们就到微信小游戏制作工具中把随机均匀的生成图片的功能实现出来吧!
在实现之前,我们先准备一些素材。这里我给大家准备了 30 个可爱的动物头像,接下来我们将使用这些素材来制作完成一个动物连连看游戏。
长按识别二维码,可前往网盘下载素材。
将下载下来的所有动物头像导入到素材库中。
然后将 30 个动物头像,加入到正方形素材的造型中。
接着,在之前项目的基础上,增加 4 个新的变量。
两个全局变量,一个用于设置图片的类型数,一个用于设置每种图片出现的最大次数。局部变量“图片类型”,记录的是当前图片的类型(编号),列表“图片类型数量统计”用于记录每种类型图片的出现次数。
最后,看一下积木逻辑。
红框圈出来的是与之前相比有变动的地方。初始化时增加了根据当前图片的种类来设置列表的项数,图片克隆出来之后,先从 1~20 种图片里随机一个,然后检查其在列表中记录的数量,如果数量超过最大数量了,则重新随机继续检查,如果不超过最大数量,则将记录的数量加一,退出循环。最后,将图片的类型记录到表格中,然后切换自己的造型。
调试一下场景,观察一下图片的生成情况,以及“图片类型数量统计”列表中记录的数据。
总结一下
这一节我们学习了连连看游戏中随机创建图片需要满足的两个条件,一个是所有类型图片的数量加起来等于总数,另一个是每种类型图片的数量必须是 2 的倍数。对于第一个条件,我们重点学习了如何相对均匀的随机创建图片,方案就是设置每种图片出现的最大次数,实现时主要借助列表来记录每种类型图片的数量。
你可能已经发现了,我们只限制了每种图片最多出现多少次,并没有限制每种图片最少出现多少次。这就可能会出现这样的情况:有些种类的图片不会被显示出来。如果要增加每种图片最少出现多少次的限制,该如何实现呢?这个就当作一点儿小作业交由大家自己去思考和实现吧!
下一节,我们继续解决第二个条件,即如何确保每种类型的图片的数量都是 2 的倍数。
欢迎关注我的微信公众号【小蚂蚁教你做游戏】,可领取原创的游戏开发学习路线和教程资料合集。
为啥我的“图片类型数量统计”里面没有数据,还是负数啊
控制台打印那段,是怎么放进去的?