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

Swift 有没有更干净的方法来使用变量选择元组的一部分?,swift,tuples,Swift,Tuples,我正在做一个游戏,其中角色的几个参数由难度决定。例如,boss的大小将从简单增加到正常,再增加到坚硬。我知道我可以用if语句和switch语句来实现这一点,它们嵌套或排列在一起,共有上千行代码(我可能会为3个难度级别的近20个boss提供十几个参数(等待更多的添加…),但我想用一种更容易阅读、更简洁的方式使用元组。我认为这应该很简单,但我真的很难让它工作,因为错误表明元组没有成员困难级别: let difficultyLevel = 0 //0 for easy, 1 for normal, 2

我正在做一个游戏,其中角色的几个参数由难度决定。例如,boss的大小将从简单增加到正常,再增加到坚硬。我知道我可以用if语句和switch语句来实现这一点,它们嵌套或排列在一起,共有上千行代码(我可能会为3个难度级别的近20个boss提供十几个参数(等待更多的添加…),但我想用一种更容易阅读、更简洁的方式使用元组。我认为这应该很简单,但我真的很难让它工作,因为错误表明元组没有成员困难级别:

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:...
我只是想,考虑到使用元组需要多长时间,阅读起来会更容易,但我不确定如何使用变量为元组下标以获得我想要的值


谢谢!

您可以使用元组和枚举做一些外围操作以供参考,包括命名元组(因此您可以引用为
bossOneScale.easy
)和具有关联值的枚举(即在枚举中存储值:
让damageMultiplier=.easy(0.3)
).但是这些似乎对您没有帮助,因为您仍然需要切换才能访问所有这些

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

让难度等级=0//0表示简单,1表示正常,2表示困难
让bossOneScale:[CGFloat]=[0.3,0.6,0.9]
bossScale=bossOneScale[困难级别]

您可以使用元组和枚举做一些外围操作以供参考,包括命名元组(因此您可以引用为
bossOneScale.easy
)和具有关联值的枚举(即在枚举中存储值:
让damageMultiplier=.easy(0.3)
).但是这些似乎对您没有帮助,因为您仍然需要切换才能访问所有这些

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

让难度等级=0//0表示简单,1表示正常,2表示困难
让bossOneScale:[CGFloat]=[0.3,0.6,0.9]
bossScale=bossOneScale[困难级别]

我建议这样做:

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

我建议这样做:

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

我对您试图实现的目标感到困惑。您是否试图将像
.easy
这样的枚举值映射到浮点值?元组的每个成员究竟代表什么(即,对于特定的boss字符,
0.3
vs
0.6
vs
0.9
背后的含义).那么
bossNumber
是什么意思呢?这是某种字符ID吗?谢谢你的评论,你说得对,我给难度级别分配了一个数字,并试图用这个数字为boss从元组中提取比例。因此,在简单级别上,boss将占据大约三分之一的屏幕,在正常的2/3和0n几乎整个屏幕都是硬的。每个boss角色都可以有自己的比例?就像boss#2可以有0.1、0.5、0.7一样?在任何情况下,为什么不能创建一个表示每个boss的对象和一个接受难度枚举并返回浮点值的func?或者使用带有关联值的枚举?如果你解释一下,我想我们可以给你一个更好的答案教育署(附守则)你想如何使用它,复杂性从何而来我不是指责你是新开发人员,但感谢否决票,无论谁决定他们不喜欢我的问题,这就是为什么我不在这里问很多问题…我不是在找人为我写整个游戏,我有一个关于使用变量为元组下标的特定问题。…我对您试图实现的目标感到困惑。您是否试图将像
.easy
这样的枚举值映射到浮点值?元组的每个成员究竟代表什么(即,对于特定的boss字符,
0.3
vs
0.6
vs
0.9
后面的含义).那么
bossNumber
是什么意思呢?这是某种字符ID吗?谢谢你的评论,你说得对,我给难度级别分配了一个数字,并试图用这个数字为boss从元组中提取比例。因此,在简单级别上,boss将占据大约三分之一的屏幕,在正常的2/3和0n几乎整个屏幕都是硬的。每个boss角色都可以有自己的比例?就像boss#2可以有0.1、0.5、0.7一样?在任何情况下,为什么不能创建一个表示每个boss的对象和一个接受难度枚举并返回浮点值的func?或者使用带有关联值的枚举?如果你解释一下,我想我们可以给你一个更好的答案ed(带着代码)你想如何使用它,复杂性从何而来我不是指责你是新开发人员,但感谢你的否决票无论谁决定他们不喜欢我的问题,这就是为什么我没有问她很多问题