3d数组出了问题

时间:2012-12-10 22:23:18

标签: java tic-tac-toe

我有一个代表tic tac toe board的2d数组。 空盒子只是“”; 我当前的游戏板保存在ar1中,这是2d字符串数组。 我想制作一组游戏板,它是2d array = 3d array的数组。 所以我想这就是:

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中的所有可能的移动:

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指数上的电路板?

谢谢!

1 个答案:

答案 0 :(得分:5)

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

在第一段摘录中,您为ar3中的所有广告位提供了对同一对象ar1的引用。这意味着如果您更改ar1的内容,您将看到所有ar3项的更改,因为所有这些项都是对同一对象的引用。您可以查看这是否是您的问题。

现在,作为一个评论,我建议你在这些情况下开始做两件有助于我个人的事情:第一件事是尽可能地给你的标识符作为有意义的名字,以至于不需要评论。明白什么是什么。第二种方法是利用您使用Java等语言编写的这一事实,并尝试以更加面向对象的方式编写代码。例如,如果您有一个正常的(例如)GameBoard个对象数组,而不是3D数组,每个对象都包含其2D信息,那么它可能会对制作任何“可疑”代码模式产生非常积极的影响(这与你的实际意图不符,那就更明显了。)