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

Java开发井字棋时非首行获胜后GameOver不触发问题求助

问题根因

你的代码存在三个核心错误,直接导致获胜判断逻辑异常:

  • checkGameOver方法的循环逻辑错误,首次循环仅校验顶行获胜组合后就会直接返回结果,中行、底行、列、对角线等其余7组获胜组合完全不会被校验,这就是只有顶行落子1/2/3能触发游戏结束的核心原因。
  • 所有判断电脑获胜的逻辑都错误使用了contains()方法,应该和玩家判断逻辑一致使用containsAll():contains()是判断集合中是否存在单个指定元素,你传入的是整组获胜组合的List对象,而电脑位置集合里存储的是单个数字,永远不可能返回true,电脑获胜判断完全失效。
  • checkWinner方法的平局判断放在循环内部属于逻辑错误,应该移到循环外部,等所有获胜组合都校验完成且无胜者后,再判断是否满格平局。

修正后代码

checkGameOver方法

public static boolean checkGameOver(char [][] gameBoard){
    List<Integer> topRow = Arrays.asList(1, 2, 3);
    List<Integer> midRow = Arrays.asList(4, 5, 6);
    List<Integer> botRow = Arrays.asList(7, 8, 9);

    List<Integer> leftCol = Arrays.asList(1, 4, 7);
    List<Integer> midCol = Arrays.asList(2, 5, 8);
    List<Integer> rightCol = Arrays.asList(3, 6, 9);

    List<Integer> cross1 = Arrays.asList(1, 5, 9);
    List<Integer> cross2 = Arrays.asList(7, 5, 3);

    List<List<Integer>> winConditions = new ArrayList<>();
    winConditions.add(topRow);
    winConditions.add(midRow);
    winConditions.add(botRow);
    winConditions.add(leftCol);
    winConditions.add(midCol);
    winConditions.add(rightCol);
    winConditions.add(cross1);
    winConditions.add(cross2);

    for(List<Integer> condition : winConditions) {
        if(playerPositions.containsAll(condition) || computerPositions.containsAll(condition)) {
            return true;
        }
    }
    // 无获胜者时判断是否满格平局,平局也属于游戏结束
    return playerPositions.size() + computerPositions.size() == 9;
}

checkWinner方法

public static String checkWinner(char [][] gameBoard) {
    List<Integer> topRow = Arrays.asList(1, 2, 3);
    List<Integer> midRow = Arrays.asList(4, 5, 6);
    List<Integer> botRow = Arrays.asList(7, 8, 9);

    List<Integer> leftCol = Arrays.asList(1, 4, 7);
    List<Integer> midCol = Arrays.asList(2, 5, 8);
    List<Integer> rightCol = Arrays.asList(3, 6, 9);

    List<Integer> cross1 = Arrays.asList(1, 5, 9);
    List<Integer> cross2 = Arrays.asList(7, 5, 3);

    List<List<Integer>> winConditions = new ArrayList<>();
    winConditions.add(topRow);
    winConditions.add(midRow);
    winConditions.add(botRow);
    winConditions.add(leftCol);
    winConditions.add(midCol);
    winConditions.add(rightCol);
    winConditions.add(cross1);
    winConditions.add(cross2);

    for(List<Integer> condition : winConditions) {
        if(playerPositions.containsAll(condition)) {
            return "恭喜你赢了!";
        } else if(computerPositions.containsAll(condition)) {
            return "电脑赢了!";
        }
    }
    // 所有获胜条件都不满足再判断平局
    if(playerPositions.size() + computerPositions.size() == 9) {
        return "平局!";
    }
    return "";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:27:05