有没有办法让这个if语句缩短?还是更容易维护?

Dey*_*een 8 iphone ios swift

我制作了一个(摇滚,纸张,剪刀)应用程序用于教育,有没有办法使这个if语句缩短?

这是快速的代码片段:

var playerSelection = "" // possible values are r,p,s
var cpuSelection    = "" // possible values are r,p,s
var resultString    = ""

// DECIDE PLAYER RESULT
if(playerSelection == "r")
{
    if(cpuSelection == "r")
    {
        resultString = "draw"
    }
    else if(cpuSelection == "p")
    {
        resultString = "lose"
    }
    else if(cpuSelection == "s")
    {
        resultString = "win"
    }
}
else if(playerSelection == "p")
{
    if(cpuSelection == "r")
    {
        resultString = "win"
    }
    else if(cpuSelection == "p")
    {
        resultString = "draw"
    }
    else if(cpuSelection == "s")
    {
        resultString = "lose"
    }
}
else if(playerSelection == "s")
{
    if(cpuSelection == "r")
    {
        resultString = "lose"
    }
    else if(cpuSelection == "p")
    {
        resultString = "win"
    }
    else if(cpuSelection == "s")
    {
        resultString = "draw"
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是教育学生如何制作它的最简单形式,你有什么想法吗?

非常感谢

Gre*_*reg 9

关于什么:

if (playerSelection == "r" && cpuSelection == "r") || (playerSelection == "p" && cpuSelection == "p") || (playerSelection == "s" && cpuSelection == "s") {
    resultString = "draw"
} else if (playerSelection == "r" && cpuSelection == "p") || (playerSelection == "p" && cpuSelection == "s") || (playerSelection == "s" && cpuSelection == "r") {
    resultString = "lose"
} else {
    resultString = "win"
}
Run Code Online (Sandbox Code Playgroud)

//编辑,@ Quince建议:

    if (playerSelection == cpuSelection) {
        resultString = "draw"
    } else if (playerSelection == "r" && cpuSelection == "p") || (playerSelection == "p" && cpuSelection == "s") || (playerSelection == "s" && cpuSelection == "r") {
        resultString = "lose"
    } else {
        resultString = "win"
    }
Run Code Online (Sandbox Code Playgroud)

  • 为什么不让第一个更小,并检查它们是否相等? (5认同)

mar*_*aie 9

let winArray = ["rs", "pr", "sp"]

func getResult(playerSelection:String, cpuSelection:String) -> String {
    if playerSelection == cpuSelection {
        return "draw"
    }
    if winArray.contains(playerSelection + cpuSelection) {
        return "win"
    } else {
        return "lose"
    }
}
resultString = getResult(playerSelection, cpuSelection)
Run Code Online (Sandbox Code Playgroud)

使用枚举安全:

enum GameResult {
    case Win
    case Draw
    case Lose
}

enum Selection {
    case Rock
    case Paper
    case Scissor
}

let winArray:[(Selection, Selection)] = [(.Rock, .Paper), (.Paper, .Scissor), (.Scissor, .Paper)]

func getResult(playerSelection:Selection, cpuSelection:Selection) -> GameResult {
    if playerSelection == cpuSelection {
        return .Draw
    }
    if winArray.contains({$0.0 == playerSelection && $0.1 == cpuSelection}) {
        return .Win
    } else {
        return .Lose
    }
}
let playerSelection:Selection = .Rock
let cpuSelection:Selection = .Scissor
let gameResult = getResult(playerSelection, cpuSelection: cpuSelection)
Run Code Online (Sandbox Code Playgroud)


Wai*_*ain 6

您应该使用枚举来管理数据值.您有3种可能性,但您正在使用显式字符串文字.枚举也促进了switch case语句,在你的情况下会更清楚.

由于你有一组静态的选项,你也不总是需要测试它们中的每一个 - 如果前两个不是真的那么第三个必须是.所以你可以认为这是一场胜利并且可以测试失败或平局.


Cra*_*per 5

尝试嵌套的三元运算符,使用下面的代码在一行中检查它

resultString = ( playerSelection == "r") ? (cpuSelection == "r" ? "draw" : (cpuSelection == "p") ? "lose" : "win") : ((( playerSelection == "p") ? (cpuSelection == "r" ? "win" : ((cpuSelection == "p") ? "draw" : "lose")):((cpuSelection == "r" ? "lose" : ((cpuSelection == "p") ? "win" : "draw")))))
Run Code Online (Sandbox Code Playgroud)

你可以使用枚举和数组循环逻辑.

请检查以下代码.

enum GameResult : Int {
    case None = 0
    case Win = 1
    case Draw = 2
    case Lose = 3
}

enum Selection : Int{

    case Paper = 1
    case Rock = 2
    case Scissor = 3
}

var pSelect = Selection.Paper;
var cSelect = Selection.Rock;
var result = GameResult.None

var playerRotation = (pSelect.rawValue) % 3 + 1;

if(pSelect.rawValue == cSelect.rawValue){
    result = GameResult.Draw
}
else if(playerRotation == cSelect.rawValue){
    result = GameResult.Win
}
else{
    result = GameResult.Lose
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个行数较短,也许是字符数,但远非简单... (6认同)
  • 事实上它可以,这只不是那个时代之一;)一个嵌套的三元是你应该去的最多,然后只在有限的情况下并且可能考虑了BOOL变量 (2认同)
  • 另一个有趣的,如果不明显的解决方案.我总是这么想 - "如果我在3个月内回到这段代码,我能不知道它的具体内容而不必详细考虑它"+1有趣的简短解决方案,在实际代码中我需要一个单行评论来描述帮助未来维护的方法 (2认同)