import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class MineWindow extends JFrame implements ActionListener,MouseListener
{
private int X=160;
private int Y=240;
private JPanel minePanel,countPanel;
private GridLayout gLayout;
private Container gameContainer;
private int btnX=9,btnY=9;
private int numOfMine=10;
public int bombNum=numOfMine;
private int mineX,mineY;
private Color c;
private int mineCleared=0;
Counter count=new Counter();
MenuBar mb=new MenuBar();
Menu m=new Menu("Level");
MenuItem mItem1=new MenuItem("Low");
MenuItem mItem2=new MenuItem("Mid");
MenuItem mItem3=new MenuItem("High");
StartButton sbtn=new StartButton();
MineButton mbtn[][]=new MineButton[16][30];
Icon flag = new ImageIcon( "flag.gif" );
Icon explosion=new ImageIcon("explosion.gif");
Random rand = new Random();
public MineWindow()
{
super("MineSweeper");
initMenu();
this.setVisible(true);
this.setResizable(false);
this.initWindow();
this.initCounter();
sbtn.smileFace();
sbtn.setSize(X/5,X/5);
sbtn.addActionListener(this);
}
//初始化界面
public void initMenu()
{
m.add(mItem1);
m.add(mItem2);
m.add(mItem3);
mb.add(m);
this.setMenuBar(mb);
mItem1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
setLevel(1);
}
});
mItem2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
setLevel(2);
}
});
mItem3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
setLevel(3);
}
});
}
public void initWindow()
{
gameContainer=getContentPane();
minePanel=new JPanel();
countPanel=new JPanel();
countPanel.add(count);
countPanel.add(sbtn);
gameContainer.add(countPanel,"North");
gLayout=new GridLayout(btnY,btnX);
minePanel.setLayout(gLayout);
initButton();
initMine();
}
//初始化按钮
public void initButton()
{
for(int i=0;i<btnX;i++)
{
for(int j=0;j<btnY;j++)
{
mbtn[i][j]=new MineButton(i,j);
mbtn[i][j].setGridNum(0);
mbtn[i][j].addMouseListener(this);
mbtn[i][j].setFlag(false);
mbtn[i][j].setOpen(false);
mbtn[i][j].setBomb(false);
minePanel.add(mbtn[i][j]);
}
}
c=mbtn[1][1].getBackground();
gameContainer.add(minePanel,"Center");
this.setSize(X,Y);
}
public void removeButton()
{
for(int i=0;i<btnX;i++)
{
for(int j=0;j<btnY;j++)
{
minePanel.remove(mbtn[i][j]);
}
}
}
//设置等级
public void setLevel(int l)
{
this.setResizable(true);
removeButton();
if(l==1)
{
this.X=160;
this.Y=240;
this.btnX=9;
this.btnY=9;
this.numOfMine=10;
this.bombNum=this.numOfMine;
gLayout=new GridLayout(btnY,btnY);
minePanel.setLayout(gLayout);
}
if(l==2)
{
this.X=280;
this.Y=360;
this.btnX=16;
this.btnY=16;
this.numOfMine=40;
this.bombNum=this.numOfMine;
gLayout=new GridLayout(btnY,btnY);
minePanel.setLayout(gLayout);
}
if(l==3)
{
this.X=520;
this.Y=360;
this.btnX=16;
this.btnY=30;
this.numOfMine=99;
this.bombNum=this.numOfMine;
gLayout=new GridLayout(btnX,btnY);
minePanel.setLayout(gLayout);
}
setSize(X,Y);
initButton();
initMine();
initCounter();
replay();
this.setResizable(false);
}
//出示化地雷计数器
public void initCounter()
{
count.setRemainNum(numOfMine);
count.setCounter();
}
//设置地雷计数器
public void setCounter()
{
count.setRemainNum(bombNum);
count.setCounter();
}
//初始化地雷
public void initMine()
{
//用随机数产生雷
for(int i=0;i<numOfMine;i++)
{
mineX=rand.nextInt(btnX);
mineY=rand.nextInt(btnY);
if(mbtn[mineX][mineY].isBomb())
{
i--;
continue;
}
mbtn[mineX][mineY].setBomb(true);
// 给方格编号
if(mineX>0 && mineY>0)
{
mbtn[mineX-1][mineY-1].addGridNum();
}
if(mineX>0)
{
mbtn[mineX-1][mineY].addGridNum();
}
if(mineX>0 && mineY<btnY-1)
{
mbtn[mineX-1][mineY+1].addGridNum();
}
if(mineY<btnY-1)
{
mbtn[mineX][mineY+1].addGridNum();
}
if(mineX<btnX-1 && mineY<btnY-1)
{
mbtn[mineX+1][mineY+1].addGridNum();
}
if(mineX<btnX-1)
{
mbtn[mineX+1][mineY].addGridNum();
}
if(mineX<btnX-1 && mineY>0)
{
mbtn[mineX+1][mineY-1].addGridNum();
}
if(mineY>0)
{
mbtn[mineX][mineY-1].addGridNum();
}
}//end for loop
}
public void actionPerformed(ActionEvent e)
{
replay();
}
public void mouseClicked(MouseEvent e)
{
MineButton btn=(MineButton)e.getSource();
if(SwingUtilities.isLeftMouseButton(e) &&
!btn.getFlag() && !btn.getOpen())
{
if(!btn.isBomb())
{
//如果数字不为空,则翻开此数字
if(btn.getGridNum()!=0)
{
btn.setBackground(Color.gray);
btn.showNum(btn.getGridNum());
btn.setOpen(true);
}
//如果数字为空,翻开相邻的空位
else
{
openEmpty(mbtn,btn);
}
}
else
{
showAllBombs();
}
}
if(SwingUtilities.isRightMouseButton(e) && !btn.getFlag() && !btn.getOpen())
{
bombNum--;
setCounter();
btn.setIcon(flag);
btn.setFlag(true);
if(btn.getFlag() && btn.isBomb())
{
mineCleared++;
}
if(mineCleared==numOfMine)
{
JOptionPane.showMessageDialog(minePanel,"Congratulations,You win!");
}
}
else if(SwingUtilities.isRightMouseButton(e) && btn.getFlag() && !btn.getOpen())
{
if(btn.isBomb())
{
mineCleared--;
}
bombNum++;
setCounter();
btn.setFlag(false);
btn.setIcon(null);
}
}
public void mouseEntered(MouseEvent e)
{}
public void mouseReleased(MouseEvent e)
{}
public void mouseExited(MouseEvent e)
{}
public void mousePressed(MouseEvent e)
{}
public void openEmpty(MineButton[][] mineBtn,MineButton cBtn)
{
int i=cBtn.getRow();
int j=cBtn.getCol();
if(!mineBtn[i][j].isBomb() && !mineBtn[i][j].getFlag()
&& !mineBtn[i][j].getOpen())
{
if(mineBtn[i][j].getGridNum()>0)
{
mineBtn[i][j].showNum(mineBtn[i][j].getGridNum());
}
else
{
mineBtn[i][j].setOpen(true);
mineBtn[i][j].showNum(0);
if(i>0 && j>0)
openEmpty(mineBtn,mineBtn[i-1][j-1]);
if(i>0)
openEmpty(mineBtn,mineBtn[i-1][j]);
if(i>0 && j<btnY-1)
openEmpty(mineBtn,mineBtn[i-1][j+1]);
if(j<btnY-1)
openEmpty(mineBtn,mineBtn[i][j+1]);
if(i<btnX-1 && j<btnY-1)
openEmpty(mineBtn,mineBtn[i+1][j+1]);
if(i<btnX-1)
openEmpty(mineBtn,mineBtn[i+1][j]);
if(i<btnX-1 && j>0)
openEmpty(mineBtn,mineBtn[i+1][j-1]);
if(j>0)
openEmpty(mineBtn,mineBtn[i][j-1]);
}
}
}
public void showAllBombs()
{
sbtn.cryFace();
for(int i=0;i<btnX;i++)
{
for(int j=0;j<btnY;j++)
{
if(mbtn[i][j].isBomb())
{
mbtn[i][j].setIcon(explosion);
}
mbtn[i][j].setFlag(true);
}
}
JOptionPane.showMessageDialog(minePanel,"胜败乃兵家常事,大侠重新来过!");
}
public void replay()
{
for(int i=0;i<btnX;i++)
{
for(int j=0;j<btnY;j++)
{
mbtn[i][j].setFlag(false);
mbtn[i][j].setOpen(false);
mbtn[i][j].setGridNum(0);
mbtn[i][j].setIcon(null);
mbtn[i][j].setBackground(c);
mbtn[i][j].setBomb(false);
}
}
this.mineCleared=0;
this.bombNum=numOfMine;
sbtn.smileFace();
initMine();
this.initCounter();
}
public static void main(String[] args)
{
MineWindow mw=new MineWindow();
mw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}