Исключение Stackoverflow в игре Java тральщик - PullRequest
2 голосов
/ 12 июля 2011

Я пытался сделать игру тральщика на Java, но продолжаю сталкиваться с этой ошибкой.Эта функция устанавливает текущий квадрат для нажатия и любые смежные квадраты для нажатия и продолжается рекурсивно.Он должен остановиться, когда у него заканчиваются квадраты, но даже когда я устанавливаю размер поля 2x2 с 0 мин, он переполняется.

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                setClicked(true); //Should be m.setClicked(true);
            }
        }
}

Проблема решена, я пропустил «m».в моем вызове метода.Спасибо всем за помощь.

Ответы [ 4 ]

4 голосов
/ 12 июля 2011

Вам нужно позвонить setClicked на соседний рудник, а не на исходный рудник, в противном случае вы получите setClicked(true), который будет снова и снова вызываться для исходного рудника

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                m.setClicked(true); // setClicked should be called on the adjacent mine, not on itself!
            }
        }
}
1 голос
/ 12 июля 2011

Вы вызываете setClicked на той же шахте, а не на соседних.

Изменить на:

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                //missing the "m."
                m.setClicked(true);
            }
        }
}
0 голосов
/ 12 июля 2011

Сложно сказать по фрагменту кода, но я бы сказал, что вы не перебираете ячейки. Это означает, что вы рекурсивно проверяете одну и ту же ячейку снова и снова (до бесконечности и дальше woosh ). Окружающий код было бы очень полезно увидеть.

0 голосов
/ 12 июля 2011

Ну, я могу только догадываться, что метод setClicked() является членом mine, но разве вы не должны вызывать m.setClicked(true) внутри вашего состояния вместо просто setClicked(true)?

...