我正在编写一个简单的扫雷器,但是我找不到合适的方法来显示相邻的地砖。如果一个图块是空白的,则将其显示出来,然后该算法将显示所有相邻的空白图块。但是,我也想展示一层非空白的瓷砖,就像真正的扫雷车一样。
这是我的代码:
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()
不会执行该语句,因为递归检查的图块已经显示)。
所以...是的...我被困住了,我找不到解决方案。任何算法的帮助表示赞赏。
答案 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;
}
}