📄 mineframe.java
字号:
//窗体类,提供整个界面
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;
//继承自JFrame并实现鼠标点击处理的接口
public class MineFrame extends JFrame implements MouseListener{
static public MineButton [][] myButtons; //扫雷的整个按钮
private MineMap myMine; //雷区的数据
private Container mycontainer; //窗体容器
private GridLayout mygrid; //格子,布局一大堆按钮用
private JPanel panelMine;
private JPanel panelTip;
private int remains;
private JButton label; //显示剩余雷数
private JButton label5; //显示已用时间
private int time; //已用时间
private Ticktask tk;
class Ticktask
{
private Timer tim;
public Ticktask()
{
tim=new Timer();
}
private TimerTask task=new TimerTask()
{
public void run()
{
MineFrame.this.label5.setText(""+(++time)+"");
}
};
public void start(int a,int b)
{
MineFrame.this.time=0;
try{
tim.schedule(task, a*1000,b*1000);
}catch(IllegalStateException e)
{}
}
}
//重设雷区,并把按钮和雷区数据相连,把按钮设置为未点击
private void startMine()
{
tk=new Ticktask();
time=0;//重设计时器
this.label5.setText(""+(time)+"");//重设显示时间
remains=MineMap.numberofMines;
this.label.setText(""+this.remains);
myMine.reset();
for(int i=0;i<MineMap.rows;i++)
for(int j=0;j<MineMap.colums;j++)
myButtons[i][j].mines=myMine.maps[i][j];
closeallMines();
}
public MineFrame() {
super("MineSweeper");
//实例化计时器
// tk=new Ticktask();
this.iniMenu();
//初始化棋盘
this.iniButtons(0);//默认设置为初级
this.setVisible(true);//显示
}
private void iniMenu()
{
// 添加菜单功能
MenuBar mb=new MenuBar();
MenuItem m1=new MenuItem("eazy");
MenuItem m2=new MenuItem("normal");
MenuItem m3=new MenuItem("hard");
MenuItem m4=new MenuItem("customize");
m1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ee)
{
tk.tim.cancel();
MineFrame.this.mycontainer.removeAll();
MineFrame.this.iniButtons(0);
}
});
m2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ee)
{
tk.tim.cancel();
MineFrame.this.mycontainer.removeAll();
MineFrame.this.iniButtons(1);
}
});
m3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ee)
{
tk.tim.cancel();
MineFrame.this.mycontainer.removeAll();
MineFrame.this.iniButtons(2);
}
});
m4.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ee)
{
MineFrame.this.mycontainer.removeAll();
MineFrame.this.iniButtons(3);
}
});
Menu m=new Menu("choose level");
m.add(m1);
m.add(m2);
m.add(m3);
m.add(m4);
mb.add(m);
this.setMenuBar(mb);
}
private void iniButtons(int level)
{
switch(level)
{
case 0:
MineMap.setData(10, 10, 10); //初级
break;
case 1:
MineMap.setData(16, 16, 40);//中级
break;
case 2:
MineMap.setData(16, 32, 50);//高级
break;
case 3:
int tempr=Integer.parseInt(JOptionPane.showInputDialog(this,"input rows"));
int tempc=Integer.parseInt(JOptionPane.showInputDialog(this,"input colums"));
int tempm=Integer.parseInt(JOptionPane.showInputDialog(this,"input mines"));
MineMap.setData(tempc, tempr, tempm); //自定义
}
myMine=new MineMap();
myButtons=new MineButton [MineMap.rows][MineMap.colums];
mygrid=new GridLayout(MineMap.rows,MineMap.colums);
mycontainer=this.getContentPane();
panelMine=new JPanel();
panelMine.setLayout(mygrid);
//设置剩余雷数
remains=MineMap.numberofMines;
label=new JButton(""+remains);
label.setMargin(new Insets(1,1,1,1));
label.setEnabled(false);
panelTip=new JPanel();
panelTip.add(label);
//设置重新开始按钮
JButton restart =new JButton();
Icon ico=new ImageIcon("src\\re.gif");
restart.setIcon(ico);
restart.setMargin(new Insets(1,1,1,1));
restart.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
tk.tim.cancel();
MineFrame.this.startMine();
}
});
panelTip.add(restart);//把重新开始按钮加入顶部条
// 设置timer
label5=new JButton(""+time+"");
label5.setMargin(new Insets(1,1,1,1));
label5.setEnabled(false);
panelTip.add(label5);
//把顶部条加入进窗体
mycontainer.add(panelTip,BorderLayout.NORTH);
//实例化每一个按钮,并且加入容器,为其添加事件响应
for(int i=0;i<MineMap.rows;i++)
{
for(int j=0;j<MineMap.colums;j++)
{
myButtons[i][j]=new MineButton(i,j);
myButtons[i][j].addMouseListener(this);
panelMine.add(myButtons[i][j]);
}
}
mycontainer.add(panelMine);
//设置frame的大小
this.setSize(21*MineMap.colums,21*MineMap.rows+100);
this.startMine();//重设棋局
}
private void openBlankButton(int row,int colum)
{
myMine.openwhichShouldShow(row,colum);
} //打开应该打开的空白区域
public void mouseClicked(MouseEvent e)
{
Icon ico=new ImageIcon("src\\flag.gif");
MineButton button= (MineButton)e.getSource(); //得到按钮
if(button.state==0){ //如果按钮没有不可用,执行
if(!e.isMetaDown()) //如果点击的是左键
{
//计时器启动
if(this.time==0)
this.tk.start(1, 1);
//如果被标记为雷,不能点
if(button.getIcon()!=null)
return;
button.lockthis(); //显示,并且锁定自己
if(button.mines==0) //如果周围一个雷都没 要显示周边的
openBlankButton(button.row,button.colum);
// JOptionPane.showMessageDialog(null,""+MineButton.opened);
//判断胜负,踩到雷就输了
if(button.mines==-1)
{
tk.tim.cancel();
this.showallMines();
JOptionPane.showMessageDialog(this,"you lost");
startMine();
}else if(MineButton.opened==MineMap.rows*MineMap.colums-MineMap.numberofMines)
{
tk.tim.cancel();
JOptionPane.showMessageDialog(this,"you win " + "time is "+time +"second");
startMine();
}
}
else if(button.getIcon()==null) //点击的是右键,设置&清除标记雷
{
//button.setText("#");
button.setIcon(ico);
remains--;
}
else{
// button.setText("");
button.setIcon(null);
remains++;
}
//点击之后 重新设置显示剩余雷数
label.setText(""+remains);
}
} //响应鼠标点击事件
public void mouseExited(MouseEvent e1){
} //这四个用不着 但是不写不行- -
public void mouseEntered(MouseEvent e2){
}
public void mousePressed(MouseEvent e3){
}
public void mouseReleased(MouseEvent e4){
}
private void showallMines()
{
for(int i=0;i<myMine.colums;i++)
for(int j=0;j<myMine.rows;j++)
if(myButtons[j][i].mines==-1)
myButtons[j][i].lockthis();
} //输啦,把所有的雷都显示出来吧
private void closeallMines()
{
MineButton.opened=0;
for(int i=0;i<myMine.colums;i++)
for(int j=0;j<myMine.rows;j++)
myButtons[j][i].unlockthis();
} //重头来过,把所有的雷隐藏
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -