在Minesweeper中需要有关揭示相邻图块的算法帮助

时间:2019-06-06 22:14:20

标签: java algorithm

我正在编写一个简单的扫雷器,但是我找不到合适的方法来显示相邻的地砖。如果一个图块是空白的,则将其显示出来,然后该算法将显示所有相邻的空白图块。但是,我也想展示一层非空白的瓷砖,就像真正的扫雷车一样。

这是我的代码:

void revealAdjCells(Tile [][] t,int x, int y) {
        if (!checkBounds(x,y)) {                    
            return; // check for bounds
        }

           if ((t[x][y].getNeighbours() == 0) && (!t[x][y].getVisibleState())) { // NO neighbours and not revealed
               t[x][y].setVisibleState(true); // reveal tile

               revealAdjCells(t,x+1,y); // recursion, reveal adjacent tiles
               revealAdjCells(t,x-1,y);
               revealAdjCells(t,x,y-1);
               revealAdjCells(t,x,y+1);
            } 
           else 
           {
               return;
           }
        }

getNeighbours()返回包围附近图块(水平,垂直,对角线)的炸弹数量,getVisibleState()返回一个布尔值,指示是否显示了图块。

我尝试过的事情:

1)从if条件中删除getVisibleState()(糟糕的主意,显然会导致堆栈溢出)。

2)检查边界(x-1,x + 1,y + 1,y-1),然后相应地显示图块(无效,getVisibleState()不会执行该语句,因为递归检查的图块已经显示)。

所以...是的...我被困住了,我找不到解决方案。任何算法的帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您的代码已经结束,但是如果t[x][y].getNeighbours() != 0,您不会显示图块,而应该这样做。也许像这样:

void revealAdjCells(Tile [][] t,int x, int y) {

    // if out of bounds **or** if already revealed, return
    if (!checkBounds(x,y) || t[x][y].getVisibleState()) {                    
        return;
    }


    t[x][y].setVisibleState(true); // reveal tile **here **

    // do recursion only if no neighbors
    if (t[x][y].getNeighbours() == 0) { 
        // t[x][y].setVisibleState(true); // not **here**

        revealAdjCells(t,x+1,y); 
        revealAdjCells(t,x-1,y);
        revealAdjCells(t,x,y-1);
        revealAdjCells(t,x,y+1);
    } else {
        return;
    }
}