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

7×7矩阵人机对战井字棋:空位检测与电脑落子逻辑求助

修复7×7矩阵人机对战井字棋的电脑落子逻辑问题

看起来你在电脑落子这块卡壳了——原来的代码不仅重复冗余,还因为while和if的逻辑错误导致没法正确避开已占用的位置。我来帮你梳理解决思路:


第一步:实现occupied布尔检测方法

首先你需要的这个检测方法非常简单,核心就是判断指定棋盘位置已经被玩家(X)或电脑(O)占用了。假设你初始化棋盘时空白位置用的是空格' ',代码可以这么写:

// 检测单个棋盘位置是否已被占用
public static boolean occupied(char position) {
    // 如果是X或O,说明已被占用,返回true;否则返回false
    return position == 'X' || position == 'O';
}

第二步:重构ComputerPlays方法的落子逻辑

原来的代码把每个位置号(1-9)都写了一遍重复逻辑,还误用了while循环,很容易出现死循环或者漏判的情况。我们可以用位置映射+循环检测的方式简化逻辑,一次性解决问题:

public static char[][] ComputerPlays(char[][] M) {
    System.out.println("Computer selects grid position...");
    
    // 建立「位置号(1-9)」到「7×7棋盘坐标」的映射表
    // 索引对应位置号-1,每个元素存[row, col]
    int[][] positionToCoord = {
        {1, 1}, // 位置1
        {1, 3}, // 位置2
        {1, 5}, // 位置3
        {3, 1}, // 位置4
        {3, 3}, // 位置5
        {3, 5}, // 位置6
        {5, 1}, // 位置7
        {5, 3}, // 位置8
        {5, 5}  // 位置9
    };
    
    int selectedPosition;
    int targetRow, targetCol;
    
    // 循环直到找到未被占用的位置
    do {
        // 生成1-9的随机位置号
        selectedPosition = (int)(Math.random() * 9) + 1;
        // 把位置号转换成对应的棋盘坐标
        targetRow = positionToCoord[selectedPosition - 1][0];
        targetCol = positionToCoord[selectedPosition - 1][1];
    } while (occupied(M[targetRow][targetCol])); // 如果位置被占用,继续随机生成
    
    // 确认位置可用后,电脑落子O
    M[targetRow][targetCol] = 'O';
    return M;
}//end Computer Play

为什么这个方案更靠谱?

  1. 消除冗余代码:用映射表替代了原来9段重复的判断逻辑,维护起来更方便;
  2. 逻辑闭环:do-while循环会先生成位置、检查占用状态,直到找到可用位置才停止,不会出现原来代码里的漏判或死循环问题;
  3. 扩展性强:如果以后要调整棋盘位置和编号的对应关系,只需要修改映射表就行,不用动循环逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:35:25