📄 mine.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Grid extends JLabel
{
private int id,status;
private boolean mine;
public Grid(int number)
{
super();
id=number;
status=2;
mine=false;
}
public void setMine(boolean m)
{
mine=m;
}
public boolean beMine()
{
return mine;
}
public void setStatus(int s)
{
status=s;
}
public int getStatus()
{
return status;
}
public int getID()
{
return id;
}
}
/****************************************************************************
*status clicked labeled clickable labelable doubleClick *
*0 true false false true *
*1 false true false true false *
*2 false false true true false *
****************************************************************************/
public class Mine extends JFrame
{
private Grid grid[];
private JButton restartButton;
private JPanel centerPanel,northPanel;
private JLabel labelField,timeField;
private Thread timeThread;
private int showCount,labelCount;
private boolean firstClick;
public final int WIDTH=9,MINES=10,B=WIDTH*WIDTH;
//setup GUI
public Mine()
{
super("扫雷--by Colin");
Container container=getContentPane();
container.setLayout(new BorderLayout());
//add northPanel
northPanel=new JPanel();
northPanel.setLayout(new GridLayout(1,3));
timeField=new JLabel("0",SwingConstants.CENTER);
northPanel.add(timeField);
//restartButton
restartButton=new JButton("restart");
restartButton.addActionListener
(
//anonymous inner class ActionListener
new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
//stop timeThread if any
timeThread=null;
changeMine();
showCount=0;
labelCount=MINES;
firstClick=true;
timeField.setText("0");
labelField.setText(""+MINES);
}
}
);
northPanel.add(restartButton);
labelField=new JLabel(""+MINES,SwingConstants.CENTER);
northPanel.add(labelField);
container.add(northPanel,BorderLayout.NORTH);
//add grids
centerPanel=new JPanel();
centerPanel.setLayout(new GridLayout(WIDTH,WIDTH));
grid=new Grid[B];
for(int i=0;i<B;i++)
{
grid[i]=new Grid(i);
grid[i].setIcon(new ImageIcon("PICS/10.gif"));
grid[i].addMouseListener
(
//anonymous inner class MouseAdapter
new MouseAdapter()
{
public void mouseClicked(MouseEvent mouseEvent)
{
//start timethread on first click
if(firstClick)
{
timeThread=new TimeThread();
timeThread.start();
firstClick=false;
}
//judge which grid is clicked
Grid clicked=(Grid)mouseEvent.getSource();
int i=clicked.getID();
//click when neither clicked nor labeled
if(mouseEvent.getButton()==1&&grid[i].getStatus()==2)
clickGrid(i,1);
//label when not clicked
else if(mouseEvent.getButton()==3&&grid[i].getStatus()!=0)
labelMine(i);
//double click when clicked
else if(mouseEvent.getButton()==2&&grid[i].getStatus()==0)
clickGrid(i,2);
}
}
);
centerPanel.add(grid[i]);
}
container.add(centerPanel,BorderLayout.CENTER);
//lay mines
for(int i=0;i<MINES;i++)
grid[i].setMine(true);
changeMine();
showCount=0;
labelCount=MINES;
firstClick=true;
setSize(267,321);
setResizable(false);
show();
}
//Method changeMine
private void changeMine()
{
boolean temp;
for(int i=0;i<B;i++)
{
int j=(int)(Math.random()*B);
grid[i].setIcon(new ImageIcon("PICS/10.gif"));
grid[i].setStatus(2);
//change
temp=grid[i].beMine();
grid[i].setMine(grid[j].beMine());
grid[j].setMine(temp);
}
}
//Method labelMine
private void labelMine(int i)
{
//being labeled
if(grid[i].getStatus()==1)
{
grid[i].setIcon(new ImageIcon("PICS/10.gif"));
grid[i].setStatus(2);
labelCount++;
}
//not being labeled
else
{
grid[i].setIcon(new ImageIcon("PICS/11.gif"));
grid[i].setStatus(1);
labelCount--;
}
//upgrade labelField
labelField.setText(labelCount+"");
}
//when grid[i] been clicked(cl indicate the botton).
private void clickGrid(int i,int cl)
{
int j;
int g[]={i-WIDTH-1,i-WIDTH,i-WIDTH+1,i-1,-1,i+1,i+WIDTH-1,i+WIDTH,i+WIDTH+1};
int count=0;
int lcount=0;
//change status to clicked
grid[i].setStatus(0);
//mine is clicked
if(grid[i].beMine())
{
grid[i].setIcon(new ImageIcon("PICS/13.gif"));
endGame(0);
return;
}
//not mine
//count mines and labeled grids around grid[i]
if(i%WIDTH==0)
{
g[0]=-1;
g[3]=-1;
g[6]=-1;
}
else if(i%WIDTH==WIDTH-1)
{
g[2]=-1;
g[5]=-1;
g[8]=-1;
}
if(i/WIDTH==0)
{
g[0]=-1;
g[1]=-1;
g[2]=-1;
}
else if(i/WIDTH==WIDTH-1)
{
g[6]=-1;
g[7]=-1;
g[8]=-1;
}
for(j=0;j<9;j++)
{
if(g[j]>=0)
{
if(grid[g[j]].beMine())
count++;
if(grid[g[j]].getStatus()==1)
lcount++;
}
}//end count
//click by left button
if(cl==1)
{
grid[i].setIcon(new ImageIcon("PICS/"+count+".gif"));
showCount++;
if(showCount==B-MINES)
{
endGame(1);
return;
}
//no mine around
if(count==0)
{
for(j=0;j<9;j++)
{
if(g[j]>=0&&grid[g[j]].getStatus()==2)
clickGrid(g[j],1);
}
}
}
//click by middle button
else
{
if(count==lcount)
{
for(j=0;j<9;j++)
{
if(g[j]>=0&&grid[g[j]].getStatus()==2)
clickGrid(g[j],1);
}
}
}
}
//execute on winning or losing
private void endGame(int status)
{
//stop counting time
timeThread=null;
//win
if(status==1)
JOptionPane.showMessageDialog(null,"you win!");
//lose
else
{
JOptionPane.showMessageDialog(null,"you lose!");
for(int i=0;i<B;i++)
{
//show mines not labeled
if(grid[i].beMine()&&grid[i].getStatus()==2)
grid[i].setIcon(new ImageIcon("PICS/9.gif"));
//show grid wrong labeled
if(!grid[i].beMine()&&grid[i].getStatus()==1)
grid[i].setIcon(new ImageIcon("PICS/12.gif"));
}
}
//forbid any actions
for(int i=0;i<B;i++)
grid[i].setStatus(0);
}
//execution application
public static void main(String args[])
{
Mine application=new Mine();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//class TimeThread to count time
private class TimeThread extends Thread
{
private int timepassed;
public TimeThread()
{
timepassed=0;
}
public void run()
{
final Thread currentThread=Thread.currentThread();
while(timepassed<1000&¤tThread==timeThread)
{
//change timeField
SwingUtilities.invokeLater
(
//inner class Runnable
new Runnable()
{
public void run()
{
timeField.setText(""+timepassed);
}
}
);
try
{
Thread.sleep(999);
}
catch(InterruptedException i)
{
System.err.println("sleep interrupted");
}
timepassed++;
}
}//end of method run
}//end of class TimeThread
}//end of class Mine
/************************************
* (C) Copyright 2004 by Colin Lin. *
* All Rights Reserved. *
************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -