Java Reversi将只在合法瓷砖中使用,但它赢得了';不要在两者之间摇摆
我正在为APCS编写Reversi的Swing实现。我的实现只会在合法位置点击,但不会在中间翻转瓷砖。这是为什么?我该如何修复它 以下是代码的相关部分:Java Reversi将只在合法瓷砖中使用,但它赢得了';不要在两者之间摇摆,java,swing,reversi,Java,Swing,Reversi,我正在为APCS编写Reversi的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) {
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();
}
为了完整起见,我已经对所有代码做了一个要点,即没有输入翻转磁贴的循环:这应该可以更好地工作:
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();
}
public void handleleclick(int x,int y,MouseEvent e){
如果(玩家==平铺。空)
返回;
布尔d=假;
for(int[]目录:方向){
int dx=dir[0],dy=dir[1];
int curX=x,curY=y;
布尔c=假;
while(true){
curX+=dx;
curY+=dy;
如果(curX>0&&curX<8&&curY>0&&curY<8&&tiles[curX][curY].getState()==Tile.container(播放器))
c=正确;
否则{
打破
}
}
如果(c&&curX>0&&curX<8&&curY>0&&curY<8&&tiles[curX][curY].getState()==player){
做{
curX-=dx;
curY-=dy;
tiles[curX][curY].setState(播放器);
}while(curX!=x | | curY!=y);
瓷砖[x][y]。设置状态(播放器);
d=正确;
}
}
如果(d)
swapTurn();
}
若要更快地获得更好的帮助,请发布or。谢谢!现在我有另一个bug,有时候它会拒绝采取法律行动,但那是另一天。听起来不错。如果你那时需要帮助,请告诉我。干杯