三目並べ用のゲーム木を作っています。
(treeNodeには80の子の配列があります)buildGameTree
を取得するというメソッドがあり、可能なすべての種類の移動を計算します。TreeNode
もちろん、各動きは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;
}
編集 エラーの原因を見つけるためにいくつかの印刷行を追加しましたが、最初のボードは正常で、その後何か奇妙なことが起こりました。印刷機能で「」を「^」に変更して、ボードが見えるようにしました。
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^^
^^^^^^^^X
^^^^^^^^^
^^^^^^^^^
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOO
OOOOOOOOX
OOOOOOOOO
OOOOOOOO^
ご覧のとおり、ボードのほぼ全体が「O」で覆われているため、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に何かがあることを意味します)。
編集 なぜあふれているのかという答えを得たので、この質問を閉じて、新しい問題のおかげで別の質問を開きます。