gpt4 book ai didi

java - Java中的堆栈溢出

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:40 24 4
gpt4 key购买 nike

我正在为井字游戏制作一棵游戏树。

我有一个名为 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]);
}
}
}

抱歉放置了这么多代码行,但这是显示我的问题的唯一方法。

Line 169 is: if(!gameOver(t1))

Line 218 is: buildGameTree(ar4[k]);

也许我的树太大而无法保存在内存中?

顺便说一句,游戏板是一个 9x9 的数组,空 block 是“”,当然还有“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;
}

编辑我添加了一些打印行来查找导致错误的原因,我发现第一 block 板很好,然后发生了一些奇怪的事情:在打印功能中,我将“”更改为“^”,这样我们就可以看到板

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

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^

正如你所看到的,它移动了很多步,而不是 1 步,因为几乎整个棋盘都被“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 block 内容时(意味着其中有 X 或 O),我才会采取不同的 Action 。

编辑既然我得到了为什么它溢出的答案,我将关闭这个问题并打开另一个关于我的新问题的问题,谢谢。

最佳答案

您遇到的问题是您的代码是无限循环。

您传递给 buildGameTree(TreeNode) 内部调用的参数(第 218 行)不会从 gameOver(TreeNode) 返回 false。因此,您的代码在每个步骤中都会创建树。

关于java - Java中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com