我正在爲一個井字遊戲製作遊戲樹。堆棧流
我有一個名爲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)。
編輯 自從我得到一個答案,爲什麼它四溢我將關閉這個問題,就開到我的新問題,感謝另一個。
*「抱歉放這麼多的代碼行」*這不是我對'非常'的定義,但爲了更快地提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。我最好的猜測是'if(!gameOver(t1))'沒有返回你所期望的。你有沒有在調試器中運行它,並檢查了值和程序流? –
你讀過http://stackoverflow.com/questions/214741/what-is-a-stack-overflow-error瞭解錯誤? – PoeHaH
我知道它是什麼意思,但我該如何解決這個問題?我如何構建我的遊戲樹可能更有效,以避免此錯誤 –