【发布时间】:2018-01-08 15:38:07
【问题描述】:
我正在使用 Swing 在 Java 中下象棋,并且我已经想出了如何检查每个棋子的合法移动。那部分没有任何问题。但是现在,我在检查路径是否空闲时遇到了问题。例如,国际象棋中的所有棋子都不能跳过一个棋子,除非它是马。如果一个棋子挡住了主教的路径,它不能超过棋子。我调用了检查路径是否空闲的方法isVectorFree()。它适用于水平和垂直路径,但不适用于对角路径。
这是isVectorFree()的代码:
public boolean isVectorFree(int x1, int y1, int x2, int y2) {
if (x1 == x2 && y1 > y2) { // horizontal north
for (int i = y1 - 1; i > y2; i--) {
if (piecePositions[i][x1] != null) {
return false;
}
}
} else if (x1 < x2 && y1 == y2) { // horizontal east
for (int i = x1 + 1; i < x2; i++) {
if (piecePositions[y1][i] != null) {
return false;
}
}
} else if (x1 == x2 && y1 < y2) { // horizontal south
for (int i = y1 + 1; i < y2; i++) {
if (piecePositions[i][x1] != null) {
return false;
}
}
} else if (x1 > x2 && y1 == y2) { // horizontal west
for (int i = x1 - 1; i > x2; i--) {
if (piecePositions[y1][i] != null) {
return false;
}
}
}
else if (x1 < x2 && y1 > y2) { // diagonal northeast
// these diagonals aren't working properly
for (int row = x1 + 1; row < x2; row++) {
for (int col = y1 - 1; col >= y2; col--) {
if (piecePositions[row][col] != null) {
return false;
}
}
}
} else if (x1 < x2 && y1 < y2) { // diagonal southeast
for (int row = x1 + 1; row < x2; row++) {
for (int col = y1 + 1; col < y2; col++) {
if (piecePositions[row][col] != null) {
return false;
}
}
}
} else if (x1 > x2 && y1 < y2) { // diagonal southwest
for (int row = x1 - 1; row >= x2; row--) {
for (int col = y1 + 1; col < y2; col++) {
if (piecePositions[row][col] != null) {
return false;
}
}
}
} else if (x1 > x2 && y1 > y2) { // diagonal northwest
for (int row = x1 - 1; row >= x2; row--) {
for (int col = y1 - 1; col >= y2; col--) {
if (piecePositions[row][col] != null) {
return false;
}
}
}
}
return true;
}
此方法获取矩阵piecePositions中的棋子x坐标x1和y坐标y1以及所需的x坐标x2和所需的y坐标y2,以查看当前之间的路径是否坐标和所需坐标是免费的,但正如我之前所说,这不适用于对角线。具体来说,isVectorFree() 受到周围碎片的影响。在棋盘的起始位置,如果我将棋子移开为主教让路,即使道路现在对主教来说是空闲的,由于某种原因,它仍然无法在整个路径中移动。
我该如何解决这个问题?
【问题讨论】:
-
一步一步调试它
-
在尝试提出更多问题之前,请阅读Why is “Can someone help me?” not an actual question?。
-
经过调试,我认为对角线的 for 循环不正确,实际上并没有检查对角线。