Sprite Kit(Swift)中是否有更优的游戏结果逻辑处理方式?
嘿,你的代码能正常运行,但确实有不少可以优化的地方,让我们一步步调整,让它更清晰、更易维护:
先说说原代码里的小问题
- 拼写错误:
userDedected应该是userDetected,这个小疏忽可能会导致潜在的逻辑问题,得先修正。 - 重复逻辑:平局的判断在
userDetected为true和false的分支里重复写了,完全可以合并。 - 模糊的变量命名:
az、bz这种命名太抽象,得靠注释才能明白含义,可读性很差。 - 打印文本笔误:比如
"User won az < az"明显是写错了,硬编码字符串很容易出现这类低级错误。 - 依赖全局状态:函数逻辑绑定外部的
GameData.shared,这样的函数很难单独测试,也不够健壮。
优化方案:纯函数+枚举(最推荐)
我们可以把结果计算和全局状态分离,让函数只依赖传入的参数,同时用枚举统一管理游戏结果,这样代码更清晰、可测试、易扩展:
首先定义一个枚举来表示游戏结果:
enum GameResult { case win, lose, draw }
然后写一个纯函数来计算结果,它不依赖任何全局状态,只看传入的玩家答案、对手答案和正确答案:
func calculateGameResult(playerAnswer: Int, opponentAnswer: Int, correctAnswer: Int) -> GameResult { let playerDiff = abs(playerAnswer - correctAnswer) let opponentDiff = abs(opponentAnswer - correctAnswer) if playerDiff == opponentDiff { return .draw } return playerDiff < opponentDiff ? .win : .lose }
最后在需要使用的地方,根据userDetected的状态来决定哪个参数是玩家的答案:
// 对应原函数逻辑:userDetected为true时,a是玩家答案,b是对手答案;反之则a是对手答案,b是玩家答案 let gameResult = GameData.shared.userDetected ? calculateGameResult(playerAnswer: a, opponentAnswer: b, correctAnswer: z) : calculateGameResult(playerAnswer: b, opponentAnswer: a, correctAnswer: z) // 后续根据结果做操作,比如打印或者更新UI switch gameResult { case .win: print("User won") case .lose: print("User lost") case .draw: print("Draw") }
如果你不想改动太大,简化版优化
如果暂时不想调整函数的参数结构,也可以直接简化原代码,消除重复逻辑:
func result(a: Int, b: Int, z: Int) { // 修正拼写错误 let isUserFirst = GameData.shared.userDetected // 一次性计算用户和对手的差值,避免分支内重复计算 let userDiff = isUserFirst ? abs(a - z) : abs(b - z) let opponentDiff = isUserFirst ? abs(b - z) : abs(a - z) var resultText: String if userDiff == opponentDiff { resultText = "Draw" } else if userDiff < opponentDiff { resultText = "User won" } else { resultText = "User lost" } print(resultText) }
为什么这些优化更好?
- 纯函数更可靠:
calculateGameResult只依赖传入的参数,你可以单独测试各种场景(比如玩家赢、输、平局的情况),不用依赖GameData的状态,调试起来更方便。 - 可读性提升:变量和参数都用明确的名称,比如
playerDiff、opponentAnswer,不用再靠注释解释含义。 - 扩展性更强:用枚举管理结果后,后续如果需要把结果用于UI展示、统计数据或者其他逻辑,直接使用枚举值即可,不用修改打印字符串的代码。
- 消除重复代码:把重复的判断逻辑合并,代码更简洁,也减少了出错的概率。
内容的提问来源于stack exchange,提问作者Tom B.
相关产品推荐
相关产品推荐

