You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sprite Kit(Swift)中是否有更优的游戏结果逻辑处理方式?

嘿,你的代码能正常运行,但确实有不少可以优化的地方,让我们一步步调整,让它更清晰、更易维护:

先说说原代码里的小问题

  1. 拼写错误:userDedected应该是userDetected,这个小疏忽可能会导致潜在的逻辑问题,得先修正。
  2. 重复逻辑:平局的判断在userDetected为true和false的分支里重复写了,完全可以合并。
  3. 模糊的变量命名:az、bz这种命名太抽象,得靠注释才能明白含义,可读性很差。
  4. 打印文本笔误:比如"User won az < az"明显是写错了,硬编码字符串很容易出现这类低级错误。
  5. 依赖全局状态:函数逻辑绑定外部的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:52:57