有没有一种更干净的方法来使用变量选择元组的一部分?

时间:2020-06-09 22:56:42

标签: swift tuples

我正在开发一个游戏,其中角色的几个参数由难度级别决定。例如,boss的大小会从容易变为正常再到很难。我知道我可以使用if语句和switch语句嵌套或排列在一起以形成一千行代码来做到这一点(在3个难度级别下,我可能会获得近20个老板的十几个参数(等待添加更多...),但是我想使用元组以一种更易于阅读,更简洁的方式进行操作。我认为这应该很容易,但我真的很努力地使其作为错误工作声明元组没有成员难度级别:

let difficultyLevel = 0 //0 for easy, 1 for normal, 2 for hard
let bossOneScale = (CGFloat, CGFloat, CGFloat) = (0.3, 0.6, 0.9)
bossScale = bossOneScale.difficultyLevel

然后,当在代码的主要部分创建敌人时,我引用bossScale,它根据传递的难易等级值具有正确的大小。

我知道我可以使用以下方法轻松完成此操作:

switch bossNumber {
case 1: 
    if difficultyLevel = .easy {bossScale = 0.3)
    else if difficultyLevel == .normal {bossScale = 0.6)
    else if difficultyLevel == .hard {bossScale = 0.9)
case 2:...

我只是认为使用元组会花多长时间来阅读,但我不确定如何使用变量对元组下标以获得我想要的值...

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以对元组和枚举进行一些外围操作,以供参考,包括命名元组(因此您可以引用为bossOneScale.easy)和具有关联值的枚举(也就是将值存储在枚举内部:{{1 }}。但是,由于您仍然必须切换访问所有这些文件,因此这些文件似乎不会在这里提供帮助。

如果您希望能够使用int变量访问值,为什么不只使用一个好的ol'数组:

let damageMultiplier = .easy(0.3)

答案 1 :(得分:1)

我建议这种事情:

enum Difficulty: Int {
    case easy
    case medium
    case hard
}

func bossOneScale(difficulty: Difficulty) -> Double {
    return Double(difficulty.rawValue + 1) * 0.3
}

这里的要点是,如果您还有其他具有其他刻度的老板,那么这些刻度也可以表示为功能。甚至可能所有这些缩放函数都可以移走,成为老板类型方法

此外,如果所有缩放功能都以相同的方式工作,则可以有一个工厂来生成它们:

enum Difficulty: Int {
    case easy
    case medium
    case hard
}

func scaler(offset: Double, multiplier: Double) -> (Difficulty) -> Double {
    return { difficulty in
        (Double(difficulty.rawValue) + offset) * multiplier
    }
}

例如,您的老板的一阶函数可以这样生成:

 let bossOneScale = scaler(offset: 1.0, multiplier: 0.3)

让我们测试一下:

bossOneScale(.easy) // 0.3
bossOneScale(.medium) // 0.6
// you get the idea