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

如何修正井字棋checkForWinner函数,实现每步后正确判定获胜玩家?

修正Jetpack Compose井字棋的checkForWinner函数实现

核心修正思路是移除原函数中限制胜负判定的前置条件(比如要求双方都落子一定数量才检查),让函数在每一步落子后都能直接检测是否有玩家形成获胜连线。

原函数常见问题示例

很多初始实现会加入不必要的落子数判断,导致必须双方都落子后才触发胜负检测:

// 存在问题的原函数
fun checkForWinner(board: List<Player?>): Player? {
    // 错误限制:必须至少5个子才判断胜负
    if (board.count { it != null } < 5) return null

    val winningCombos = listOf(
        listOf(0,1,2), listOf(3,4,5), listOf(6,7,8),
        listOf(0,3,6), listOf(1,4,7), listOf(2,5,8),
        listOf(0,4,8), listOf(2,4,6)
    )

    for (combo in winningCombos) {
        val (a, b, c) = combo
        if (board[a] != null && board[a] == board[b] && board[b] == board[c]) {
            return board[a]
        }
    }
    return null
}

修正后的函数实现

// 每步落子后可立即调用的胜负判定函数
fun checkForWinner(board: List<Player?>): Player? {
    // 定义所有可能的三子获胜连线组合
    val winningCombos = listOf(
        listOf(0,1,2), listOf(3,4,5), listOf(6,7,8), // 横向连线
        listOf(0,3,6), listOf(1,4,7), listOf(2,5,8), // 纵向连线
        listOf(0,4,8), listOf(2,4,6) // 斜向连线
    )

    // 遍历所有获胜组合,只要找到有效连线就立即返回胜者
    for (combo in winningCombos) {
        val (a, b, c) = combo
        val currentPlayer = board[a]
        if (currentPlayer != null && currentPlayer == board[b] && currentPlayer == board[c]) {
            return currentPlayer
        }
    }

    // 无胜者时返回null,可继续游戏或后续判断平局
    return null
}

关键修正点

  1. 移除了对总落子数量的限制,哪怕仅下了3个子,只要形成连线就能立即判定胜负。
  2. 保留核心的获胜组合检测逻辑,遍历所有可能的三子连线,一旦检测到某一方的子占据完整连线,直接返回该玩家作为胜者。
  3. 调用逻辑:在玩家每一步落子、更新棋盘状态后,立即调用这个函数。如果返回非null的Player值,就触发游戏结束流程(比如弹出获胜提示、锁定棋盘禁止继续落子)。

内容的提问来源于stack exchange,提问作者Jinzu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:59:56