Android Studio Kotlin开发井字棋 首次操作即触发平局提示的问题排查
现有代码的核心问题
- 判定逻辑完全错位:你目前写的所有if分支,只要单个玩家的落子列表没有占满任意一条获胜连线,就会直接触发平局提示。比如你完成第一次落子,给
firstPLayer加了位置1,此时secondPLayer还是空列表,代码里!secondPLayer.contains(1) && !secondPLayer.contains(2) && !secondPLayer.contains(3)这个条件100%成立,自然会直接弹出“Draw!”提示。 - 遗漏了平局的必要前置条件:平局必须同时满足两个要求才算数——第一,所有获胜连线都没有被任意玩家凑齐;第二,棋盘上9个格子全部完成落子。只要还有空闲格子能落子,哪怕当前没有人赢,也根本不满足平局的判定标准。
修正后的实现方案
首先把重复的获胜连线抽成公共常量,避免写十几段重复判断:
// 预定义所有可能的获胜连线组合 private val winCombinations = listOf( listOf(1,2,3), listOf(4,5,6), listOf(7,8,9), // 横向三行 listOf(1,4,7), listOf(2,5,8), listOf(3,6,9), // 纵向三列 listOf(1,5,9), listOf(3,5,7) // 两条对角线 )
按照正确的判定逻辑重写draw()函数:
private fun draw() { // 第一步:先排查是否有玩家已经获胜,有人赢就直接返回,不触发平局提示 val firstPlayerWin = winCombinations.any { winLine -> winLine.all { pos -> firstPLayer.contains(pos) } } val secondPlayerWin = winCombinations.any { winLine -> winLine.all { pos -> secondPLayer.contains(pos) } } if (firstPlayerWin || secondPlayerWin) return // 第二步:没人获胜的前提下,检查棋盘是否全部落满 val totalFilledCount = firstPLayer.size + secondPLayer.size if (totalFilledCount == 9) { resultView.text = "Draw!" } }
之前的代码之所以会出现第一次点击就弹平局的问题,本质是把「某条连线没被某个玩家占全」当成了平局触发条件——毕竟哪怕棋盘上只落了1个棋子,绝大多数连线都不可能被占全,自然会无差别触发提示。
内容的提问来源于stack exchange,提问作者Tornike_14
相关产品推荐
相关产品推荐

