数组的递归问题

时间:2018-01-26 23:53:05

标签: java recursion minesweeper

我正在制作一个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方法,它可以工作,但你必须点击每个单独的瓷砖。

1 个答案:

答案 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;
}