Hello
Could anyone help us , we have a minesweeper's game code in java the game is good but has two problem
the first one is when you press a mine button the game should be over and you can not press on any other button but our code allow you to continue even if you loss
the second problem is the smiley face button which allow you to reset the game only once
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
import java.util.Random;
import java.util.TimerTask;
public class MinesweeperNew2 extends JFrame implements MouseListener
{
JButton table[] []; //Array of Buttons
boolean bomb[] []; //array true if bomb is present on button [x][y]
boolean flag[] []; //array true if flag is present at button [x][y]
boolean exposed[] []; //used for exposing 0's. If true then a 0 has been exposed
boolean checkwinbool[] []; // if [x][y] = true then the button has a number on it or it is a bomb (used for checking if game is over)
int count = 0, bombsremaining; //counting the number of bombs placed
String surbombs; //number of bombs surrounding button [x][y] (is a string so that we can setLabel for the button)
int randx, randy; //random ints for bombs
int row = 9, col = 9, numbombs = 10; //number of rows columns, and bombs
int sizex = 450, sizey = 400;
Font font;
JPanel pane_up,pane_but,pane_all;
JButton smile;
Icon smile_pic=new ImageIcon("smile.gif");
JLabel Bombs, TimeRemaning,empty1,empty2;
Random but_randx=new Random();
Random but_randy=new Random();
public TimerDisplay t;
GridLayout g1= new GridLayout (row, col);
public MinesweeperNew2()
{
super("Minesweeper Game");
pane_but=new JPanel(g1);
pane_up =new JPanel();
pane_up.setLayout(new FlowLayout());
bombsremaining = numbombs;
Bombs = new JLabel (Integer.toString (bombsremaining));
smile=new JButton(smile_pic);
smile.addMouseListener (this);
TimeRemaning = new JLabel ();
empty1 = new JLabel (" ");
empty2 = new JLabel (" ");
pane_up.add(Bombs);
pane_up.add(empty1);
pane_up.add(smile);
pane_up.add(empty2);
pane_up.add(TimeRemaning);
font = new Font ("ComicSans", Font.BOLD, 40);
setFont (font);
table = new JButton [row] [col];
bomb = new boolean [row] [col];
flag = new boolean [row] [col];
exposed = new boolean [row] [col];
checkwinbool = new boolean [row] [col];
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y <col ; y++)
{
table [x] [y] = new JButton ();
table [x] [y].addMouseListener (this);
pane_but.add (table [x] [y]);
}
}
getContentPane().add (pane_up, "North");
getContentPane().add (pane_but, "Center");
pane_up.setBackground(Color.lightGray);
Bombs.setForeground(Color.white);
TimeRemaning.setForeground(Color.white);
Restart_Game (row, col, numbombs,sizex, sizey);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(sizex,sizey);
setVisible(true);
setLocation(200,100);
setResizable (false);
t = new TimerDisplay();
t.start();
}
public void Restart_Game (int row, int col, int numbombs,int sizex, int sizey)
{
setSize (sizex, sizey);
invalidate();
validate();
g1.setRows(row);
g1.setColumns(col);
int count = 0;
bombsremaining = numbombs;
Bombs.setText (Integer.toString (bombsremaining));
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
pane_but.remove (table [x] [y]);
}
}
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
table [x] [y].setEnabled (true);
table [x] [y].setLabel ("");
table [x] [y].setBackground (Color.gray);
table [x] [y].setForeground (Color.white);
pane_but.add (table [x] [y]);
bomb [x] [y] = false;
flag [x] [y] = false;
exposed [x] [y] = false;
checkwinbool [x] [y] = false;
}
}
setSize (sizex, sizey);
invalidate();
validate();
//adds the bombs to random places on the grid
while (count < numbombs)
{
randx = but_randx.nextInt(row);
randy = but_randx.nextInt(col);
if (bomb [randx] [randy] == false)
{
bomb [randx] [randy] = true;
checkwinbool [randx] [randy] = true;
count++;
}
}
}
public void mouseClicked (MouseEvent e)
{
boolean gameover = false;
if (e.getSource () == smile)
{
Restart_Game (row, col, numbombs, sizex, sizey);
t.reset();
t.start();
}
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
if (e.getSource () == table [x] [y])
{
//if left click, and there is no flag on the button
if (e.getButton () == e.BUTTON1 && flag [x] [y] == false)
{
if (bomb [x] [y] == true) // if you you click on a bomb, results in game over
{
table [x] [y].setLabel ("*");
gameover ();
table [x] [y].setBackground (Color.black);
table [x] [y].setEnabled(false);
gameover = true;
break;
}
exposed [x] [y] = true;
checkwinbool [x] [y] = true; // these set to true mean that the button has been clicked
surbombs = Integer.toString (surroundingBombs (x, y)); //gets the number of surrounding buttons with bombs and sets it to a string so that it is possible to setLabel
table [x] [y].setLabel (surbombs); // sets the label to be the number of bombs in the 8 surrounding buttons
if (surroundingBombs (x, y) == 0)
{
check (x, y); //calls a recursive method so that if a "0" is there the surrounding 8 buttins must be exposed and if one of those is "0" it too must be exposed and so on
}
}
// if it is a right click
else if (e.getButton () == e.BUTTON3)
{
//if there is a flag (second press)already present set it so that there is no flag
if (flag [x] [y] == true)
{
table [x] [y].setLabel ("");
table [x] [y].setForeground (Color.white);
flag [x] [y] = false;
checkwinbool [x] [y] = false;
bombsremaining++;
}
//(first time assign buton to flage)if there is no flag, set it so there is a flag
else if (checkwinbool [x] [y] == false || bomb [x] [y] == true)
{
table [x] [y].setLabel ("|>");
table [x] [y].setForeground (Color.red);
flag [x] [y] = true;
checkwinbool [x] [y] = true;
bombsremaining--;
}
Bombs.setText (Integer.toString (bombsremaining));
}
//if both left and right click at the same time
else if (e.getButton () == e.BUTTON2 && flag [x] [y] == false && checkwinbool [x] [y] == true && bomb [x] [y] == false)
{
//only executes if there is no flag, it has been exposed, and no bomb
if (flags (x, y) == surroundingBombs (x, y)) //checks that the number of flags around [x][y] = the number of bombs around [x][y]
{
for (int q = x - 1 ; q <= x + 1 ; q++)
{
for (int w = y - 1 ; w <= y + 1 ; w++)
{
if (q < 0 || w < 0 || q >= row || w >= col) // makes sure that it wont have an error for buttons next to the wall
break;
if (bomb [q] [w] == false && flag [q] [w] == true) //if there is no bomb, but there is a flag its game over
{
gameover ();
gameover = true;
break;
}
}
}
if (gameover == false)
{
expose (x, y); //eposes the surrounding 8 buttons
check (x, y); //checks if any of those are "0" and calls the recursive method
}
}
}
if (gameover == false) //this just calls the method for changing the colours of the buttons if they have been clicked
clicked ();
}
}
}
checkwin ();
}
public void clicked () //changes the color of the buttons and if [x][y] is "0" set the label to nothing
{
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
if (checkwinbool [x] [y] == true && flag [x] [y] == false && bomb [x] [y] == false)
table [x] [y].setBackground (Color.darkGray);
if (flag [x] [y] == false && surroundingBombs (x, y) == 0)
table [x] [y].setLabel ("");
}
}
}
public int flags (int x, int y) // get the number of surrounding flags
{
int surFlags = 0;
for (int q = x - 1 ; q <= x + 1 ; q++)
{
for (int w = y - 1 ; w <= y + 1 ; w++)
{
while (true)
{
if (q < 0 || w < 0 || q >= row || w >= col) // makes sure that it wont have an error for buttons next to the wall
break;
if (flag [q] [w] == true)
{
surFlags++;
}
break;
}
}
}
return surFlags;
}
public int surroundingBombs (int x, int y) // checks surrounding 8 squares for number of bombs (it does include itself, but has already been checked for a bomb so it won't matter)
{
int surBombs = 0;
for (int q = x - 1 ; q <= x + 1 ; q++)
{
for (int w = y - 1 ; w <= y + 1 ; w++)
{
while (true)
{
if (q < 0 || w < 0 || q >= row || w >= col) // makes sure that it wont have an error for buttons next to the wall
break;
if (bomb [q] [w] == true)
surBombs++;
break;
}
}
}
return surBombs;
}
public void expose (int x, int y) // exposes the surrounding 8 buttons
{
String surrbombs;
exposed [x] [y] = true;
for (int q = x - 1 ; q <= x + 1 ; q++)
{
for (int w = y - 1 ; w <= y + 1 ; w++)
{
while (true)
{
if (q < 0 || w < 0 || q >= row || w >= col) // makes sure that it wont have an error for buttons next to the wall
break;
if (flag [q] [w] == true)
break;
checkwinbool [q] [w] = true;
surrbombs = Integer.toString (surroundingBombs (q, w));
table [q] [w].setLabel (surrbombs);
table [q] [w].setEnabled(false);
break;
}
}
}
}
public void surr (int x, int y) //this is what checks if a surrounding button has "0" is so expose it and check around the exposed buttons until there is no more "0"'s
{
String surrbombs;
for (int q = x - 1 ; q <= x + 1 ; q++)
{
for (int w = y - 1 ; w <= y + 1 ; w++)
{
while (true)
{
if (q < 0 || w < 0 || q >= row || w >= col) // makes sure that it wont have an error for buttons next to the wall
break;
if (flag [q] [w] == true)
break;
if (exposed [q] [w] == false && surroundingBombs (q, w) == 0)
{
expose (q, w);
check (q, w);
}
break;
}
}
}
}
public void check (int x, int y) //calls the surr method but is neccesary because of the expose first
{
expose (x, y);
surr (x, y);
}
public void checkwin () //checks if all the button without bombs have been pressed
{
boolean allexposed = true;
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
if (flag [x] [y] == true && bomb [x] [y] == false)
allexposed = false;
if (checkwinbool [x] [y] == false)
{
allexposed = false;
break;
}
}
}
/* if (allexposed != false)
{
gameover ();
int x2 = (int) col / 2;
int y2 = (int) row / 2;
table [y2] [x2 - 4].setLabel ("Y");
table [y2] [x2 - 3].setLabel ("O");
table [y2] [x2 - 2].setLabel ("U");
table [y2] [x2 - 1].setLabel ("");
table [y2] [x2].setLabel ("W");
table [y2] [x2 + 1].setLabel ("I");
table [y2] [x2 + 2].setLabel ("N");
table [y2] [x2 + 3].setLabel ("!");
table [y2] [x2 + 4].setLabel ("!");
for (int i = -4 ; i < 5 ; i++)
{
table [y2] [x2 + i].setBackground (Color.black);
table [y2] [x2 + i].setForeground (Color.white);
}
}*/
}
// is called if bomb is clicked or on the double click if flag is not on a bomb
public void gameover ()
{
for (int x = 0 ; x < row ; x++)
{
for (int y = 0 ; y < col ; y++)
{
if (bomb [x] [y] == true)
{
table [x] [y].setLabel ("*"); //exposes all bombs
table [x] [y].setBackground (Color.red);
}
table [x] [y].setEnabled (false); //disable all buttons
}
}
t.stop();
/* int x2 = (int) col / 2;
int y2 = (int) row / 2;
table [y2] [x2 - 4].setLabel ("Y");
table [y2] [x2 - 3].setLabel ("O");
table [y2] [x2 - 2].setLabel ("U");
table [y2] [x2 - 1].setLabel ("");
table [y2] [x2].setLabel ("L");
table [y2] [x2 + 1].setLabel ("O");
table [y2] [x2 + 2].setLabel ("S");
table [y2] [x2 + 3].setLabel ("E");
table [y2] [x2 + 4].setLabel ("!");
for (int i = -4 ; i < 5 ; i++)
{
table [y2] [x2 + i].setBackground (Color.black);
table [y2] [x2 + i].setForeground (Color.white);
}*/
}
/////////////////////////////////////////////////////////////////
//These are not used but are necessary for mouseListener
public void mouseEntered (MouseEvent e)
{
}
public void mouseExited (MouseEvent e)
{
}
public void mousePressed (MouseEvent e)
{
}
public void mouseReleased (MouseEvent e)
{
}
public static void main (String[] args) {
new MinesweeperNew2();
}
class TimerDisplay {
private int nbSeconds=-1;
private java.util.Timer timer;
public void start() {
timer=new java.util.Timer();
TimerTask task=new TimerTask() {
public void run() {
nbSeconds++;
TimeRemaning.setText(""+nbSeconds);
}
};
timer.scheduleAtFixedRate(task,0,1000);
}
public void stop() {
timer.cancel();
}
public void reset() {
timer.cancel();
nbSeconds=-1;
TimeRemaning.setText(""+0);
}
public int getSeconds() {return nbSeconds;}
}
}
Please help us