我有一个代表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指数上的电路板?
谢谢!
答案 0 :(得分:5)
我不确定我是否完全理解了代码,所以这是一个疯狂的猜测,但是:
在第一段摘录中,您为ar3
中的所有广告位提供了对同一对象ar1
的引用。这意味着如果您更改ar1
的内容,您将看到所有ar3
项的更改,因为所有这些项都是对同一对象的引用。您可以查看这是否是您的问题。
现在,作为一个评论,我建议你在这些情况下开始做两件有助于我个人的事情:第一件事是尽可能地给你的标识符作为有意义的名字,以至于不需要评论。明白什么是什么。第二种方法是利用您使用Java等语言编写的这一事实,并尝试以更加面向对象的方式编写代码。例如,如果您有一个正常的(例如)GameBoard
个对象数组,而不是3D数组,每个对象都包含其2D信息,那么它可能会对制作任何“可疑”代码模式产生非常积极的影响(这与你的实际意图不符,那就更明显了。)