2012-12-10 42 views
2

我有一个代表一个tic tac脚趾板的2d阵列。 空盒子就是“”; 我目前的游戏棋盘保存在ar1中,这是2d字符串数组。 我想制作一个数组为2d array = 3d数组的游戏板。 所以我想这将是这样的: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 这段代码是做我想要什么,但现在这里谈到这个问题,我会尝试生成所有存储在AR2在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中的每个索引,它都在为所有的板子做所有的动作..例如(我会L于一个3×3板展示) ^指空 板看起来像在此之前:

^^^
^ X^
^^^

但经过“招“我试图让(比方说0,0) 所有的板看起来像这样:

O^^
^ X^
^^^

,而不是第一只1 ...然后我在做与不同势指标同样的事情第二板(AR3 [1]),但它影响所有的电路板..(ar3 [0-k]),所以最终我得到了80块相同的电路板。 任何人有想法? 为什么它会改变所有的电路板?而不是K指数上的电路板?

谢谢!

+0

我没有看完你的问题,但我可以问你为什么当你想要保存的是一个字母时,为什么使用'String'而不是'char'? – jlordo

+0

完全同意。 JButtons的getText方法返回一个字符串,我懒得把它投入开始,我忘了它。我会改变它,但它与问题无关,所以你可以继续阅读=]谢谢。 –

+0

不需要投。如果'c'是一个字符变量,这将是一个字符串:'“”+ c' – jlordo

回答

5

我不知道我完全理解的代码,所以这是一个狂野的猜想,但:

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

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

+0

+1,我想也是一样! – jlordo

+0

非常感谢。我没有注意到。 –

+1

@ImriPersiado很高兴这是。这是我在这个网站上的第一个答案。好吧,祝你好运。 ^^ –