迅速放弃机会

时间:2016-01-07 00:21:38

标签: swift

我终于开始使用swift了,而我和我的伙伴正试图制作一个小游戏来测试我们学到的东西。 我们制作了一种怪物格斗游戏,没有移动物体只需点击怪物。 到目前为止,如此好的evrything正常运行,得到升级以获得更多的Hp或Str对怪物造成更多伤害,并在它击中时获得更多Hp。 那说。我已经为游戏制作了物品,但我希望它们能够被怪物击落。 制作了不同的类型,并想知道是否有人知道一个代码,以获得物品的掉落机会... 像

"Normal" = 73%
"Rare" = 25%
"Legend" = 2%

我在evry搜索引擎上查看,但无法找到我需要的任何东西。 希望很快得到答复 谢谢。 Greetz Kristof.V

3 个答案:

答案 0 :(得分:2)

这个逻辑与 Avt 的答案相同,只是一个不同的实现。

let random = Int(arc4random_uniform(100))

switch random {
case 0...72: print("Normal")
case 73...97: print("Rare")
case 98...99: print("Legend")
default: fatalError("Wrong number")
}

答案 1 :(得分:1)

使用随机函数arc4random_uniform

  

返回介于0和插入参数减去1之间的随机数。

     

例如arc4random_uniform(3)可能会返回0,1或2而不是3。

您可以像以下一样使用它:

=SI(ESTERREUR(EQUIV("ABI";C14:G14;1)); MOYENNE(C14:G14); "ABI")
=IF(ISERROR(MATCH("ABI";C14:G14;1)); AVERAGE(C14:G14); "ABI")

答案 2 :(得分:1)

已编辑:根据后续问题包含武器类型 Random number to print array (Swift)

如上所述,使用arc4random功能。一个更完整的怪物"例子如下。

enum个案件

包含在不同的稀有和武器类型中可能是合适的
enum Rarities {
    case Normal
    case Rare
    case Legendary
}

enum Weapons {
    case Knife
    case Sword
    case Katana
}

每个怪物都可以是Monster类的实例,其中包含自己的特定项目和稀有丢弃率,在创建Monster对象时初始化。

class Monster {
    var name : String
    var dropRatesRarity = [Rarities:Double]()
    var dropRatesWeapons = [Weapons:Double]()

    init(name: String, dropRatesRarity: [Rarities:Double], dropRatesWeapons: [Weapons:Double]) {
        self.name = name
        var rateSum = dropRatesRarity.values.reduce(0.0, combine: +)
        var dropRatesCumSum = 0.0
        for (k, v) in dropRatesRarity {
            self.dropRatesRarity[k] = v/rateSum + dropRatesCumSum
            dropRatesCumSum += v/rateSum
        }
        rateSum = dropRatesWeapons.values.reduce(0.0, combine: +)
        dropRatesCumSum = 0.0
        for (k, v) in dropRatesWeapons {
            self.dropRatesWeapons[k] = v/rateSum + dropRatesCumSum
            dropRatesCumSum += v/rateSum
        }
    }

    func dropItem() -> (Weapons,Rarities) {
        return (generateItemType(), generateRarity())
    }

    func generateRarity() -> Rarities {
        let random = Double(Float(arc4random()) / Float(UINT32_MAX))
        return dropRatesRarity.filter({ (k, v) in v >= random }).minElement({ $0.1 < $1.1 })?.0 ?? .Normal
    }

    func generateItemType() -> Weapons {
        let random = Double(Float(arc4random()) / Float(UINT32_MAX))
        return dropRatesWeapons.filter({ (k, v) in v >= random }).minElement({ $0.1 < $1.1 })?.0 ?? .Knife
    }
}

某些Monster实例的示例:

/* Example */
var myDropRatesRarity = [Rarities:Double]()
myDropRatesRarity[.Normal] = 73 // relative drop rates, needn't sum to 100
myDropRatesRarity[.Rare] = 25
myDropRatesRarity[.Legendary] = 2

var myDropRatesWeapons = [Weapons:Double]()
myDropRatesWeapons[.Knife] = 50
myDropRatesWeapons[.Sword] = 30
myDropRatesWeapons[.Katana] = 20

var myMonster = Monster(name: "Godzilla", dropRatesRarity: myDropRatesRarity, dropRatesWeapons: myDropRatesWeapons)

var myItem = myMonster.dropItem()
print(myMonster.name + " dropped a \(myItem.0) of \(myItem.1) rarity!")
/* "Godzilla dropped a Katana of Normal rarity!" */
/* ... most likely Normal rarity ... keep grinding! */