我有一个2D阵列,代表一个井字游戏板。
空盒子就是“”;
我当前的游戏板保存在2D字符串数组ar1中。
我要制作一个游戏棋盘阵列,即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的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)
所有的板看起来像这样:
哦^^
^ X ^
^ ^ ^
而不是只使用第一个板...,然后对第二块板(ar3 [1])使用不同的索引执行相同的操作,但它会影响所有板。.(ar3 [0-k])因此最终我有80个相同的板。
有人知道吗?
为什么要改变所有董事会,而不是只改变K指数上的董事会?
谢谢!
最佳答案
我不确定我是否完全理解代码,所以这是一个疯狂的猜测,但是:
在第一个摘录中,您为ar3
中的所有插槽提供了对同一对象ar1
的引用。这意味着,如果更改ar1
的内容,则会看到所有ar3
项的更改,因为所有这些项都是对同一对象的引用。您可以检查看看这是否是您的问题。
现在,作为评论,我建议您开始做两件事,在这些情况下对我个人有帮助:首先是为您的标识符提供尽可能有意义的名称,以至于不需要真正地使用注释来了解什么是什么。 。第二个是利用您正在使用Java之类的语言编写的事实,并尝试以更加面向对象的方式编写代码。例如,如果您有一个普通的(例如)GameBoard
对象数组,而不是3D数组,每个对象都包含其2D信息,那么它在制作任何“可疑”代码模式(并不符合您的实际意图,这更明显。
关于java - 3D阵列出了点问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13810320/