2016-12-06 1 views
-1
import java.lang.reflect.Array; 
    import java.util.*; 


    public class TMS { 

     private static int row = 5, col = 5; 
     private static String[][] board = new String[row][col]; 
     private static String[][] board_copy = new String[row][col]; 

     public static void main(String[] args) { 
      for(String[] array:board) { 
       Arrays.fill(array, "_"); 
      } 
      create_mines(); 
      Scanner input = new Scanner(System.in); 
      int inpx = 0, inpy; 

      while(inpx != 69){ 
       show_board(); 
       inpx = input.nextInt(); 
       inpy = input.nextInt(); 
       if(board_copy[inpx][inpy] == "*"){ 
        System.out.println("YOU LOOSE"); 
        break; 
       } 
       check_move(inpx, inpy); 
      } 
     } 

     public static void show_board() { 
      for(String[] row: board){ 
       for(String element: row){ 
        System.out.print(element+"\t"); 
       }System.out.println(); 
      } 
     } 

     public static void create_mines() { 
      Random rand = new Random(); 
      rand.nextInt(); 

      for(String[] array:board_copy) { 
       Arrays.fill(array, "_"); 
      } 
      board_copy[1][1] = "*"; 
      board_copy[3][1] = "*"; 
      board_copy[3][3] = "*"; 
      board_copy[2][4] = "*"; 
     } 

     public static void check_move(int posx, int posy){ 
      int mines = 0; 
      if(posx-1 >= 0 && posy-1 >= 0) 
       mines = (board_copy[posx-1][posy-1] == "*")? (mines+1):mines; 
      if(posx >= 0 && posy-1 >= 0) 
       mines = (board_copy[posx][posy-1] == "*")? (mines+1):mines; 
      if(posx+1 < row && posy+1 < col) 
       mines = (board_copy[posx+1][posy+1] == "*")? (mines+1):mines; 
      if(posx-1 >= 0 && posy >= 0) 
       mines = (board_copy[posx-1][posy] == "*")? (mines+1):mines; 
      if(posx+1 < row && posy >= 0) 
       mines = (board_copy[posx+1][posy] == "*")? (mines+1):mines; 
      if(posx >= 0 && posy+1 < col) 
       mines = (board_copy[posx][posy+1] == "*")? (mines+1):mines; 
      if(posx-1 >= 0 && posy+1 < col) 
       mines = (board_copy[posx-1][posy+1] == "*")? (mines+1):mines; 
      if(posx+1 < row && posy-1 >= 0) 
       mines = (board_copy[posx+1][posy-1] == "*")? (mines+1):mines; 
      board[posx][posy] = Integer.toString(mines); 

      if(mines == 0){ 
       if((posx-1) >= 0 && (posy-1) >= 0) { 
        System.out.println((posx-1)+" "+(posy-1)); 
        check_move((posx - 1), (posy - 1)); 
       } 
       if(posx >= 0 && (posy-1) >= 0) { 
        System.out.println((posx)+" "+(posy-1)); 
        check_move(posx, (posy - 1)); 
       } 
       if((posx+1) < row && (posy+1) < col) { 
        System.out.println((posx+1)+" "+(posy+1)); 
        check_move((posx + 1), (posy + 1)); 
       } 
       if((posx-1) >= 0 && posy >= 0) { 
        System.out.println((posx-1)+" "+(posy)); 
        check_move((posx - 1), posy); 
       } 
       if((posx+1) < row && posy >= 0) { 
        System.out.println((posx+1)+" "+(posy)); 
        check_move((posx + 1), posy); 
       } 
       if(posx >= 0 && (posy+1) < col) { 
        System.out.println((posx)+" "+(posy+1)); 
        check_move(posx, (posy + 1)); 
       } 
       if((posx-1) >= 0 && (posy+1) < col) { 
        System.out.println((posx-1)+" "+(posy+1)); 
        check_move((posx - 1), (posy + 1)); 
       } 
       if((posx+1) < row && (posy-1) >= 0) { 
        System.out.println((posx+1)+" "+(posy-1)); 
        check_move((posx + 1), (posy - 1)); 
       } 
      } 
     } 
    } 

분명히 재귀 중에 check_move 메서드를 무제한으로 호출합니다. 나는 그것이 왜 무한히 진행되는지 알 수 없다. 다음은 오류 메시지입니다.Java 프로그램에서 무한 재귀 오류를 찾는 방법은 무엇입니까?

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.Integer.toString(Integer.java:402) 
    at TMS.check_move(TMS.java:70) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    at TMS.check_move(TMS.java:79) 
    at TMS.check_move(TMS.java:95) 
    . 
    . 
    . 
    . 
(GOES ON FOREVER) 
+2

당신은 stackoverflow 예외가 있어야합니다. 원인을 찾는 데 도움이되는 stackoverflow로 연결되는 스택 추적을 게시하는 경우 – SomeDude

+0

나는 전혀 모른다. – phantom

+1

이 코드를 통해 디버그 할 수있는 충분한 진단 기술이 없다면, 더 간단한 것으로 시작하는 것이 좋습니다. 기본적으로, 당신이하지 않는 것을 쓰려고하지 마십시오. 디버깅 방법을 알고 있어야합니다. 작은 단계로 시작하십시오. –

답변

2

예를 들어 광산이없는 인접한 두 개의 셀이있는 경우 재귀가 종료되지 않습니다. 어떤 위치에서 (POSX, POSY)이 있으면 예를 들어, 더 내 당신은 (POSX-1, 꽃다발-1) 라인에서

if((posx-1) >= 0 && (posy-1) >= 0) { 
     System.out.println((posx-1)+" "+(posy-1)); 
     check_move((posx - 1), (posy - 1)); 

이제 경우 (POSX-1, 꽃다발-1에서 check_move를 호출하지) 또한 더 광산이 없습니다, 당신은 라인

if((posx+1) < row && (posy+1) < col) { 
    System.out.println((posx+1)+" "+(posy+1)); 
    check_move((posx + 1), (posy + 1)); 

에 (POSX, POSY)에서 check_move 호출합니다 그리고 이것은 영원히 계속 될 것이다. 모든 경우에 재귀를 종료 할 수있는 방법을 찾아야합니다. 예를 들어 이미 테스트 된 위치에서 check_move를 다시 호출하지 못하게하는 각 셀에 'checked'플래그를 사용할 수 있습니다 (다른 방법이있을 수 있음 ...).

Andreas가 지적했듯이 while 루프 테스트로 돌아 오기 전에 루틴에서 예외를 호출하므로 inpx = 69에는 원하는 효과가 없습니다.

관련 문제