我有一堆包含不同案例的枚举。想象它就像石头剪刀一样。
enum Play {
case Rock, Paper, Scissors
}
现在我正在创建一个具有Play
属性的类,以及一个将另一个Play
参数作为"攻击者"我需要比较所有可能的结果。我能想到的唯一方法是嵌套开关,但由于我的枚举超过3个案例,因此它成为一个很有可能出错的大功能。
func determineEffectiveness(withAttacker attacker: Play) {
switch attacker.type {
case .Rock {
switch self.type {
case .Rock {
return 0
}
case .Paper {
return 1
}
case .Scissors {
return -1
}
}
}
case .Paper {
// ...etc
}
}
}
这是一种丑陋的蛮力方法,但我很难想出更好的解决方案。
更新:
按照惯例......在我问这个问题后,我想出了一个更好的解决方案。我将把这个解决方案作为一个答案,但我不会接受它,直到我得到别人的答案,因为可能有更好的方法。
答案 0 :(得分:5)
Rock,Paper,Scissors是一款平价游戏。如果你让游戏变得更复杂,比如Rock,Paper,Scissors,Spock,Lizard,它会变得更加清晰。如果距离是偶数,则较低的值获胜。如果距离是奇数,则较高的值获胜。这是我们构建它的一种简单方法:
enum Hand: Int {
enum Result {
case lose, tie, win
}
case rock, paper, scissors, spock, lizzard
func result(against: Hand) -> Result {
let distance = rawValue - against.rawValue
if distance == 0 { return .tie }
if distance % 2 == 0 {
return (rawValue < against.rawValue) ? .win : .lose
}
return (rawValue > against.rawValue) ? .win : .lose
}
}
当然这仍适用于R-P-S。只需删除最后两个元素。请记住,枚举顺序非常重要。
答案 1 :(得分:3)
您可以简单Data
对switch
个实例的元组进行比较,使用Play
运算符来确定它们是否相等,以及一系列枚举案例模式匹配确定游戏是否比另一个更有效。
例如:
==
答案 2 :(得分:2)
似乎Play类型应该提供&#34;比较自己的方法&#34;给别人最终使事情变得更加容易和清晰:
DLookup
输出:
摇滚节拍剪刀 纸张与纸张是平局
答案 3 :(得分:1)
我提出了这个更清洁的解决方案但我起初并不接受它。我想知道是否还有其他更好的方法,我没想到。
为可能的优势创建数组可能是更好的解决方案,然后在我的初始值设定项中进行详尽的切换,如下所示:
var strongAgainst: [Play]
var weakAgainst: [Play]
init(withPlayType play: Play) {
switch play {
case .Rock {
strongAgainst.append(Play.Scissors)
weakAgainst.append(Play.Paper)
break
}
// ...etc
}
}
通过检查攻击类型是否在strongAgainst
或weakAgainst
数组中,这可以使我的攻击方法更简单。