Я просто взял Java несколько дней назад и начал кодировать игру «Сапер». Проблема в том, что когда я пытаюсь каскадировать окружающие блоки и обнаруживать блоки, либо пустые, либо цифры в зависимости от количества смежных бомб, моя рекурсия терпит неудачу и дает мне стек над ошибкой потока. Мой код выглядит следующим образом.Java Recursion Issue: Minesweeper
public void revealCell(int row, int col)
{
if(mAnswerBoard.get (row, col).equals ("1")||mAnswerBoard.get (row, col).equals("2")||
mAnswerBoard.get (row, col).equals("3")||mAnswerBoard.get (row, col).equals("4")||
mAnswerBoard.get (row, col).equals("5"))
{
mMinesweeperBoard.set (row, col, mAnswerBoard.get (row, col));
return;
}
else if(mAnswerBoard.get (row, col).equals("0"))
{
mMinesweeperBoard.set (row, col, " ");
for(int i = row - 1; i <= row + 1; i++)
{
if (i == -1)
{
i = 0;
}
for(int j = col - 1; j <= col + 1; j++)
{
if (j == -1)
{
j = 0;
}
if (mAnswerBoard.get (i, j).equals ("0") == false)
{
mMinesweeperBoard.set (i, j, mAnswerBoard.get (i, j));
}
else if (mAnswerBoard.get (i, j).equals (("0")))
{
if (mMinesweeperBoard.get (j, i).equals ("."))
{
mMinesweeperBoard.set(i, j, " ");
revealCell(i, j);
}
}
}
}
}
}
Я смотрел на это в течение нескольких часов, и я действительно не могу понять мою голову вокруг, почему это не останавливает цикл. Моя первая игровая площадка держится "." в не выявленных местах, а если 0, доска будет содержать пробелы. Я пытаюсь проверить, содержит ли ключ ответа 0 в месте, и если это произойдет, и если фактическая доска все еще содержит "." в месте, я могу задать пробел. По какой-то причине openCell получает вызов снова и снова, и я действительно не могу понять это. Я делаю что-то совершенно не так?
Боковое примечание: мне нужно установить i и j в 0, если они равны -1, потому что мой код позволяет пользователю ввести 0,0 в качестве действительной координаты.
Спасибо за помощь, и я прошу прощения, если ответ находится прямо перед моим лицом ...
Вам нужно рекурсивное решение? Я думаю, что ваш итеративный подход, вероятно, проще здесь. –
Мне не обязательно нужно рекурсивное решение, но я полагаю, что рекурсивное решение было бы более привлекательным для глаз. Однако в моем случае код уже потерял апелляцию. Будет ли итеративный подход проще? – user3040968
Вы используете отладчик? Проблемы рекурсии часто легко устраняются с некоторыми стратегическими точками останова. – DeathByTensors