1

三目並べ用のゲーム木を作っています。

(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に何かがあることを意味します)。

編集 なぜあふれているのかという答えを得たので、この質問を閉じて、新しい問題のおかげで別の質問を開きます。

4

1 に答える 1

1

あなたが抱えている問題は、あなたのクードが無限ループであるということです。

(218行目)の内部呼び出しに渡す引数は、buildGameTree(TreeNode)からfalseを返しませんgameOver(TreeNode)。したがって、各ステップのコードでツリーを作成します。

于 2012-12-10T14:13:14.470 に答える