在 Swift 中随机生成战利品 [关闭]

Posted

技术标签:

【中文标题】在 Swift 中随机生成战利品 [关闭]【英文标题】:Randomly Generate Loot in Swift [closed] 【发布时间】:2016-02-09 13:49:52 【问题描述】:

为清晰起见已更新

我正在制作一个游戏并创建了一个 JSON 配置文件,我可以在其中配置设置,例如在任何给定级别都会掉落的战利品种类。我还配置了(在 JSON 战利品数组中)每个项目的频率。对于 1 级,我希望一枚硬币有 30% 的几率掉落,一颗心有 50% 的几率掉落。所以我将硬币的频率配置为 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 语句中的上限/下限。

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

谢谢!

【问题讨论】:

你能提供更多细节吗?给定的附加条件很难理解你想要什么算法 通常人们认为他们对如何实现某事感到困惑,而实际上他们对自己想要什么感到困惑。在我看来,这里就是这种情况,这是您首先要弄清楚的地方。 示例场景 - 掉落 10% 的物品:生成数字 。如果 number 为清晰起见进行了更新 - 如果您还有其他时间,希望您能得到一些反馈,谢谢! 【参考方案1】:

这是在 Swift 中获取随机数的方法:How does one generate a random number in Apple's Swift language?

从那里,很容易将文件中的值与生成的数字进行比较。如果随机数低于阈值,则丢弃该战利品。

【讨论】:

【参考方案2】:

好的,你就是这样做的:

首先,你不能只用一个数字,你需要一个范围。 所以在我的配置中,我创建了“频率”:(1, 50) 表示 1 到 50 之间的数字,对于项目 1 和 51,对于项目 2 表示 70,对于项目 3 表示 71 - 100(你明白了)。

然后我将每个频率反序列化为一个元组 (Int, Int)

然后我只生成一个介于 1、100 之间的随机数并像这样过滤:

 let rand = RandomInt(min: 1, max: 100)
        var loot: Loot?
        let lootData = lootConfigArray.filterrand >= $0.frequency.0 && rand <= $0.frequency.1.first

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

【讨论】:

以上是关于在 Swift 中随机生成战利品 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:在一定范围内随机生成敌人?

为什么在Swift中默认随机生成数字UInt-32?

swift Swift随机字生成器

如何在电话号码格式的范围内生成随机数 Postman [关闭]

swift C导入随机数生成器

c#中0-1000之间的随机数生成器[关闭]