2012-12-10 46 views
1

我正在爲一個井字遊戲製作遊戲樹。堆棧流

我有一個名爲buildGameTree的方法,它得到一個TreeNode(treeNode有一個80個孩子的數組),它計算每一種可能的移動。每一招當然是一個孩子。

這裏是我的錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at Main.buildGameTree(Main.java:169) 
at Main.buildGameTree(Main.java:218) 
at Main.buildGameTree(Main.java:218) 
... 
at Main.buildGameTree(Main.java:218) 

這裏是我的代碼:

private void buildGameTree(TreeNode t1) 
     { 
      String[][] ar1 = (String[][]) t1.getData(); //ar1 is a game board 

      if(!gameOver(t1)) 
      { 
       //printTree(t1); 
       int[][]ar2 = new int[81][2]; 
       int line = 0; 

       for(int k=0;k<SIZE;k++) //looking for "" 
        for(int j=0;j<SIZE;j++,line++) 
        { 
         if(ar1[k][j].equals("")) 
         { 
          ar2[line][0] = k; 
          ar2[line][1] = j; 
         } 
         else 
         { 
          ar2[line][0] = -1; 
          ar2[line][1] = -1; 
         } 

        } 

       String[][][]ar3 = new String[80][9][9]; // array of game boards 

       for(int k=0;k<ar3.length;k++)// filling the array.. ar1 is a game board 
       { 
        ar3[k] = ar1; 
       } 
       for(int k=0;k<ar3.length;k++)// making a move 
       { 
        int i1 = ar2[k][0]; 
        int i2 = ar2[k][1]; 
        if(!(i1 == -1 || i2 == -1)) 
         if(num%2==0) 
          ar3[k][i1][i2] = "X"; 
         else 
          ar3[k][i1][i2] = "O"; 
       } 

       TreeNode<String[][]>[] ar4 = new TreeNode[80]; 

       for(int k=0;k<ar3.length;k++) 
       { 
        ar4[k] = new TreeNode<String[][]>(ar3[k]); 
       } 
       t1.setChildren(ar4); 

       for(int k=0;k<ar4.length;k++) 
       { 
        buildGameTree(ar4[k]); 
       } 
      } 
     } 

對不起,我把這麼多行代碼,但它顯示我的問題的唯一途徑。

行169:if(!gameOver(t1))

218線是:buildGameTree(ar4[k]);

也許我的樹是大要保存在內存?

btw遊戲板是一個9x9的數組,空塊是「」,當然你有「X」和「O」。ar2是一種索引表,它將成爲遊戲中的下一步動作。

編輯

public boolean gameOver(TreeNode t1) 
     { 
      String[][] ar1 = (String[][]) t1.getData(); 
      for(int k=0;k<ar1.length;k++) 
      { 
       for(int j=0;j<ar1.length;j++) 
        if(ar1[k][j].equals("")) 
         return false; 
      } 
      return true; 
     } 

編輯 我加了一些打印線ñ東西找到什麼原因造成的錯誤,我發現,第一板是好的,然後一些奇怪的情況: 在打印功能我改「」爲「^」,所以我們可以看到主板

^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^X 
^^^^^^^^^ 
^^^^^^^^^ 

OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOX 
OOOOOOOOO 
OOOOOOOO^ 

OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOX 
OOOOOOOOO 
OOOOOOOO^ 

正如你可以看到它使我的許多移動而不是1,因爲幾乎整個板子都被「O」覆蓋,然後它保持不變,這就是我得到溢出異常的原因。 我的代碼有什麼問題?正如我所說的AR3是遊戲板或遊戲選項的數組

for(int k=0;k<ar3.length;k++)// making a move 
       { 
        int i1 = ar2[k][0]; 
        int i2 = ar2[k][1]; 
        if(!(i1 == -1 || i2 == -1)) 
         if(num%2==0) 
          ar3[k][i1][i2] = "X"; 
         else 
          ar3[k][i1][i2] = "O"; 
       } 

..每個AR3 [K]我做只是如果它不等於-1一個不同勢招: 這是必須要在這裏阻止內容(意味着有東西進入X或O)。

編輯 自從我得到一個答案,爲什麼它四溢我將關閉這個問題,就開到我的新問題,感謝另一個。

+0

*「抱歉放這麼多的代碼行」*這不是我對'非常'的定義,但爲了更快地提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。我最好的猜測是'if(!gameOver(t1))'沒有返回你所期望的。你有沒有在調試器中運行它,並檢查了值和程序流? –

+0

你讀過http://stackoverflow.com/questions/214741/what-is-a-stack-overflow-error瞭解錯誤? – PoeHaH

+0

我知道它是什麼意思,但我該如何解決這個問題?我如何構建我的遊戲樹可能更有效,以避免此錯誤 –

回答

1

你的問題是你的coude是一個無限循環。

您傳遞給內部電話buildGameTree(TreeNode)(第218行)的參數不會從gameOver(TreeNode)返回錯誤。在每個步驟中都有你的代碼創建樹。

+0

你的意思是它總是返回錯誤,但當棋盤滿了「X」和「O」時,它將返回true意味着遊戲結束。但我想在這個過程的中間堆棧溢出 –

+0

它總是返回錯誤,因爲你總是分析空板。 –

+0

怎麼來?查看代碼上的移動記錄..這些行正在做一個單一的移動,最終他們會得到一個大小爲1的空白位置的董事會,董事會將是充滿的。這理論上應該發生什麼,我相信如果你在我的代碼中發現漏洞我想知道 –