[英]Stack overflow in Java
我正在為井字游戲做游戲樹。
我有一個名為buildGameTree
的方法,該方法獲取一個TreeNode
(treeNode具有80個孩子的數組),並且它計算每種可能的移動。 當然,每一步都是1個孩子。
這是我得到的錯誤:
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]);
也許我的樹太大了要保存在內存中?
順便說一句,游戲板是一個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;
}
編輯我添加了一些打印行n的東西以查找導致錯誤的原因,然后我發現第一塊板很好,然后又發生了一些奇怪的事情:在打印功能中,我將“”更改為“ ^”,因此我們可以看到該板
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^X
^^^^^^^^^
^^^^^^^^^
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^
如您所見,由於幾乎整個木板都被“ O”覆蓋,所以它執行的動作多於1,而不是1,然后它保持不變,這就是我得到溢出異常的原因。 我的代碼有什么問題? 必須在這里結束:
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是游戲板或游戲選項的數組..對於每個ar3 [k],我僅在不等於-1的塊內容(表示X或O包含某些內容)時才作不同的動作。
編輯由於我得到了為什么它會溢出的答案,所以我將關閉此問題,並針對我的新問題打開另一個問題,謝謝。
您的問題是您的想法是一個無限循環。
您傳遞給buildGameTree(TreeNode)
內部調用的buildGameTree(TreeNode)
第218行)不會從gameOver(TreeNode)
返回false。 在每一步中,您的代碼都將創建樹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.