我正在写一个简单的扫雷艇,但我找不到一个方法来揭示相邻的瓷砖适当如果平铺为空,则显示该平铺,然后算法显示所有相邻的空白平铺。不过,我想揭示一层非空白瓷砖,就像真正的扫雷艇。
这是我的代码:

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()不会让语句执行,因为递归检查的平铺已经显示)。
所以…是啊。。。我卡住了,找不到解决办法。任何算法上的帮助都是值得赞赏的。

最佳答案

您的代码很接近,但如果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;
    }
}

关于java - 在Minesweeper中需要有关揭示相邻图块的算法帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56485717/

10-09 09:10