在 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 中随机生成战利品 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章