java-Minesweeper程序递归错误
作者:互联网
我正在用Java为学校创建扫雷程序,并且在清理附近没有地雷的方块时遇到了麻烦,应该禁用该方块,并显示所有周围的方块(如果还有其他方块)没有炸弹的正方形,它将执行相同的操作.我收到一个堆栈溢出错误,我知道这与无限循环有关,但是我找不到它在代码中卡住的位置.
我不知道出了什么问题,所以任何建议都会有所帮助.
这是相对的代码(if语句用于特殊情况,如果单击的正方形在木板的边缘)
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
clicked--;
bArray2[y][x].setBackground(lighterGray);
bArray2[y][x].setEnabled(false);
if (x > 0 && x<gridx-1 && y> 0 && y<gridy-1)
{
clearSquare(y-1, x-1,gridy, gridx, bArray2);
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y-1, x+1,gridy, gridx, bArray2);
clearSquare(y, x-1,gridy, gridx, bArray2);
clearSquare(y, x+1,gridy, gridx, bArray2);
clearSquare(y+1, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
clearSquare(y+1, x+1,gridy, gridx, bArray2);
}
if(y == 0 && x != 0 && x != gridx-1) // top row check
{
clearSquare(y, x-1,gridy, gridx, bArray2);
clearSquare(y, x+1,gridy, gridx, bArray2);
clearSquare(y+1, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
clearSquare(y+1, x+1,gridy, gridx, bArray2);
} // ends top row check
if (y == 0 && x == 0) // corner check top left
{
clearSquare(y, x+1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
clearSquare(y+1, x+1,gridy, gridx, bArray2);
} // ends top left corner check
if (y == 0 && x == gridx-1) // corner check top right row
{
clearSquare(y, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
} // ends top right corner check
if (x == 0 && y != 0 && y != gridy-1) //left column check
{
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y-1, x+1,gridy, gridx, bArray2);
clearSquare(y, x+1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
clearSquare(y+1, x+1,gridy, gridx, bArray2);
} // ends left column check
if (x == gridx-1 && y != 0 && y != gridy-1) // right column check
{
clearSquare(y-1, x-1,gridy, gridx, bArray2);
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x-1,gridy, gridx, bArray2);
clearSquare(y+1, x,gridy, gridx, bArray2);
}// ends right column check
if(y == gridy-1 && x != 0 && x != gridx-1)
{
clearSquare(y-1, x-1,gridy, gridx, bArray2);
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y-1, x+1,gridy, gridx, bArray2);
clearSquare(y, x-1,gridy, gridx, bArray2);
clearSquare(y, x+1,gridy, gridx, bArray2);
} // ends bottom row check
if (y == gridy-1 && x == 0) // left bottom corner check
{
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y-1, x+1,gridy, gridx, bArray2);
clearSquare(y, x+1,gridy, gridx, bArray2);
} // ends left bottom corner check
if (y == gridy-1 && x == gridx-1) // right bottom corner check
{
clearSquare(y-1, x-1,gridy, gridx, bArray2);
clearSquare(y-1, x,gridy, gridx, bArray2);
clearSquare(y, x-1,gridy, gridx, bArray2);
}//ends right bottom corner check
}
private void clearSquare(int y,int x, int gridy, int gridx, JButton[][] bArray2)
{
int value = array[y][x];
System.out.println(value);
String text = bArray2[y][x].getText();
if (text == "")
{
if (value == 0)
{
doClear(y, x, bArray2, gridy, gridx);
}
else{
clicked--;
bArray2[y][x].setText(""+value);
}
}
}
解决方法:
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
if (...already cleared...) {
return;
}
...
}
如果没有该检查,则小区A将清除邻居小区B,后者将清除邻居小区A,后者将清除邻居小区B,…
您发布的代码可以替换为以下代码:
private void handleClick(JButton[][] bGrid, int gridy, int gridx, int y, int x, bool realClick) {
if (x < 0 || x >= gridx || y < 0 || y >= gridx) {
return;
}
JButton button = bGrid[y][x];
if (!button.isEnabled()) {
return;
}
if (realClick) {
--clicked;
}
button.setBackground(lighterGray);
button.setEnabled(false);
if (...is a mine...) {
...
} else {
button.setText(array[y][x]);
if (value == 0) {
handleClick(bGrid, gridy, gridx, y-1, x-1, false);
handleClick(bGrid, gridy, gridx, y-1, x, false);
handleClick(bGrid, gridy, gridx, y-1, x+1, false);
handleClick(bGrid, gridy, gridx, y, x-1, false);
handleClick(bGrid, gridy, gridx, y, x+1, false);
handleClick(bGrid, gridy, gridx, y+1, x-1, false);
handleClick(bGrid, gridy, gridx, y+1, x, false);
handleClick(bGrid, gridy, gridx, y+1, x+1, false);
}
}
}
“数组”需要重命名为明智的名称!
更新:添加了简化代码.
标签:stack-overflow,java,recursion 来源: https://codeday.me/bug/20191102/1992217.html