2013-04-23 7 views
1

При попытке запустить этот код я столкнулся с ошибкой, но не при компиляции. В конце каждого метода направления я вызываю следующий метод в том порядке, в котором должен идти. То, что я пытаюсь сделать, это сделать программу, которая будет читать лабиринт из файла и решить его. Решая это, я хочу, чтобы программа помещала P для пути, который он принял, и V для тех мест, которые уже были посещены. Программе разрешено идти вперед влево, а затем назад для каждого направления. Когда вы идете в другом направлении, вам придется по-прежнему следовать этим правилам, за исключением того, что то, как вы смотрите, теперь является новым.Программа компилируется, но она дает ошибку при запуске

Maze Код:

public static boolean goNorth(){ 
     boolean success; 
     if(maze[startCol][startRow] == maze[finishCol][finishRow]){ 
     return true; 
     } 
      if(maze[startCol][startRow - 1] == CLEAR){ 
       maze[startCol][startRow - 1] = PATH; 
       startRow = startRow - 1; 
       goNorth(); 
       if(maze[startCol][startRow - 1] == PATH){ 
        maze[startCol][startRow - 1] = VISITED; 
        startRow = startRow - 1; 
        goNorth(); 
        if (maze[startCol][startRow - 1] == VISITED){ 
         goSouth(); 
        } 
       } 
      } 
     goWest(); 
     return true;  
    } 


    public static boolean goEast(){ 
     boolean success; 
     if(maze[startCol][startRow] == maze[finishCol][finishRow]){ 
     return true; 
     } 
      if(maze[startCol + 1][startRow] == CLEAR){ 
       maze[startCol + 1][startRow] = PATH; 
       startCol = startCol + 1; 
       goEast(); 
       if(maze[startCol + 1][startRow] == PATH){ 
        maze[startCol + 1][startRow] = VISITED; 
        startCol = startCol + 1; 
        goEast(); 
        if(maze[startCol + 1][startRow] == VISITED){ 
         goWest(); 
        } 
       } 
      } 
     goNorth(); 
     return false; 
    } 


    public static boolean goSouth(){ 
     boolean success; 
     if(maze[startCol][startRow] == maze[finishCol][finishRow]){ 
      return true; 
      } 

      if(maze[startCol][startRow + 1] == CLEAR){ 
       maze[startCol][startRow + 1] = PATH; 
       startRow = startRow + 1; 
       goSouth(); 
       if(maze[startCol][startRow + 1] == PATH){ 
        maze[startCol][startRow + 1] = VISITED; 
        startRow = startRow + 1; 
        goSouth(); 
        if (maze[startCol][startRow + 1] == VISITED){ 
         goNorth(); 
        } 
       } 
      } 
     goEast(); 
     return false; 
     } 

    public static boolean goWest(){ 
     boolean success; 
     if(maze[startCol][startRow] == maze[finishCol][finishRow]){ 
     return true; 
     } 
      if(maze[startCol - 1][startRow] == CLEAR){ 
       maze[startCol - 1][startRow] = PATH; 
       startCol = startCol - 1; 
       goWest(); 
       if(maze[startCol - 1][startRow] == PATH){ 
        maze[startCol - 1][startRow] = VISITED; 
        startCol = startCol - 1; 
        goWest(); 
        if(maze[startCol - 1][startRow] == VISITED){ 
         goEast(); 
        } 
       } 
      } 
     goSouth(); 
     return false; 
    } 
} 

Maze.txt:

20 7 
0 18 
6 12 
xxxxxxxxxxxxxxxxxx x 
x  x  xxxx x 
x xxxxx xxxxx xx x 
x xxxxx xxxxxxx xx x 
x   xx xx x 
x xxxxxxxxxx xx x 
xxxxxxxxxxxx xxxxxxx 

Ошибка:

http://s22.postimg.org/etar0eq1t/Code.png

+2

Это слишком много кода. Обрежьте это до небольшой программы, которая показывает вашу проблему. – Keppil

+2

Судя по ошибке и вопросу, я не думаю, что он знает, как это сделать. –

+4

Ваш захват экрана ошибки не отображает сообщение об ошибке, а только часть стека вызовов. Мой хрустальный шар говорит, что ошибка - переполнение стека. Похоже, что у вас может быть бесконечная рекурсия. –

ответ

4

Понял. Ваш код начинается с звонка на Север, который, если не ясно, называет Запад, который, если не ясно, называет Юг, затем Восток. К сожалению, ваш восточный призыв не ясен, а затем снова называет Север, который будет зацикливать выше и взорвать ваш стек. Для вашей рекурсии вам нужен лучший вариант завершения.

Кроме того, здесь отсутствует обнаружение «края карты», так что может быть возможно выйти из вашего лабиринта и памяти мусора при условии плохого запуска. Представьте, что ваша стартовая позиция находится на северном краю вашего лабиринта. Ваш первый звонок - пойти на север, который читает ваш массив и взрывает все. Вам нужно проверить размер карты в вашем заливе, прогуливать лабиринтные звонки.

+0

Хорошо, это имеет большой смысл. Благодарю. – Jaylon253

+0

Хорошо, пытаясь сделать случай завершения лучше, я столкнулся с проблемой, где я должен поставить случай завершения. Я начинающий Java и программист. – Jaylon253

+0

И не могли бы вы показать мне пример этого? – Jaylon253

Смежные вопросы