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
为什么这个方案更靠谱?
- 消除冗余代码:用映射表替代了原来9段重复的判断逻辑,维护起来更方便;
- 逻辑闭环:
do-while循环会先生成位置、检查占用状态,直到找到可用位置才停止,不会出现原来代码里的漏判或死循环问题; - 扩展性强:如果以后要调整棋盘位置和编号的对应关系,只需要修改映射表就行,不用动循环逻辑。
内容的提问来源于stack exchange,提问作者Blake Bailey
相关产品推荐
相关产品推荐

