1
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.ActionListener;

public class Minesweeper extends JFrame implements MouseListener, ActionListener 
{
public int gridRows;
public int gridColumns;
int mines;
private JMenuBar menuBar;
private JMenu Difficulty;
private JMenu Options;
private int numberofMines;
private int row, col;
JMenuItem Expert, Intermediate, Easy;
JButton[][] easyGrid;
Tile[][] squares = new Tile[9][9];
Container box = getContentPane();
private JLabel flagcounter;
private JLabel timecounter;
private Font f1 = new Font("Brush Script", Font.BOLD,20);
int easyflags = 10;

public static void main(String args[])
{

    Minesweeper myGui = new Minesweeper();
    myGui.setVisible(true);         
}
public Minesweeper()
{
    super();
    setLayout(null);
    makeBoard(9, 9);
    initUI();
    setJMenuBar(menuBar);
    menuBar.add(Difficulty);
    menuBar.add(Options);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocation(800,200);
    setSize(500, 600);
    setTitle("Minesweeper");
    setVisible(true);

    flagcounter = new JLabel("0"+easyflags, SwingConstants.CENTER);
    flagcounter.setBounds(20, 20, 50, 40);
    flagcounter.setFont(f1);
    flagcounter.setBackground(Color.black);
    flagcounter.setForeground(Color.red);
    flagcounter.setOpaque(true);
    flagcounter.setBorder(BorderFactory.createLineBorder(Color.black));
    flagcounter.setVisible(true);
    add(flagcounter);   

}


private void makeBoard(int rowsX, int columnsY)
{

gridRows = rowsX;
gridColumns = columnsY;


easyGrid = new JButton[rowsX][columnsY]; // sets the grid size from the parameters given
squares = new Tile[gridRows][gridColumns];

    for (int i = 0; i<rowsX; i++)
    {
        for (int j = 0; j<columnsY; j++)
        {
            squares[i][j] = new Tile(i, j);
            squares[i][j].setBounds(25+(i*50),(j*50) + 100,50,50);
            squares[i][j].setHorizontalAlignment(SwingConstants.CENTER);
            squares[i][j].setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
            squares[i][j].addMouseListener(this);

            box.add(squares[i][j]);

        }

    }

    repaint();
}
public Tile get(int i, int j)
{
    return squares [i][j];
}
final void initUI()
{
    menuBar = new JMenuBar();
    Difficulty = new JMenu("Difficulty");
    Options = new JMenu("Options");
    JMenuItem easy = new JMenuItem("Easy");
    easy.addActionListener(this);
    easy.setToolTipText("New 9x9 game with 10 bombs.");

    JMenuItem medium = new JMenuItem("Medium");
    medium.addActionListener(this);
    medium.setToolTipText("New 16x16 game with 40 bombs");

    JMenuItem hard = new JMenuItem("Hard");
    hard.addActionListener(this);
    hard.setToolTipText("New 30x16 game with 99 bombs");

    JMenuItem custom = new JMenuItem("custom");
    custom.addActionListener(this);
    custom.setToolTipText("Set a custom layout for a minesweeper game");

    JMenuItem oExit = new JMenuItem("Exit");
    oExit.addActionListener(this);
    oExit.setToolTipText("Exit the game");
    Difficulty.add(easy);
    Difficulty.add(medium);
    Difficulty.add(hard);

    Options.add(oExit);
}




public void actionPerformed(ActionEvent e)
{
    if(e.getSource() instanceof Tile)
    {

    }
    if(e.getSource() instanceof JMenuItem)
    {
        String menu;
        menu = e.getActionCommand();

        if (menu.equals("Exit"))
        {
            System.exit(0);
        }
        if (menu.equals("Easy"))
        {
            setSize(500,600);
            makeBoard(9,9);
            // TODO need to reset the board
        }
        if (menu.equals("Medium"))
        {
            setSize(850,950);
            //TODO figure out how to change the flag counter...
            makeBoard(16, 16);
        }
        if (menu.equals("Hard"))
        {
            setSize(1550,950);
            makeBoard(30,16);
        }

    }

    }


public void mouseClicked(MouseEvent e)
{
    if(e.getSource() instanceof Tile)
    {
    Tile clicked = (Tile)e.getSource();
        //Test Statements
        System.out.println("Row " + clicked.getColumn() + " Column " + clicked.getRow());
        System.out.println("This tile is: " + clicked.getOccupied());
        if(e.getButton() == MouseEvent.BUTTON3)
        {
            clicked.setForeground(Color.BLUE);
            clicked.setOccupied('f');
            clicked.setBackground(Color.LIGHT_GRAY);

        }

    }

}


public void mouseEntered(MouseEvent arg0)
{
    if(arg0.getSource() instanceof Tile)
    {
        Tile entered = (Tile)arg0.getSource();
        entered.setBorder(BorderFactory.createLineBorder(Color.blue));
    }
}

@Override
public void mouseExited(MouseEvent arg0)
{

    Tile exited = (Tile)arg0.getSource();
    exited.setBorder(BorderFactory.createLineBorder(Color.black));
}

@Override
public void mousePressed(MouseEvent arg0)
{
    // TODO Auto-generated method stub
    if(arg0.getSource() instanceof Tile)
    {

    }
}

@Override
public void mouseReleased(MouseEvent arg0)
{
    // TODO Auto-generated method stub

}

}

this is the main class

import java.awt.Color;
import java.awt.Image;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
 // Tile class for mine sweeper
public class Tile extends JLabel
{
private char occupied;
private int column;
private int row;

private JLabel OccupiedB;
private JLabel OccupiedC;
private JLabel OccupiedE;
private JLabel OccupiedF;
//Icon flag = new ImageIcon("flag.ico");

/*
whatever.setIcon(new ImageIcon("filename.ext"));
or
Icon myIcon = new ImageIcon("filename.ext");
whatever.setIcon(myIcon);
*/

public Tile(int col, int newRow)
{
    super();
    setBackground(Color.GRAY);
    setOpaque(true);
    occupied = 'g';
    column = col;
    row = newRow;

}

public boolean setOccupied(char Ecolumn)
{
    occupied = Ecolumn;
    if(occupied == 'b')         // If the tile is a bomb
    {

    }
    else if(occupied == 'c')    // If the tile is clear
    {
        setBackground(Color.WHITE);
    }
    else if(occupied == 'e')    // If the tile is empty or surrounding a bomb
    {

    }
    else if(occupied == 'f')    // If the tile is a flag
    {
        setText("F");

        //setIcon(new ImageIcon("flag.ico"));

    }
    return true;
}

public int getColumn()
{
    return column;
}

public void setColumn(int column)
{
    this.column = column;
}

public int getRow()
{
    return row;
}

public JLabel getOccupiedB()
{
    return OccupiedB;
}

public void setOccupiedB(JLabel occupiedB)
{
    OccupiedB = occupiedB;
}


public JLabel getOccupiedC()
{
    return OccupiedC;
}

public void setOccupiedC(JLabel occupiedC)
{
    OccupiedC = occupiedC;
}


public JLabel getOccupiedE()
{
    return OccupiedE;
}

public void setOccupiedE(JLabel occupiedE)
{
    OccupiedE = occupiedE;
}
public JLabel getOccupiedF()
{
    return OccupiedF;
}

public void setOccupiedF(JLabel occupiedF)
{
    OccupiedF = occupiedF;
}

public void setRow(int row)
{
    this.row = row;
}

public char getOccupied()
{
    return occupied;
}


}

this is the tile class

I dont understand how to basically reset the board when im changing the difficulty, or when i plan on setting a custom board option how to automatically resize the board based on the number of tiles given.

if you cant tell... im pretty new to code. thanks for the help.

mKorbel
  • 109,525
  • 20
  • 134
  • 319

1 Answers1

0

Doesn't this already do it for the most part?

    if (menu.equals("Easy"))
    {
        setSize(500,600);
        makeBoard(9,9);
        // TODO need to reset the board
    }
    if (menu.equals("Medium"))
    {
        setSize(850,950);
        //TODO figure out how to change the flag counter...
        makeBoard(16, 16);
    }
    if (menu.equals("Hard"))
    {
        setSize(1550,950);
        makeBoard(30,16);
    }

Someone selecting an option from the menu fires an event. The event handler contains an if/else block that either: exits, sets to easy, sets to medium, sets to hard. The makeBoard function handles the actual display of gray tiles as far as I can tell with Occupied set to 'g' (gray?) for all tiles. If you're asking about the actual generation of bombs etc. I didn't see anything in there about that. It's either taken care of for you and you didn't provide the code or you have to write that for yourself.

You need to set int easyFlags to however many they get for that particular difficulty. You need to set the flagCounter label to 0. You need to set the timecounter label t0 0. You need to set int mines to however many there are for the difficulty.

for the menu.equals("Easy") if block it would be something like:

    if (menu.equals("Easy"))
    {
        setSize(500,600);
        makeBoard(9,9);
        flagCounter.setText("0");
        timecounter.setText("0"); //or "0:00" or w/e
        mines = 10;
        easyFlags = 10;
    }

There's probably slightly more but I don't want do what is clearly some sort of school project for you lol

Chris Trudeau
  • 1,427
  • 3
  • 16
  • 20