3
我在学校为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);
}
}
}
顺便说一句,如果你在顶部和底部有一个额外的行和在左侧和右侧有一个额外的列,你将需要少得多的代码。保持这些隐藏设置的初始状态清除。 – ikegami 2011-06-08 00:17:48
我已添加到我的答案中。原来还有另一种简化代码的方法,不需要添加额外的行和列。 – ikegami 2011-06-08 00:41:26