为清晰起见而更新
我正在创建一个游戏并创建了一个JSON配置文件,我可以在其中配置设置,例如将丢弃任何给定级别的战利品种类。我还配置了(在一个战利品的JSON数组中)每个项目的频率。我想要一个硬币掉落30%的时间和一颗心脏掉落50%的时间为1级。所以我配置硬币的频率为0.3,心脏的频率为0.5。并非所有级别的战利品掉落(有些可能有0.0的频率)
当我的ObjectFactory产生一块战利品时,如何确保硬币下降0.3(或30%)的时间和心脏下降0.5或50%的时间?我知道我可以生成1到100或0.0和1.0之间的数字。那么呢?
如果我的随机数生成0.7,那意味着什么?我会生成硬币或心脏吗?
我是否必须按字母顺序执行这样的if语句?
//30 and 80 came from the JSON file
if (rngNumber < 30)
//spawn coin
else if (rngNumber >= 30 && < 80)
//spawn heart
else
//spawn nothing
看到问题,那就是,当我从一个级别到另一个级别时,这不起作用。因为如果我在第2级将心脏改为90%,那么代码如下所示:
if (rngNumber <= 89)
//spawn heart
else
//do nothing
明白我的意思?我想要一种方法来抽象地获取JSON配置中存在的频率数,并根据它们的频率产生项目,而不必考虑一系列if..else语句中的上/下限。
我觉得我需要为每件战利品定义一个范围,然后检查一个数字是否在该特定范围内。这是我能想到的最好的。想法?
谢谢!
答案 0 :(得分:1)
这是如何在Swift中获取一个随机数:How does one generate a random number in Apple's Swift language?
从那里,将文件中的值与生成的数字进行比较非常容易。如果随机数低于阈值,则丢弃该掠夺物。
答案 1 :(得分:0)
好的,你就是这样做的:
首先,你不能用一个数字来做,你需要一个范围。 所以在我的配置中,我创建了&#34;频率&#34; :(1,50) 意味着1到50之间的数字,对于项目1,对于项目2为51,70,对于项目3为71-100(您得到了想法)。
然后我将每个频率反序列化为元组(Int,Int)
然后我只生成1,100之间的随机数和过滤器,如下所示:
let rand = RandomInt(min: 1, max: 100)
var loot: Loot?
let lootData = lootConfigArray.filter{rand >= $0.frequency.0 && rand <= $0.frequency.1}.first
并且这会过滤并返回范围内匹配的第一个项目。如果数字超出范围,则为零,这是完美的,因为这意味着没有战利品掉落!