import java.lang.reflect.Array;
import java.util.*;
public class TMS {
private static int row = 5, col = 5;
private static String[][] board = new String[row][col];
private static String[][] board_copy = new String[row][col];
public static void main(String[] args) {
for(String[] array:board) {
Arrays.fill(array, "_");
}
create_mines();
Scanner input = new Scanner(System.in);
int inpx = 0, inpy;
while(inpx != 69){
show_board();
inpx = input.nextInt();
inpy = input.nextInt();
if(board_copy[inpx][inpy] == "*"){
System.out.println("YOU LOOSE");
break;
}
check_move(inpx, inpy);
}
}
public static void show_board() {
for(String[] row: board){
for(String element: row){
System.out.print(element+"\t");
}System.out.println();
}
}
public static void create_mines() {
Random rand = new Random();
rand.nextInt();
for(String[] array:board_copy) {
Arrays.fill(array, "_");
}
board_copy[1][1] = "*";
board_copy[3][1] = "*";
board_copy[3][3] = "*";
board_copy[2][4] = "*";
}
public static void check_move(int posx, int posy){
int mines = 0;
if(posx-1 >= 0 && posy-1 >= 0)
mines = (board_copy[posx-1][posy-1] == "*")? (mines+1):mines;
if(posx >= 0 && posy-1 >= 0)
mines = (board_copy[posx][posy-1] == "*")? (mines+1):mines;
if(posx+1 < row && posy+1 < col)
mines = (board_copy[posx+1][posy+1] == "*")? (mines+1):mines;
if(posx-1 >= 0 && posy >= 0)
mines = (board_copy[posx-1][posy] == "*")? (mines+1):mines;
if(posx+1 < row && posy >= 0)
mines = (board_copy[posx+1][posy] == "*")? (mines+1):mines;
if(posx >= 0 && posy+1 < col)
mines = (board_copy[posx][posy+1] == "*")? (mines+1):mines;
if(posx-1 >= 0 && posy+1 < col)
mines = (board_copy[posx-1][posy+1] == "*")? (mines+1):mines;
if(posx+1 < row && posy-1 >= 0)
mines = (board_copy[posx+1][posy-1] == "*")? (mines+1):mines;
board[posx][posy] = Integer.toString(mines);
if(mines == 0){
if((posx-1) >= 0 && (posy-1) >= 0) {
System.out.println((posx-1)+" "+(posy-1));
check_move((posx - 1), (posy - 1));
}
if(posx >= 0 && (posy-1) >= 0) {
System.out.println((posx)+" "+(posy-1));
check_move(posx, (posy - 1));
}
if((posx+1) < row && (posy+1) < col) {
System.out.println((posx+1)+" "+(posy+1));
check_move((posx + 1), (posy + 1));
}
if((posx-1) >= 0 && posy >= 0) {
System.out.println((posx-1)+" "+(posy));
check_move((posx - 1), posy);
}
if((posx+1) < row && posy >= 0) {
System.out.println((posx+1)+" "+(posy));
check_move((posx + 1), posy);
}
if(posx >= 0 && (posy+1) < col) {
System.out.println((posx)+" "+(posy+1));
check_move(posx, (posy + 1));
}
if((posx-1) >= 0 && (posy+1) < col) {
System.out.println((posx-1)+" "+(posy+1));
check_move((posx - 1), (posy + 1));
}
if((posx+1) < row && (posy-1) >= 0) {
System.out.println((posx+1)+" "+(posy-1));
check_move((posx + 1), (posy - 1));
}
}
}
}
분명히 재귀 중에 check_move 메서드를 무제한으로 호출합니다. 나는 그것이 왜 무한히 진행되는지 알 수 없다. 다음은 오류 메시지입니다.Java 프로그램에서 무한 재귀 오류를 찾는 방법은 무엇입니까?
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Integer.toString(Integer.java:402)
at TMS.check_move(TMS.java:70)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
at TMS.check_move(TMS.java:79)
at TMS.check_move(TMS.java:95)
.
.
.
.
(GOES ON FOREVER)
당신은 stackoverflow 예외가 있어야합니다. 원인을 찾는 데 도움이되는 stackoverflow로 연결되는 스택 추적을 게시하는 경우 – SomeDude
나는 전혀 모른다. – phantom
이 코드를 통해 디버그 할 수있는 충분한 진단 기술이 없다면, 더 간단한 것으로 시작하는 것이 좋습니다. 기본적으로, 당신이하지 않는 것을 쓰려고하지 마십시오. 디버깅 방법을 알고 있어야합니다. 작은 단계로 시작하십시오. –