⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mineframe.java

📁 eclipse环境下编写的java扫雷程序
💻 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 + -