3

I am creating a mine sweeper program in java for school, and am having trouble with the clearing of squares that don't have any mines next to them, the square is supposed to be disabled, and all surrounding squares revealed, if there is another square that is touching no bombs, it will perform the same operation. I am getting a stack overflow error, I know this has to do with an infinite loop, but I can't find where it is getting stuck in my code.

I have no idea what's going wrong so any suggestions would be helpful.

Here is the relative piece of code (the if statements are for special cases, if the square clicked is on the edge of the board)

 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);
           }
       }

}
2
  • 1
    By the way, you'd need far less code if you had an extra row at the top and bottom and an extra column on the left and on the right. Keep these hidden set their initial state to cleared. Commented Jun 8, 2011 at 0:17
  • I've added to my answer. Turns out there's another way to simplify the code without adding the extra rows and columns. Commented Jun 8, 2011 at 0:41

1 Answer 1

4
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    if (...already cleared...) {
       return;
    }

    ...
}

Without that check, cell A will clear neighbour cell B, which will clear neighbour cell A, which will clear neighbour cell B, which ...

The code you posted can be replaced with the following:

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" needs to be renamed to something sensical!

Update: Added simplified code.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.