我正在制作一个MineSweeper游戏,当您点击空白磁贴时,“清除所有空白磁贴”时遇到问题。到目前为止,这是我清理瓷砖的方法。
public void clearTiles(int row, int col) {
int newRow, newCol; //up = 0, down = 1, right = 2, left = 3
if (row < 0 && row > flipGrid.length && col < 0 && col > flipGrid[0].length) {
System.out.println("stop");
} else {
if (finalGrid[row - 1][col] == 0 && direction != 1) { //up
flipGrid[row - 1][col] = true;
newRow = row - 1;
newCol = col;
direction = 0;
clearTiles(newRow, newCol);
}
if (finalGrid[row + 1][col] == 0 && direction != 0) { //down
flipGrid[row + 1][col] = true;
newRow = row + 1;
newCol = col;
direction = 1;
clearTiles(newRow, newCol);
}
if (finalGrid[row][col + 1] == 0 && direction != 3) { //right
flipGrid[row][col + 1] = true;
newRow = row;
newCol = col + 1;
direction = 2;
clearTiles(newRow, newCol);
}
if (finalGrid[row][col - 1] == 0 && direction != 2) { //left
flipGrid[row][col - 1] = true;
newRow = row;
newCol = col - 1;
direction = 3;
clearTiles(newRow, newCol - 1);
}
}
}
现在我只有一个清除基础图块上方,下方,右侧和左侧的图块的功能。变量方向确保递归不会在上下或左右之间来回等。当我尝试代码时,我得到一个ArrayIndexOutOfBoundsException:-1。谁能告诉我如何修复我的清晰Tiles方法? 如果您需要完整的代码,请与我联系,我会将其发送给您试用。现在,没有我的clearTiles方法,它可以工作,但你必须点击每个单独的瓷砖。
答案 0 :(得分:0)
你的if应该有OR运算符,因为当你希望它停止时,不必满足所有语句。您可以更轻松地编写递归:)
public void clearTiles(int row, int col) {
if (isOutsideGrid(row,col))
return;
if(isTakenTile(row, col))
return;
if(!isItNewTile(row, col))
return;
flipGrid[row][col] = true;
clearTiles(row, col + 1);
clearTiles(row, col - 1);
clearTiles(row + 1, col);
clearTiles(row - 1, col);
}
boolean isOutsideGrid(row, col){
return (row < 0 || row >= flipGrid.length || col < 0 || col >= flipGrid[0].length) ;
}
更重要的是,我认为你现在应该添加这些方法;)
boolean isItTakenTile(int row, int col){
return finalGrid[row][col] != 0;
}
boolean isItNewTile(int row, int col){
return flipGrid[row][col] == false;
}