2014-01-10 3 views
0

Я просто взял 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 в качестве действительной координаты.

Спасибо за помощь, и я прошу прощения, если ответ находится прямо перед моим лицом ...

+0

Вам нужно рекурсивное решение? Я думаю, что ваш итеративный подход, вероятно, проще здесь. –

+0

Мне не обязательно нужно рекурсивное решение, но я полагаю, что рекурсивное решение было бы более привлекательным для глаз. Однако в моем случае код уже потерял апелляцию. Будет ли итеративный подход проще? – user3040968

+0

Вы используете отладчик? Проблемы рекурсии часто легко устраняются с некоторыми стратегическими точками останова. – DeathByTensors

ответ

1
   if (mMinesweeperBoard.get (j, i).equals (".")) 

Вы перешли i и j здесь, так что вы тестируете неправильную ячейку. Отключите их и посмотрите, исправляет ли это это.

+0

Это дало мне индекс массива за пределами исключения, кроме 9? Не знаю, как это произошло точно ... – user3040968

+1

Это, наверное, другая проблема, о которой я упоминал в комментарии. Вы бегаете по сторонам массива, так как у вас есть только половина необходимой проверки границ. – user2357112

+0

Итак, теперь мне нужно будет добавить проверки рядом с проверками на -1? – user3040968