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