You need to enable JavaScript to run this app. Android Studio Kotlin开发井字棋 首次操作即触发平局提示的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 21:15:04