Ошибка рекурсии программы Сапер - PullRequest
3 голосов
/ 08 июня 2011

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

Я понятия не имею, что происходит, поэтому любые предложения будут полезны.

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

 private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    clicked--;
    bArray2[y][x].setBackground(lighterGray);
    bArray2[y][x].setEnabled(false);

    if (x > 0 && x<gridx-1 && y> 0 && y<gridy-1)
    {
        clearSquare(y-1, x-1,gridy, gridx, bArray2);
        clearSquare(y-1, x,gridy, gridx, bArray2);
        clearSquare(y-1, x+1,gridy, gridx, bArray2);
        clearSquare(y, x-1,gridy, gridx, bArray2);
        clearSquare(y, x+1,gridy, gridx, bArray2);
        clearSquare(y+1, x-1,gridy, gridx, bArray2);
        clearSquare(y+1, x,gridy, gridx, bArray2);
        clearSquare(y+1, x+1,gridy, gridx, bArray2);
    }
     if(y == 0 && x != 0 && x != gridx-1)  // top row check
                       {
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);

                       } // ends top row check

                        if (y == 0 && x == 0) // corner check top left
                        {
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);
                        } // ends top left corner check

                        if (y == 0 && x == gridx-1) // corner check top right row
                         {     
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);                               
                        } // ends top right corner check

                        if (x == 0 && y != 0 && y != gridy-1)  //left column check
                        {
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);  
                            } // ends left column check

                            if (x == gridx-1 && y != 0 && y != gridy-1)  // right column check
                            {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                            }// ends right column check

                       if(y == gridy-1 && x != 0 && x != gridx-1)
                       {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                       } // ends bottom row check

                       if (y == gridy-1 && x == 0)  // left bottom corner check
                       {
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);

                        } // ends left bottom corner check

                        if (y == gridy-1 && x == gridx-1) // right bottom corner check
                        {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                        }//ends right bottom corner check
}

private void clearSquare(int y,int x, int gridy, int gridx, JButton[][] bArray2)
{
        int value = array[y][x];
        System.out.println(value);
        String text = bArray2[y][x].getText();
        if (text == "")
        {
        if (value == 0)
        {
            doClear(y, x, bArray2, gridy, gridx);
        }
        else{
            clicked--;
            bArray2[y][x].setText(""+value);
           }
       }

}

1 Ответ

4 голосов
/ 08 июня 2011
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    if (...already cleared...) {
       return;
    }

    ...
}

Без этой проверки ячейка A очистит соседнюю ячейку B, которая очистит соседнюю ячейку A, которая очистит соседнюю ячейку B, которая ...

Код, который вы разместили, можно заменить следующим:

private void handleClick(JButton[][] bGrid, int gridy, int gridx, int y, int x, bool realClick) {
    if (x < 0 || x >= gridx || y < 0 || y >= gridx) {
        return;
    }

    JButton button = bGrid[y][x];
    if (!button.isEnabled()) {
        return;
    }

    if (realClick) {
        --clicked;
    }

    button.setBackground(lighterGray);
    button.setEnabled(false);

    if (...is a mine...) {
        ...
    } else {
        button.setText(array[y][x]);

        if (value == 0) {
            handleClick(bGrid, gridy, gridx, y-1, x-1, false);
            handleClick(bGrid, gridy, gridx, y-1, x,   false);
            handleClick(bGrid, gridy, gridx, y-1, x+1, false);
            handleClick(bGrid, gridy, gridx, y,   x-1, false);
            handleClick(bGrid, gridy, gridx, y,   x+1, false);
            handleClick(bGrid, gridy, gridx, y+1, x-1, false);
            handleClick(bGrid, gridy, gridx, y+1, x,   false);
            handleClick(bGrid, gridy, gridx, y+1, x+1, false);
        }
    }
}

"array" нужно переименовать во что-то чувственное!

Обновление : добавлен упрощенный код.

...