2

我有一个代表井字游戏的二维数组。空框只是 "" ;我当前的游戏板保存在 ar1 中,它是 2d 字符串数组。我想制作一个游戏板数组,它是 2d 数组 = 3d 数组的数组。所以我想它会是这样的:

String[][][]ar3 = new String[80][9][9]; // array of game boards

        for(int k=0;k<ar3.length;k++)// filling the array with the current game board
        {
            ar3[k] = ar1;
        }

是的,我想要 80 个棋盘,游戏将是 9x9。到现在为止一切都很好..但现在我想看看游戏板(ar1)并在ar3上做出一切可能的举动。因此,对于每一个可能的举动,我都在 ar3 上得到了一个棋盘。为此,我将创建一个数组,其中包含板上的空索引,这是 ar2 上所有可能的移动:

int[][]ar2 = new int[81][2]; // contains blank boxes indexes
        int line = 0;

        for(int k=0;k<SIZE;k++) //finds blank boxes indexes and adding to the array
            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;
                }

            }

正如你所看到的,如果盒子有其他东西,那么“”是 X 或 O,然后我输入 -1 这个代码正在做我想要的,但现在问题来了,我将尝试生成所有可能的移动,这些移动存储在ar3 中的 ar2:

String[][][]ar3 = new String[80][9][9]; // array of game boards

        for(int k=0;k<ar3.length;k++)// filling the array with the current 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";
        }

我不知道为什么不是对每个棋盘进行一次移动,而是对 ar3 中的每个索引进行所有棋盘的所有移动..例如(我将在 3x3 棋盘上演示)^ 表示空棋盘之前看起来像这样:

^ ^ ^
^ X ^
^ ^ ^

但是在“移动”之后,我试图使(假设是 0,0)所有的板看起来像这样:

O ^ ^
^ X ^
^ ^ ^

而不是第一个...然后我对第二个板(ar3 [1])使用不同的索引做同样的事情,但它会影响所有板..(ar3 [0-k])所以最终我有 80 个相同的板。有人有想法吗?为什么它改变了所有的板?而不是只改变 K 指数上的板?

谢谢!

4

1 回答 1

5

我不确定我是否完全理解代码,所以这是一个疯狂的猜测,但是:

在第一个摘录中,您将ar3引用同一对象的所有插槽ar1. 这意味着如果您更改ar1的内容,您将看到所有ar3项目的更改,因为所有这些项目都是对同一对象的引用。你可以检查一下这是否是你的问题。

现在,作为评论,我建议您在这些情况下开始做两件对我个人有帮助的事情:第一件事是为您的标识符提供尽可能有意义的名称,以至于实际上不需要评论来理解什么是什么. 第二个是利用您使用 Java 之类的语言编写的事实,并尝试以更面向对象的方式编写代码。例如,如果你有一个普通的(比如说)GameBoard对象数组,而不是一个 3D 数组,每个对象都包含它的 2D 信息,那么它可能对制作任何“可疑”代码模式(不符合您的实际意图,即)更明显。

于 2012-12-10T22:36:04.963 回答