나는 박하 사탕 발가락을위한 게임 트리를 만들고 있습니다.스택 오버 플로우
나는 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에 무언가가 있음을 의미).
편집 나는 내 새로운 문제 감사에 관한 또 하나이 질문을 닫고 열립니다 넘쳐 왜 대답을 가지고 있기 때문에.
* "너무 많은 코드 라인을 넣을 수있어서 유감 스럽습니다."* 내 정의가 '대단히'는 아니지만 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 가장 좋은 추측은'if (! gameOver (t1))'가 예상 한 것을 반환하지 않는다는 것입니다. 디버거에서 이것을 실행하고 값 및 프로그램 흐름을 검사 했습니까? –
오류를 이해하려면 http://stackoverflow.com/questions/214741/what-is-a-stack-overflow-error를 읽어 보셨습니까? – PoeHaH
의미가 무엇인지 알지만 어떻게 해결할 수 있습니까? 게임 트리를 어떻게 구축하여이 오류를 피할 수 있을까요? –