gpt4 book ai didi

java - 扫雷程序递归错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:38 26 4
gpt4 key购买 nike

我正在用 java 为学校创建一个扫雷程序,但在清除旁边没有地雷的方 block 时遇到了问题,该方 block 应该被禁用,并且所有周围的方 block 都显示出来,如果还有一个没有碰到炸弹的方 block ,它会执行同样的操作。我收到堆栈溢出错误,我知道这与无限循环有关,但我找不到它在我的代码中卡住的位置。

我不知道出了什么问题,所以任何建议都会有所帮助。

下面是相关的代码(if语句是针对特殊情况,如果点击的方 block 在棋盘的边缘)

 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,邻居单元格 B 将清除邻居单元格 A,邻居单元格 B 将清除邻居单元格 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);
}
}
}

array”需要重命名为有意义的东西!

更新:添加了简化的代码。

关于java - 扫雷程序递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com