-1

我正在为 APCS 编写黑白棋的 Swing 实现。我的实现只会点击合法位置,但不会翻转中间的瓷砖。为什么会这样,我该如何解决?

以下是相关的代码部分:

private int[][] directions = new int[][] {{0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}};

public void handleTileClick(int x, int y, MouseEvent e) {
    if (player == Tile.EMPTY) return;
    boolean d = false;
    for (int[] dir : directions) {
        int dx = dir[0], dy = dir[1];
        int curX = x, curY = y;
        boolean c = false;
        while (tiles[curX+=dx][curY+=dy].getState() == Tile.opposite(player)) c = true;
        if (c && tiles[curX][curY].getState() == player) {
            while ((curX -= dx) != x && (curY -= dy) != y) {
                tiles[curX][curY].setState(player);
            }
            tiles[x][y].setState(player);
            d = true;
        }
    }
    if (d) swapTurn();
}

为了完整起见,我在这里对所有代码做了一个要点

4

1 回答 1

1

没有输入翻转瓷砖的循环:这应该会更好:

if (c && tiles[curX][curY].getState() == player) {
    do {
        curX -= dx;
        curY -= dy;
        tiles[curX][curY].setState(player);
    } while (curX != x || curY != y);

    tiles[x][y].setState(player);
    d = true;
}

当您接近游戏的边缘时也会出现问题(即边界条件)。当前逻辑将允许 curX 和 curY 成为无效的数组索引。以下似乎有效;改变你认为合适的:

public void handleTileClick(int x, int y, MouseEvent e) {
    if (player == Tile.EMPTY)
        return;
    boolean d = false;
    for (int[] dir : directions) {
        int dx = dir[0], dy = dir[1];
        int curX = x, curY = y;
        boolean c = false;
        while (true) {
            curX += dx;
            curY += dy;
            if (curX > 0 && curX < 8 && curY > 0 && curY < 8 && tiles[curX][curY].getState() == Tile.opposite(player))
                c = true;
            else {
                break;
            }
        }
        if (c && curX > 0 && curX < 8 && curY > 0 && curY < 8 && tiles[curX][curY].getState() == player) {
            do {
                curX -= dx;
                curY -= dy;
                tiles[curX][curY].setState(player);
            } while (curX != x || curY != y);
            tiles[x][y].setState(player);
            d = true;
        }
    }
    if (d)
        swapTurn();
}
于 2018-03-21T02:15:35.050 回答