2016-12-06 25 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

私はJavaの初心者ですので、私は全く考えていません – phantom

+1

このコードを使ってデバッグするのに十分な診断スキルがない場合は、より簡単なものから始めることをお勧めします - 基本的には、デバッグする方法を知っている。小さなステップを踏んで始めましょう。 –

答えて

2

例えば、鉱山のない2つの隣接セルがある場合、再帰は終了しません。例えば、いくつかの位置(POSX、POSY)で(POSX-1場合は、ライン今

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

に(POSX-1、POSY-1)でcheck_moveを呼び出して何の鉱山が存在しない場合、POSY-1 )は地雷を持っていないも、あなたはライン

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は望ましい効果を持ちません。

関連する問題