国际象棋,检查路径是否免费无法正常工作

时间:2018-01-08 15:38:08

标签: java swing matrix chess

我正在使用Swing用J​​ava制作国际象棋,我已经找到了如何检查每件作品的合法动作。这部分没有错。但现在,我在检查路径是否空闲时遇到问题。例如,国际象棋中的所有棋子都不能跳过一块,除非它是骑士。如果一个棋子阻挡了一个主教的路径,它就不会超过典当。我调用了检查路径是否空闲的方法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;
}

此方法采用矩阵x1中所需的x坐标y1和y坐标piecePositions以及所需的x坐标x2和所需的y坐标y2为了查看当前坐标和所需坐标之间的路径是否空闲,但正如我之前所说,这对于对角线来说是不正常的。具体而言,isVectorFree()受到周围作品的影响。在国际象棋棋盘的起始位置,如果我将棋子移开为主教让位,即使主教徒现在可以自由通行,但由于某种原因,它仍然无法在整个路径上移动。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

在特定的对角线上,每一行和每一列都是唯一的,不是吗?

如果(2,4)在你的对角线上,(2,3)不能在同一对角线上。

现在看看你的for循环,对于循环几个cols的每个行值。

你应该有一个循环,比如索引i,然后使用i的值递增/递减row和col。

答案 1 :(得分:1)

你的嵌套for循环意味着你要对角地检查那个方向上的所有东西(整个方块)。所以,如果你在(0,0)并尝试移动到(3,3),你的代码就是检查(1,1),(1,2),(1,3),(2,1),( 2,2),(2,3),(3,1),(3,2)和(3,3)。您只想检查路径(1,1),(2,2),(3,3)。

假设移动有效(即abs(y1 - y2) == abs(x1 - x2)),循环差异而不是坐标本身:

} else if (x1 < x2 && y1 > y2) { // diagonal northeast
    for (int i = x2 - x1; i > 0; i--) {
        if (piecePositions[x1 + i][y1 - i] != null) {
            return false;
        }
    }
}