在Swift中随机生成Loot

时间:2016-02-09 13:49:53

标签: ios swift sprite-kit swift2

为清晰起见而更新

我正在创建一个游戏并创建了一个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语句中的上/下限。

我觉得我需要为每件战利品定义一个范围,然后检查一个数字是否在该特定范围内。这是我能想到的最好的。想法?

谢谢!

2 个答案:

答案 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

并且这会过滤并返回范围内匹配的第一个项目。如果数字超出范围,则为零,这是完美的,因为这意味着没有战利品掉落!