2012-12-10 2 views
1

나는 박하 사탕 발가락을위한 게임 트리를 만들고 있습니다.스택 오버 플로우

나는 TreeNode (treeNode에는 80 개의 자식 배열이 있음)을 얻는 방법이 있으며 가능한 모든 종류의 이동을 계산합니다. 각 이동은 당연히 1 명의 아이들이다. 여기

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at Main.buildGameTree(Main.java:169) 
at Main.buildGameTree(Main.java:218) 
at Main.buildGameTree(Main.java:218) 
... 
at Main.buildGameTree(Main.java:218) 

그리고 내 코드는 다음과 같습니다 : 여기

내가 얻을 오류가 너무 많은 코드 라인을 착용하는

private void buildGameTree(TreeNode t1) 
     { 
      String[][] ar1 = (String[][]) t1.getData(); //ar1 is a game board 

      if(!gameOver(t1)) 
      { 
       //printTree(t1); 
       int[][]ar2 = new int[81][2]; 
       int line = 0; 

       for(int k=0;k<SIZE;k++) //looking for "" 
        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; 
         } 

        } 

       String[][][]ar3 = new String[80][9][9]; // array of game boards 

       for(int k=0;k<ar3.length;k++)// filling the array.. ar1 is a 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"; 
       } 

       TreeNode<String[][]>[] ar4 = new TreeNode[80]; 

       for(int k=0;k<ar3.length;k++) 
       { 
        ar4[k] = new TreeNode<String[][]>(ar3[k]); 
       } 
       t1.setChildren(ar4); 

       for(int k=0;k<ar4.length;k++) 
       { 
        buildGameTree(ar4[k]); 
       } 
      } 
     } 

미안하지만 내 문제를 보여줄 수있는 유일한 방법입니다.

라인 169은 다음과 같습니다 if(!gameOver(t1))

라인 (218)은 다음과 같습니다 buildGameTree(ar4[k]);

메모리에 저장할 수 어쩌면 내 나무가 큰 있나요?

btw 게임 보드는 9x9의 배열이고 빈 블록은 ""이며, 물론 "X"와 "O"가 있습니다. ar2는 게임에서 다음 동작이 될 인덱스 테이블의 일종입니다.

편집

public boolean gameOver(TreeNode t1) 
     { 
      String[][] ar1 = (String[][]) t1.getData(); 
      for(int k=0;k<ar1.length;k++) 
      { 
       for(int j=0;j<ar1.length;j++) 
        if(ar1[k][j].equals("")) 
         return false; 
      } 
      return true; 
     } 

내가 오류를 일으키는 첫 번째 보드가 다음 일어나는 이상한 일 잘하며 본인이 발견 손쉽게 찾을 일부 인쇄 라인 N 물건을 추가 편집 :에서 당신이 많은 이동 난을 만들고 볼 수 있듯이 나는 변경 인쇄 기능은 "^"그래서 우리는 보드

^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^^ 
^^^^^^^^X 
^^^^^^^^^ 
^^^^^^^^^ 

OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOX 
OOOOOOOOO 
OOOOOOOO^ 

OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOO 
OOOOOOOOX 
OOOOOOOOO 
OOOOOOOO^ 

을 볼 수 있었다 "로" 거의 모든 보드가 "O"로 덮여 있기 때문에 nstead가 1이되고 그 다음 오버 플로우 예외가 발생하는 이유가 그대로 유지됩니다. 내 코드에 어떤 문제가 있습니까? 반드시있어 이 이상 여기에 :

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 게임 보드 또는 게임 옵션의 배열입니다 말했듯이 .. 각 AR3 [K] 나는를 -1로 동일 아니에요 경우에만 diffrent 이동을 위해 콘텐츠를 차단하십시오 (X 또는 O에 무언가가 있음을 의미).

편집 나는 내 새로운 문제 감사에 관한 또 하나이 질문을 닫고 열립니다 넘쳐 왜 대답을 가지고 있기 때문에.

+0

* "너무 많은 코드 라인을 넣을 수있어서 유감 스럽습니다."* 내 정의가 '대단히'는 아니지만 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 가장 좋은 추측은'if (! gameOver (t1))'가 예상 한 것을 반환하지 않는다는 것입니다. 디버거에서 이것을 실행하고 값 및 프로그램 흐름을 검사 했습니까? –

+0

오류를 이해하려면 http://stackoverflow.com/questions/214741/what-is-a-stack-overflow-error를 읽어 보셨습니까? – PoeHaH

+0

의미가 무엇인지 알지만 어떻게 해결할 수 있습니까? 게임 트리를 어떻게 구축하여이 오류를 피할 수 있을까요? –

답변

1

문제는 coude가 무한 루프라는 것입니다.

buildGameTree(TreeNode) (줄 218)의 내부 호출에 전달하는 인수는 gameOver(TreeNode)에서 false를 반환하지 않습니다. 각 단계마다 코드가 생성되어 트리가 생성됩니다.

+0

당신은 항상 false를 리턴하지만 보드가 "X"와 "O"로 가득차면 true를 반환 할 것입니다. 하지만 그 과정의 중간에 스택을 오버플로 것 같아요 –

+0

항상 빈 보드를 분석하기 때문에 항상 false를 반환합니다. –

+0

어째서? 코드에서 움직이는 노트를 확인해보십시오 .. 그 라인들은 하나의 움직임을 만들어 내고 결국에는 크기가 1 인 빈 자리가있는 보드를 얻을 것이고 보드는 가득 채워질 것입니다. 그게 이론적으로 무슨 일이 일어나야하고 사실을 믿고 내 코드에서 결함을 발견했다면 알고 싶습니다 –