我正在为一个井字游戏做一个游戏树。
我有一个名为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”覆盖,所以它会进行多次移动,然后它会保持不变,这就是我得到溢出异常的原因。 我的代码出了什么问题? 那必须结束:
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 )。
修改 既然我得到了答案,为什么它会溢出我将关闭这个问题并打开另一个关于我的新问题的感谢。
答案 0 :(得分:1)
你遇到的问题是你的coude是一个无限循环。
您传递给buildGameTree(TreeNode)
的内部调用的参数(第218行)不会从gameOver(TreeNode)
返回false。因此,每个步骤中的代码都会创建树。