Java Swing国际象棋isVectorFree方法对角线路径检测异常修复求助
问题分析与修复方案
嘿,我一眼就发现了两个导致对角线路径检测失效的关键问题:
1. 对角线检测用了错误的嵌套循环
你现在的对角线分支用了两层for循环,这会遍历整个矩形区域内的所有格子,而不是只检查对角线上的路径点。比如东北方向的检测,你会把x从x1+1到x2之间的所有列,和y从y1-1到y2之间的所有行的交叉点都检查一遍——哪怕这些点不在主教的移动路径上,只要有棋子就会返回false,这就是为什么你移走阻挡的兵后,主教还是没法移动的原因。
正确的做法应该是同步遍历对角线上的每一个点:每一步同时增减x和y坐标,只检查路径上的格子。
2. 混淆了坐标与数组索引的对应关系
看你水平/垂直方向的代码,piecePositions[i][x1]里,第一个索引是y坐标(行),第二个是x坐标(列)。但在对角线分支里,你错误地把x坐标当成了数组的行索引(row = x1 + 1),这完全搞反了行列对应关系,导致你检查的是错误的格子!
修复后的完整代码
下面是修正后的isVectorFree()方法,我已经修复了上述两个问题:
public boolean isVectorFree(int x1, int y1, int x2, int y2) { // 垂直方向(南北) if (x1 == x2) { int start = Math.min(y1, y2) + 1; int end = Math.max(y1, y2); for (int row = start; row < end; row++) { if (piecePositions[row][x1] != null) { return false; } } } // 水平方向(东西) else if (y1 == y2) { int start = Math.min(x1, x2) + 1; int end = Math.max(x1, x2); for (int col = start; col < end; col++) { if (piecePositions[y1][col] != null) { return false; } } } // 对角线方向 else { int colStep = x2 > x1 ? 1 : -1; // x方向步长:东为+1,西为-1 int rowStep = y2 > y1 ? 1 : -1; // y方向步长:南为+1,北为-1 int currentCol = x1 + colStep; int currentRow = y1 + rowStep; // 遍历对角线上的每一个中间点 while (currentCol != x2 && currentRow != y2) { if (piecePositions[currentRow][currentCol] != null) { return false; } currentCol += colStep; currentRow += rowStep; } } return true; }
代码说明
- 简化水平/垂直检测:用
Math.min和Math.max统一处理方向,避免重复的if分支,代码更简洁。 - 统一对角线处理:通过步长变量
colStep和rowStep判断x、y方向的增减,用单循环遍历对角线上的每一个中间点,只检查路径上的格子。 - 修正索引对应关系:严格遵守
piecePositions[row][col](row对应y坐标,col对应x坐标)的规则,确保检查的是正确的格子。
这样修改后,主教、王后这类走对角线的棋子就能正确检测路径是否畅通了,不会再被非路径上的棋子干扰。
内容的提问来源于stack exchange,提问作者parrot15
相关产品推荐
相关产品推荐

