Ошибка рекурсивной программы 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</gridx-1>
1 ответ

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);
 }
 }
}

"array" нужно переименовать в нечто чувственное!

Обновление: добавлен упрощенный код.

licensed under cc by-sa 3.0 with attribution.