如图是游戏中使用的 10 种类型的形状,我为其进行了编号,有的类型只包含一种,如 7, 8, 10,有的类型包含两种,如 1,2,3,4,有的类型包含四种,如 5,6,9。
在游戏的下方存在 3 个形状槽,每个形状槽中都会随机的产生一种形状。我们可以通过设置不同类型的形状的生成概率来调整游戏的难度,例如 1,8 两种类型的形状出现的概率高的话,游戏的难度就会增大。反之,难度就会减小。
下面,我们就来实现一下如何根据设定的概率随机的生成形状。
首先,创建一个列表,用于设置 10 种类型的形状的权重(权重可以理解成概率,数值越大,则该图形出现的概率越高)。
如图,列表中包含了 10 个数值,我们将每个数值对应一种形状的类型,例如列表的第一个数值对应的是形状 1 的生成概率。这里我默认的将 10 种形状的权重都设置为 10,也就是说 10 种类型的形状出现的概率是均等的。
## 随机算法
接下来,我们了解一下一个简单的计算随机的算法。
假设我们当前需要在 3 项中进行随机,每一项的权重都是 10。首先我们计算一下总权重为 30,接着从 1~30 的数字中随机一个数字,当前假设随机到了 25。接下来进行循环遍历比对:
循环 1: 25 比第一个数值 10 要大,所以不是第 1 项,将 25 减去第 1 项的数值 10,进入下一循环。
循环 2: 15 比第一个数值 10 要大,所以不是第 2 项,将 15 减去第 2 项的数值10,进入下一循环。
循环 3: 5 比第一个数值 10 要小,所以是第 3 项,循环结束找到最终结果,随机到的是第 3 项。
这个算法只使用了一个列表就实现了根据不同的权重进行随机的功能,列表的项可以对应着任何的东西,例如可以设置一,二,三等奖,分别对着列表的 1,2,3 项,然后就可以通过设置三项的数值来决定随机的概率了,比如说可以这样设置 1,100,10000,这样极大的概率都是三等奖了。所以,你知道游戏和应用中的各种转盘,抽奖活动的原理了吧!
可能有人会说,我直接使用如果“那么,逻辑”不就行了?何必使用列表和循环这么麻烦。现在只有 3 项随机,可以使用“如果,那么”逻辑,但是如果有 30 项呢?如果每一项的权重需要经常设置和调整呢?
使用这个方法不论有多少项,不论每项的数值如何调整,都可以简单的通过调整列表中的数值满足要求。可以说是非常的好用,大家可以把它收录到自己的算法库中,每当遇到需要设置权重值的随机功能时,就可以拿过来用了。
## 随机生成形状的实现
接下来,看一下具体的实现。
首先,遍历一下列表,将所有的权重累加,计算总权重。接着在 1~总权重 间随机一个数值。然后,再次遍历列表逐项比对,直到找到当前的值小于当前项的值,那么当前的项的索引就是我们要找的随机项了。
在获取到了随机的项之后,接下来就要去生成对应的形状了。
逻辑非常简单,就是根据随机项的数值,生成不同类型的形状。
图中可以看到,这里我将“生成形状”都包装成了“函数”,下面我们就来了解一下如何在微信小游戏制作工具中使用函数。
## 使用函数
在积木区中找到“函数”类别,然后点击“新建函数”按钮。
给函数起一个名字,点击确定后,当前的积木区就会显示出当前要制作的函数了。
可以通过点击积木块上的“加号”和“减号”按钮来添加和删除参数。参数的作用就是向函数内传递用于计算和处理的东西。
如果你有过编程经验,就会知道根据返回类型来区分的话,函数分为两种,一种有返回类型,一个没有返回类型。但是在微信小游戏开发工具中,只有一种没有返回的类型的函数。
假设当前我们的函数有这样的功能,将两个参数中的数值进行相加,得到结果。由于函数不能返回值,所以这里我们需要借助一个全局变量来存储函数处理的结果值。
函数制作好后,可以直接拖拽对应的函数积木进行使用。函数计算的结果保存在了“全局-相加结果值”中,后续如果我们需要使用函数处理的结果值,就直接使用这个全局变量即可。
所有创建的函数都会显示在资源管理器中的函数模块下,可以右键点击对应的函数进行重命名和删除处理。
## 生成对应形状的实现
最后,让我们看一下项目中的生成形状5的具体实现。
游戏中的形状5包含了 4 种不同的形态。
生成形状5的函数,根据传入的参数,生成不同形态的形状。
生成形状5函数的使用,传入一个1~4的随机数值。
看一下最终游戏中生成新形状的效果。