Search code examples
javaswingjframejbuttonactionlistener

How do I count the number of bombs in my Minesweeper code?


So well I tried creating a simpler Minesweeper game and I encountered one main problem.. I am not able to count the number of bombs and print it in a JTextField Any ideas as to how to count these as I'm setting a random value to check whether they are a bomb

Tried counting it in the ActionListener but the bombs were counted only after the button was clicked.

     if(e.getSource()==b[i][j])
        {
            b[i][j].setVisible(false);

            tf[i][j].setVisible(true);
            int r1 = rand.nextInt(6);
            if(r1>1)
            {
                tf[i][j].setText("Safe");
                tf[i][j].setBackground(Color.green);

            }
            else    
            {   count++;
                tf[i][j].setText("Bomb");
                tf[i][j].setBackground(Color.red);
                f.setVisible(false);
                restart.setVisible(true);
            }
        }

Solution

  • As I understand you decide if the the tile will be a bomb in the run-time using a random generator. Doing this you can't really know how many mines are in your game. I think you should decide the number of mines at the beginning of the game and randomly place them to your game board (you can choose the number according to a difficulty level).

    EDIT

    You can create a list with some random points that contain the mines

        int numOfMines =  10;
    
        int rows=5,columns=5;
    
    
        ArrayList listWithMines = new ArrayList();
    
        while(listWithMines.size()<numOfMines) {
    
            int randRow = random.nextInt(rows);
            int randCol = random.nextInt(columns);
    
            Point point = new Point(randRow, randCol);
    
            if(listWithMines.contains(point))
                continue;
            else
                listWithMines.add(point);
        }
    

    This list now contains the Points that have the mines. You can check if Point(x,y) has a mine like this:

    if(listWithMines.contains(new Point(1, 2))) {...}
    

    Instead of a list you can use a 2D array, store a boolean value (or int if you store more states) and make a loop until you place 10 mines. You should keep a counter(placedMines like the list.size()) of the mines you placed and make sure you don't add a mine to a tile that has already a mine and you increase the counter(placedMines) until it reaches the numOfMines.