2012-12-10 3 views
2

저는 tic tac toe 보드를 나타내는 2 차원 배열을 가지고 있습니다. 빈 상자는 단지 ""입니다. 현재 게임 보드가 ard2d 문자열 배열에 저장됩니다. 2D 배열 = 3D 배열의 배열 인 게임 보드 배열을 만들고 싶습니다. 그래서 나는 그런 것 같아요3 차원 배열에 문제가 생겼습니다

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 개 보드를 원하는 게임은 9 × 9 일 것이다. 지금까지는 모든 것이 괜찮습니다.하지만 이제 게임 보드 (ar1)를보고 ar3에서 모든 가능한 동작을하고 싶습니다. 가능한 모든 이동을 위해 ar3에 게시판이 있습니다. 상자가 X 인 다음 다른 뭔가를 ""가지고

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; 
       } 

      } 

당신이 경우에서 볼 수 있듯이 : 나는 AR2에 가능한 모든 움직임이다 보드에 빈 인덱스를 포함 할 배열을 만들 것이라고를 들어 또는 O는 I -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의 각 인덱스에 대해 모든 보드에 대한 모든 동작을하고 있습니다. 예를 들어 (필자는 리터 × 3 보드에 보여) ^이 보드는 이전과 같습니다 빈 의미

^^^
^ X^
^^^

하지만 "이동 후
"내가 만들려고 모든 보드는 다음과 같습니다 을 (의 0,0을 가정 해 봅시다) :

O^^
^ X^
^^^

대신 단지 첫 1

... 그리고 내가 두 번째 보드 diffrent 인덱스와 같은 일을하고 있어요 (AR3 [1])하지만 그것을 모든 보드에 영향을 미칩니다. (ar3 [0-k]) 그래서 결국 똑같은 80 개의 보드를 얻었습니다. 아무도 아이디어가 있습니까? 왜 모든 보드가 변경됩니까? K 인덱스에있는 보드 만 변경됩니까?

감사합니다. 내가 완전히 코드를 이해 확실하지 않다

+0

나는 당신의 질문을 읽지 않았지만, 저장하고 싶은 것이 모두 하나의 문자 일 때 왜'char' 대신'String'을 사용해야하는지 물을 수 있습니까? – jlordo

+0

전적으로 동의 함. JButtons의 getText 메서드는 String을 반환하고 나는 그것을 처음에 캐스팅하는 것을 게으른 것이었고 잊어 버렸습니다. 나는 그것을 바꿀 것이지만 그것은 질문과 관련이 없으므로 계속 읽을 수 있습니다 =] 감사합니다. –

+0

캐스팅 할 필요가 없습니다. 'c'가 char 변수라면, 이것은 문자열이 될 것입니다 :' ""+ c' – jlordo

답변

5

, 그래서 이것은 추측이지만 : 당신이 ar3에서 동일한 개체, ar1에 대한 참조를 모든 슬롯을 제공하고있는 최초의 발췌에서

. 즉, ar1의 내용을 변경하면 모든 항목이 동일한 객체에 대한 참조이기 때문에 모든 ar3 항목에 걸쳐 해당 변경 사항이 표시됩니다. 이것이 자신의 문제인지 확인할 수 있습니다.

의견으로, 나는이 경우 개인적으로 나를 돕는 두 가지 일을 시작하는 것이 좋습니다. 첫 번째는 식별자를 가능한 의미있는 이름으로 제공하기 때문에 주석이 실제로 필요하지 않습니다. 무엇이 무엇인지 이해하기.두 번째는 Java와 같은 언어로 작성하고보다 객체 지향적 인 방식으로 코드를 작성하려고한다는 사실을 이용하는 것입니다. 예를 들어 3D 배열 대신에 2D 정보가 들어있는 GameBoard 객체의 일반 배열을 사용하면 "의심스러운"코드 패턴을 만들 때 매우 긍정적 인 효과를 얻을 수 있습니다. 귀하의 실제 의도와 일치합니다.

+0

+1, 나는 똑같다고 생각합니다! – jlordo

+0

정말 고마워요. 나는 눈치 채지 못했다. –

+1

@ImriPersiado 다행이었습니다. 그것은이 사이트에 대한 나의 첫 대답입니다. 여기부터 행운을 빈다. ^^ –