黑白棋只能在合法的板块中使用,但不会在两者之间翻转
Reversi will only work in legal tiles but it won't flip in between
我正在为 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();
}
为了完整起见,我用所有代码做了一个要点 here
没有输入翻转瓷砖的循环:这应该会更好:
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();
}
我正在为 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();
}
为了完整起见,我用所有代码做了一个要点 here
没有输入翻转瓷砖的循环:这应该会更好:
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();
}