如何修正井字棋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 }
关键修正点
- 移除了对总落子数量的限制,哪怕仅下了3个子,只要形成连线就能立即判定胜负。
- 保留核心的获胜组合检测逻辑,遍历所有可能的三子连线,一旦检测到某一方的子占据完整连线,直接返回该玩家作为胜者。
- 调用逻辑:在玩家每一步落子、更新棋盘状态后,立即调用这个函数。如果返回非
null的Player值,就触发游戏结束流程(比如弹出获胜提示、锁定棋盘禁止继续落子)。
内容的提问来源于stack exchange,提问作者Jinzu
相关产品推荐
相关产品推荐

