d2jsp
Log InRegister
d2jsp Forums > Off-Topic > Computers & IT > Programming & Development > Java Minesweeper
Add Reply New Topic New Poll
Member
Posts: 290
Joined: Oct 6 2013
Gold: 2,950.58
Nov 23 2020 12:50am
Java Mine Sweeper

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.Random;
import java.lang.Math;

public class MineSweeper extends JFrame implements MouseListener
{
public static final int WINDOW_WIDTH = 440;
public static final int WINDOW_HEIGHT = 460;
public int x1, y1;
int [][] Grid = new int[20][20];
int [][] GridNumber = new int[20][20];
int locX = 0;
int locY = 0;
int uncovered = 400;
int Flag = 0;
int numMines;
int Newgame = 1; // 0 if still playing 1 if new game

public MineSweeper()
{
this.addMouseListener(this);
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Minesweeper");
getContentPane().setBackground(Color.WHITE);
setVisible(true);
}

public static void main(String[] args)
{
MineSweeper drawing = new MineSweeper();
}

public void paint(Graphics g)
{
super.paint(g);
if (Newgame == 1)
{
init();
Newgame = 0;
}

board2(g);
}

public void init()
{
Random rand = new Random();
numMines = 0;
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
{
uncovered = 400;
Flag = 0;
// Set Mines
if (rand.nextInt(100) < 20)
{
Grid[j] = 11;
numMines++;
}
else
{
Grid[j] = 0;
}
GridNumber[j] = 0;
//System.out.print("Grid;"+Grid[j]);
}
}
}
for (int i = 1; i < 19; i++)
{
for (int j = 1; j < 19; j++)
{
if (Grid[j] == 11)
{
GridNumber[i-1][j-1]++;
GridNumber[i+1][j+1]++;
GridNumber[i+1][j-1]++;
GridNumber[i-1][j+1]++;
GridNumber[j+1]++;
GridNumber[i+1][j]++;
GridNumber[i-1][j]++;
GridNumber[j-1]++;
}
}
}
if (Grid[0][0] == 11)
{
GridNumber[1][0]++;
GridNumber[0][1]++;
GridNumber[1][1]++;
}
if (Grid[19][0] == 11)
{
GridNumber[18][0]++;
GridNumber[19][1]++;
GridNumber[18][1]++;
}
if (Grid[0][19] == 11)
{
GridNumber[0][18]++;
GridNumber[1][19]++;
GridNumber[1][18]++;
}
if (Grid[19][19] == 11)
{
GridNumber[18][19]++;
GridNumber[19][18]++;
GridNumber[18][18]++;
}
for(int i = 1; i < 19; i++)
{
if (Grid[0] == 11)
{
GridNumber[i-1][0]++;
GridNumber[i+1][0]++;
GridNumber[i-1][1]++;
GridNumber[i+1][1]++;
GridNumber[1]++;
}
if (Grid[0] == 11)
{
GridNumber[0][i-1]++;
GridNumber[0][i+1]++;
GridNumber[1][i-1]++;
GridNumber[1][i+1]++;
GridNumber[1]++;
}
if (Grid[19] == 11)
{
GridNumber[19][i-1]++;
GridNumber[19][i+1]++;
GridNumber[18][i-1]++;
GridNumber[18][i+1]++;
GridNumber[18]++;
}
if (Grid[19] == 11)
{
GridNumber[i-1][19]++;
GridNumber[i+1][19]++;
GridNumber[i-1][18]++;
GridNumber[i+1][18]++;
GridNumber[18]++;
}
}

}

public void board2(Graphics g)
{
System.out.println("uncovered= " + uncovered + "MineFlag= " + Flag);
for (int i = 1; i<22; i++)
{
g.drawLine(i*20, 40, i*20, 440);
}
for (int i = 1; i<22; i++)
{
g.drawLine(20, i*20+20, 420, i*20+20);
}

for (int i = 0; i < 20; i++)
for (int j = 0; j < 20; j++)
{
{
if (Grid[j] == 0 || Grid[j] == 11)
{
uncovered(g, i+1, j+1);
}
else if (Grid[j] == 1)
{
empty(g, i+1, j+1);
}
else if (Grid[j] > 1 && Grid[j] < 10)
{
emptyNumber(g, i+1, j+1);
}
else if (Grid[j] == 10)
{
Flag(g, i+1, j+1);
}
else if (Grid[j] == 14)
{
Flag(g, i+1, j+1);
}
else if (Grid[j] == 13 || Grid[j] == 15)
{
questionMark(g, i+1, j+1);
}
else if (Grid[j] == 16)
{
Mine(g, i+1, j+1);
Newgame = 1;
}
}
}
}

public void uncovered(Graphics g, int x, int y)
{
x = x * 20;
y = y * 20 + 20;
Color Skyblue = new Color(0,170,170);
Color Midblue = new Color(0,200,200);
Color Between = new Color(0,224,234);
Color Darkblue = new Color (0,230,230);
g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Skyblue);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkblue);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Skyblue);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkblue);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Midblue);
g.fillRect(x + 3, y + 3, 15, 15);
}

public void empty(Graphics g, int x, int y)
{
x = x * 20;
y = y * 20 + 20;
Color Lightgray = new Color(170,170,170);
Color Between = new Color(200,200,200);
Color Darkgray = new Color (230,230,230);
g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Lightgray);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkgray);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Lightgray);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkgray);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Between);
g.fillRect(x + 3, y + 3, 15, 15);
}

public void Mine(Graphics g, int x, int y)
{
x = x * 20;
y = y * 20 + 20;
Color Lightgray = new Color(170,170,170);
Color Between = new Color(200,200,200);
Color Darkgray = new Color (230,230,230);
Color purple = new Color (100,101,100);

g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Lightgray);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkgray);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Lightgray);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkgray);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Between);
g.fillRect(x + 3, y + 3, 15, 15);


g.setColor(purple);
g.drawLine(x+2, y+2, x+18, y+18);
g.drawLine(x+2, y+18, x+18, y+2);
g.fillRect(x+7,y+4,6,12);
g.fillRect(x+4,y+7,12,6);

g.drawLine(x+8, y+3, x+11, y+3);
g.drawLine(x+3, y+8, x+3, y+11);
g.drawLine(x+16, y+8, x+16, y+11);
g.drawLine(x+8, y+16, x+11, y+16);
g.drawLine(x+9, y+2, x+10, y+2);
g.drawLine(x+2, y+9, x+2, y+10);
g.drawLine(x+17, y+9, x+17, y+10);
g.drawLine(x+9, y+17, x+10, y+17);

}

public void emptyNumber(Graphics g, int x, int y)
{
int w = x;
int q = y;
x = x * 20;
y = y * 20 + 20;
Color Lightgray = new Color(170,170,170);
Color Between = new Color(200,200,200);
Color Darkgray = new Color (230,230,230);
Color SkyBlue = new Color(0,0,245);

Color LightBlue = new Color(0,20,85);
Color Green = new Color(0,155,0);
Color Red = new Color (250,50,50);
Color DarkBlue = new Color(0,0,255);
Color DarkRed = new Color(158,17,117);
Color Yellow = new Color(236,255,0);
Color Purple = new Color (255,0,255);
Color DarkPurple = new Color(196,60,185);

g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Lightgray);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkgray);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Lightgray);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkgray);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Between);
g.fillRect(x + 3, y + 3, 15, 15);

// if Grid
if (GridNumber[w-1][q-1] == 1)
{
g.setColor(LightBlue);
g.drawLine(x+7,y+6,x+10,y+6);
g.drawLine(x+9,y+5,x+10, y+5);
g.drawLine(x+10,y+7,x+10,y+14);
g.drawLine(x+7,y+15,x+13,y+15);
}
else if (GridNumber[w-1][q-1] == 2)
{
g.setColor(Green);
g.drawLine(x+7,y+6,x+7,y+6);
g.drawLine(x+8,y+5,x+11,y+5);
g.drawLine(x+12,y+6,x+12,y+10);
g.drawLine(x+11,y+11,x+6,y+16);
g.drawLine(x+11,y+10,x+7,y+14);
g.drawLine(x+7,y+15,x+12,y+15);

}
else if (GridNumber[w-1][q-1] == 3)
{
g.setColor(Red);
g.drawLine(x+7,y+6,x+8,y+6);
g.drawLine(x+8,y+5,x+11,y+5);
g.drawLine(x+11,y+6,x+12,y+6);
g.drawLine(x+12,y+7,x+12,y+8);
g.drawLine(x+11,y+9,x+11,y+9);
g.drawLine(x+10,y+10,x+8,y+10);
g.drawLine(x+12,y+12,x+12,y+13);
g.drawLine(x+11,y+14,x+11,y+14);
g.drawLine(x+10,y+15,x+8,y+15);
g.drawLine(x+7,y+14,x+7,y+14);
}
else if (GridNumber[w-1][q-1] == 4)
{
g.setColor(DarkBlue);
g.drawLine(x+10,y+6,x+5,y+11);
g.drawLine(x+10,y+7,x+10,y+16);
g.drawLine(x+5,y+12,x+12,y+12);
}
else if (GridNumber[w-1][q-1] == 5)
{
g.setColor(DarkRed);
g.drawLine(x+8,y+5,x+12,y+5);
g.drawLine(x+8,y+6,x+8,y+9);
g.drawLine(x+9,y+9,x+11,y+9);
g.drawLine(x+11,y+10,x+11,y+10);
g.drawLine(x+12,y+10,x+12,y+14);
g.drawLine(x+11,y+14,x+11,y+14);
g.drawLine(x+11,y+15,x+8,y+15);
g.drawLine(x+7,y+14,x+7,y+14);
}

else if (GridNumber[w-1][q-1] == 6)
{
g.setColor(Yellow);
g.drawLine(x+9,y+5,x+11,y+5);
g.drawLine(x+12,y+6,x+12,y+6);
g.drawLine(x+8,y+6,x+8,y+6);
g.drawLine(x+7,y+7,x+7,y+8);
g.drawLine(x+6,y+9,x+10,y+9);
g.drawLine(x+6,y+9,x+6,y+13);
g.drawLine(x+7,y+14,x+7,y+14);
g.drawLine(x+8,y+15,x+10,y+15);
g.drawLine(x+11,y+14,x+11,y+14);
g.drawLine(x+12,y+13,x+12,y+11);
g.drawLine(x+11,y+10,x+11,y+10);
}
else if (GridNumber[w-1][q-1] == 7)
{
g.setColor(Purple);
g.drawLine(x+7,y+5,x+13,y+5);
g.drawLine(x+12,y+6,x+12,y+7);
g.drawLine(x+11,y+8,x+11,y+9);
g.drawLine(x+10,y+10,x+10,y+12);
g.drawLine(x+9,y+13,x+9,y+14);
g.drawLine(x+8,y+15,x+8,y+15);

}
else if (GridNumber[w-1][q-1] == 8)
{
g.setColor(DarkPurple);
g.drawLine(x+8,y+6,x+8,y+6);
g.drawLine(x+9,y+5,x+10,y+5);
g.drawLine(x+11,y+6,x+11,y+6);
g.drawLine(x+12,y+7,x+12,y+8);
g.drawLine(x+11,y+9,x+11,y+9);
g.drawLine(x+12,y+10,x+12,y+11);
g.drawLine(x+11,y+12,x+11,y+12);
g.drawLine(x+9,y+13,x+10,y+13);
g.drawLine(x+8,y+12,x+8,y+12);
g.drawLine(x+7,y+11,x+7,y+10);
g.drawLine(x+8,y+9,x+8,y+9);
g.drawLine(x+7,y+7,x+7,y+8);
g.drawLine(x+9,y+9,x+10,y+9);

}
}

public void Flag(Graphics g, int x, int y)
{
x = x * 20;
y = y * 20 + 20;
Color Lightgray = new Color(100,100,100);
Color Between = new Color(130,130,130);
Color Darkgray = new Color (160,160,160);
Color LightRed = new Color (190, 0, 0);
Color Red = new Color(220,0,0);
Color DarkRed = new Color(250, 0, 0);

g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Lightgray);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkgray);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Lightgray);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkgray);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Between);
g.fillRect(x + 3, y + 3, 15, 15);


g.setColor(LightRed);
g.drawLine(x+11,y+3,x+7,y+7);
g.setColor(DarkRed);
g.fillRect(x+10,y+5,1,11);
g.fillRect(x+7,y+16,7,2);
g.drawLine(x+9,y+6,x+9, y+8);
g.drawLine(x+8,y+7,x+8,y+7);

}

public void questionMark(Graphics g, int x, int y)
{
x = x * 20;
y = y * 20 + 20;
Color Lightgray = new Color(100,100,100);
Color Between = new Color(130,130,130);
Color Darkgray = new Color (160,160,160);
Color Black = new Color (250, 250, 250);

g.setColor(Between);
g.drawLine(x, y, x+2, y+2);
g.drawLine(x + 18, y + 18, x + 20, y + 20);
g.drawLine(x, y + 20, x + 2, y + 18);
g.drawLine(x + 20, y, x + 2, y + 18);
g.setColor(Lightgray);
g.drawLine(x + 2, y + 2, x+18, y+2);
g.drawLine(x + 2, y + 2, x + 2, y + 18);
g.setColor(Darkgray);
g.drawLine(x + 18, y + 18, x + 18, y + 2);
g.drawLine(x + 18, y + 18, x + 2, y + 18);
// fill
g.setColor(Lightgray);
g.drawLine(x + 1, y + 1, x+19, y+1);
g.drawLine(x + 1, y + 1, x + 1, y + 19);
g.setColor(Darkgray);
g.drawLine(x + 19, y + 19, x + 19, y + 1);
g.drawLine(x + 19, y + 19, x + 1, y + 19);

g.setColor(Between);
g.fillRect(x + 3, y + 3, 15, 15);

// Drawing Question Mark
g.setColor(Black);
g.drawLine(x+8,y+6,x+8,y+6);
g.drawLine(x+9,y+5,x+11, y+5);
g.drawLine(x+12,y+6,x+12,y+8);
g.drawLine(x+11,y+9,x+11,y+9);
g.drawLine(x+10,y+10,x+10,y+12);
g.drawLine(x+10,y+14,x+10,y+15);

}

public void uncover(int Button)
{
for (int i = 0; i < 20; i++)
for (int j = 0; j < 20; j++)
{
{
if ((((i * 20) + 40) > locX) && (((i * 20) + 20) < locX) && (((j * 20) + 60) > locY) && (((j * 20)+40) < locY))
{ // left right up down
if (Button == 1) // left click
{
if (((Grid[j] == 0) || (Grid[j] == 10) || (Grid[j] == 13)) && (GridNumber[j] == 0))
{
RecursiveUncover(i,j);
}
else if (((Grid[j] == 0) || (Grid[j] == 10) || (Grid[j] == 13)) && (GridNumber[j] > 0))
{
Grid[j] = 0;
Grid[j] = GridNumber[j] + 1;
uncovered--;
}
else if ((Grid[j] == 11 || Grid[j] == 14 || (Grid[j] == 15)))
{
Grid[j] = 16;
}
}
else if (Button == 2)
{

if (countFlags(i,j) == true)
{
for (int w = -1; w < 2; w++)
for (int q = -1; q < 2; q++)
{
{
if (((i+w) >= 0) && ((j+q) >= 0) && ((i+w) < 20) && ((j+q) < 20))
{
if (((Grid[i+w][j+q] == 0) || (Grid[i+w][j+q] == 10) || (Grid[i+w][j+q] == 13)) && (GridNumber[i+w][j+q] == 0))
{
RecursiveUncover(i+w,j+q);
}
else if (((Grid[i+w][j+q] == 0) || (Grid[i+w][j+q] == 10) || (Grid[i+w][j+q] == 13)) && (GridNumber[i+w][j+q] > 0))
{
Grid[i+w][j+q] = 0;
Grid[i+w][j+q] = GridNumber[i+w][j+q] + 1;
uncovered--;
}
else if ((Grid[i+w][j+q] == 11 || (Grid[i+w][j+q] == 15)))
{
Grid[i+w][j+q] = 16;
}
}
}
}
}
}
else if (Button == 3)
{
if (Grid[j] == 0)
Grid[j] = 10;
else if (Grid[j] == 10)
Grid[j] = 13;
else if (Grid[j] == 13)
Grid[j] = 0;
else if (Grid[j] == 11)
{
Grid[j] = 14;
Flag++;
uncovered--;
}
else if (Grid[j] == 14)
{
Grid[j] = 15;
Flag--;
uncovered++;
}
else if (Grid[j] == 15)
{
Grid[j] = 11;
}
// 0 is uncovered 1 empty
// 2-9 numbers 10 is flag
// 11 is mine 12 is mineX
// 13 is question Mark 14 for 15 dual state flag question mark
}
}
}

repaint();
}
}
public void RecursiveUncover(int i, int j)
{
if ((i<0) || (j<0) || (i>19) || (j>19))
return;
if (Grid[j] == 0 && GridNumber[j] == 0)
{
Grid[j] = 1;
uncovered--;
//check upper neighbor
RecursiveUncover(i,j-1);
//check left neighbor
RecursiveUncover(i,j+1);
//check down neighbor
RecursiveUncover(i-1,j);
//check right neighbor
RecursiveUncover(i+1,j);
//check upper left neighbor
RecursiveUncover(i-1,j-1);
//check upper right neighbor
RecursiveUncover(i+1,j-1);
//check lower left neighbor
RecursiveUncover(i-1,j+1);
//check lower right neighbor
RecursiveUncover(i+1,j+1);
}
else if ((GridNumber[j] != 0) && (Grid[j] == 0))
{
Grid[j] = GridNumber[j] + 1;
uncovered--;
}
}

public boolean countFlags(int i, int j)
{
int Flagcount = 0;
int MineFlag = 0;
for (int w = -1; w < 2; w++)
{
for (int q = -1; q < 2; q++)
{
if (((i+w) >= 0) && ((j+q) >= 0) && ((i+w) < 20) && ((j+q) < 20))
{
if (Grid[i+w][j+q] == 14)
{
MineFlag++;
}
else if (Grid[i+w][j+q] == 10)
{
Flagcount++;
}
}
}
}

//System.out.println("Flag="+ (MineFlag + Flagcount) + "GridNum=" + GridNumber[j]);
if (GridNumber[j] == (MineFlag + Flagcount))
{
//System.out.println("True");
return true;
}
else
{
//System.out.println("False");
return false;
}
}
public void clickNeighbor(int i, int j)
{

}

public void reversal(int Button)
{
/*
for (int i = 1; i < 21; i++)
for (int j = 1; j < 21; j++)
{
if (((i * 20) < locX) && ((i * 20 + 20) > locX) && ((j * 20 + 20) < locY) && (locY < (j * 20 + 40)))
{
if (Button == 1) // left click released
{
Grid[i-1][j-1] = 1;
}
else if (Button == 2)
{
Grid[i-1][j-1] = 0;
}
}
}
repaint();
*/
}

public void mouseClicked(MouseEvent e)
{

}

public void mousePressed(MouseEvent e)
{
locX = e.getX();
locY = e.getY();
int Button = e.getButton();
//System.out.println("Button =" + Button + " locX=" + e.getX()+" locY=" + e.getY());
if ((uncovered + numMines) == Flag)
{
Newgame = 1;
}
uncover(Button);
}

public void mouseReleased(MouseEvent e)
{
/*
locX = e.getX();
locY = e.getY();
int Button = e.getButton();
reversal(Button);
repaint();
*/
}

public void mouseEntered(MouseEvent e)
{
}

public void mouseExited(MouseEvent e)
{
}
}
Go Back To Programming & Development Topic List
Add Reply New Topic New Poll