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

📄 mineframe.java

📁 主要用java的Swing
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/**
 * JAVA语言的扫雷程序
 * 在本程序中每个按钮都有它的状态值,用于进行事件的处理
 * 按钮状态值的说明:0-9表示按钮已经被点击过,0-8,表示按钮周围按钮的雷数,9表示此按钮是雷,已经被点击
 *                  10-19,表示按钮为初始状态,没有被点击或被插旗,10-18表示按钮周围按钮的雷数,19表示此按钮是雷,是初始化状态
 *					20-29,表示按钮被插上旗,处于标记状态
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.Font;
import java.io.*;
import java.util.ArrayList;

public class MineFrame extends JFrame implements ActionListener
{
	/**
	 * 程序入口函数
	 */
	public static void main(String args[])
	{
			SetFont.setFont(new Font("宋体", 0, 12));
			System.out.println("ss");
			new MineFrame(10,9,9);
	}
	/**
	 *	定义菜单
	 */
	JMenuBar menuBar=null;
	JMenu menuGame=new JMenu("游戏(G)");
		JMenuItem KSItem=new JMenuItem("开局(N)");
		JCheckBoxMenuItem CJItem=new JCheckBoxMenuItem("初级(B)");
		JCheckBoxMenuItem ZJItem=new JCheckBoxMenuItem("中级(I)");
		JCheckBoxMenuItem GJItem=new JCheckBoxMenuItem("高级(E)");
		JCheckBoxMenuItem ZDYItem=new JCheckBoxMenuItem("自定义(C)");
		JMenuItem YXBItem=new JMenuItem("扫雷英雄榜(T)");
		JMenuItem TCItem=new JMenuItem("退出(X)");
	JMenu menuAbout=new JMenu("帮助(H)");
		JMenuItem BZItem=new JMenuItem("帮助主题(H)");
		JMenuItem GYItem=new JMenuItem("关于本程序(A)");

	/**
	 *	定义布局用到的组件
	 */
	private JButton beginBtn;  						 //开始按钮
	public static MineButton [][]mineBtn;   		 //雷的按钮
	private MineButton bttmp;
	private JPanel pane=new JPanel();  				 //用于布局的面板
	private JPanel pane1=new JPanel();
	private JPanel pane2;
	private JPanel pane3=new JPanel();
	private JLabel label,lb1,lb2,lb3,lb4,lb5,lb6,lb7; //用于布局的标签

	/**
	 *	定义数据变量
	 */

	Timer t=new Timer(1000,new timerLin());  //定时器,用于显示扫雷的进度时间
	Timer tdouble=new Timer(300,new ter());  //定时器,用于控制是否双击
	Timer time=new Timer(200,new YangShi());

	public static int mineNumber,rows,cols;	 //构造器的参数
	private Point p;  						//用于得到窗体的坐标,让JDialog定位显示
	private int doubleClieckID=0;			//存储双击鼠标的值
	private boolean bool=true;				//如果值为false的话就不进行任何的鼠标判断
	private int finishtime;					//得到完成扫雷的时间
	private JLabel []XYBlb=new JLabel[12];	//扫雷英雄榜的标签
	private int JiBei=0;                    //记录等级

	private ArrayList al;					//用于往文件里写数据
	private String names[]={"","","","","",""};    //用于接收ArrayList里的数据
	private String YXName="";				 //用于改变英雄榜的名字
	private String []YXBStr={"初级:","中级:","高级:","999","秒","999","秒","999","秒","佚名","佚名","佚名"};
	private Point frameP=new Point();        //用于存储frame的坐标
	private int CJFinishTime,ZJFinishTime,GJFinishTime; //分别是初级,中级,高级的扫雷的完成时间.
	String s1,s2,s3,s4,s5,s6;                //用于接收英雄榜的标签值
	Toolkit tk=Toolkit.getDefaultToolkit();

	/**
	 * 用于临时存储按钮的状态值,在右键点击的时候,判断是插旗,还是拔旗
	 * tempmineNumber用于记录雷的数量,在判断是否赢 和点击开始按钮或开局菜单的时候用到
	 */
	private int tempmineNumber=0;

	public static int tempx,tempy;
	int doubleCliecktmp=0;

	/**
	 *	构造器
	 */
	public MineFrame(){}
	public MineFrame(int mineNumber,int rows,int cols)
	{
		this.mineNumber=mineNumber;
		this.rows=rows;
		this.cols=cols;
		this.tempmineNumber=mineNumber;
		tdouble.start();
		time.start();

		constructYXBlb();
		ReadFile();

		/**
		 * 窗体属性的设置
		 */
		setTitle("扫雷");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds((int)frameP.getX(),(int)frameP.getY(),cols*20-4,rows*20+95);
		Image img=tk.createImage("image/lei.jpg");
		setIconImage(img);
		setResizable(false);

		/**
		 * 判定级别
		 */
		 if(cols==9 & rows==9 & mineNumber==10)JiBei=1;
		 if(cols==16 & rows==16 & mineNumber==40)JiBei=2;
		 if(cols==30 & rows==16 & mineNumber==99)JiBei=3;

		/**
		 * 开始按钮的初始化
		 */
		beginBtn=new JButton(new ImageIcon(MineFrame.class.getResource("image/3.jpg")));
		beginBtn.setFocusPainted(false);
		beginBtn.setMargin(new Insets(0,0,0,0));
		beginBtn.setBorder(new BevelBorder(BevelBorder.RAISED));
		beginBtn.addMouseListener(new beginBtnFace());

		/**
		 * 雷区按钮的初始化
		 */
		mineBtn=new MineButton[rows][cols];

		/**
		 *  调用方法
		 */
		pane2();
		constructMenu();
		constructMineBtn();
		constructMine();
		ShowMineNumber();

		/**
		 *  设置英雄榜的标签
		 */
		 if(names[0]==null | names[0].equals(""))
		 {
			XYBlb[3].setText("999");XYBlb[5].setText("999");
			XYBlb[7].setText("999");XYBlb[9].setText("佚名");
			XYBlb[10].setText("佚名");XYBlb[11].setText("佚名");
		 }
		 else
		 {
			 	XYBlb[3].setText(names[0]);XYBlb[5].setText(names[1]);
			 	XYBlb[7].setText(names[2]);XYBlb[9].setText(names[3]);
				XYBlb[10].setText(names[4]);XYBlb[11].setText(names[5]);
		 }


		/**
		 * 当点击开始按钮或菜单栏的开始,读取文件,然后写入
		 * 主要存在frame问题,是否在当前的位置
		 */
		s1=names[0];s2=names[1];s3=names[2];
		s4=names[3];s5=names[4];s6=names[5];


		/**
		 *  窗体的布局
		 *	lb1上显示雷数,lb2显示时间,lb3用于放置开始按钮
		 *  pane1放置lb1,lb2,lb3,并用边框布局,设置边框样式为下陷样式
		 *  pane2放置雷区的按钮,设置边框样式为下陷样式
		 *  pane3放置pane1,pane2,用边框布局,设置边框样式为空
		 *  pane上放置lb4,lb5,lb6,lb7以及pane3,lb4,lb5,lb6,lb7放在四周,pane3放在中间,边框布局
		 */
		label=new JLabel();     lb1=new JLabel();
		lb2=new JLabel("000");  lb3=new JLabel();
		if(mineNumber<10)
		{
			lb1.setText("00"+mineNumber);
		}
		else
		{
			lb1=new JLabel("0"+mineNumber);
		}

		label.setPreferredSize(new Dimension(100,15));

		lb1.setFont(new Font("Engravers MT",0,24));
		lb2.setFont(new Font("Engravers MT",0,24));
		lb1.setPreferredSize(new Dimension(50,23));
		lb2.setPreferredSize(new Dimension(50,23));
		lb1.setOpaque(true);
		lb2.setOpaque(true);
		lb1.setBackground(Color.black);
		lb2.setBackground(Color.black);
		lb1.setForeground(Color.red);
		lb2.setForeground(Color.red);

		lb3.setLayout(new FlowLayout(FlowLayout.CENTER,10,3));
		lb3.add(beginBtn);

		pane1.setLayout(new BorderLayout());
		pane1.setPreferredSize(new Dimension(175 ,30));
		pane1.setBorder(new BevelBorder(BevelBorder.LOWERED));
		pane1.add(lb1,BorderLayout.WEST);
		pane1.add(lb3,BorderLayout.CENTER);
		pane1.add(lb2,BorderLayout.EAST);

		pane3.setBorder(new EmptyBorder(new Insets(0,0,0,0)));
		pane3.setLayout(new BorderLayout());
		pane3.add(pane1,BorderLayout.NORTH);
		pane3.add(pane2,BorderLayout.CENTER);

		lb4=new JLabel();
		lb5=new JLabel();
		lb6=new JLabel();
		lb7=new JLabel();
		lb4.setPreferredSize(new Dimension(800,5));
		lb5.setPreferredSize(new Dimension(5,600));
		lb6.setPreferredSize(new Dimension(5,600));
		lb7.setPreferredSize(new Dimension(800,5));

		pane.setBorder(new BevelBorder(BevelBorder.RAISED));
		pane.setLayout(new BorderLayout());
		pane.add(pane3,BorderLayout.CENTER);
		pane.add(lb4,BorderLayout.NORTH);
		pane.add(lb5,BorderLayout.WEST);
		pane.add(lb6,BorderLayout.EAST);
		pane.add(lb7,BorderLayout.SOUTH);

		Container con=getContentPane();
		con.add(pane,BorderLayout.CENTER);
		con.add(label,BorderLayout.SOUTH);
		setVisible(true);
	}

	public void pane2()
	{
		pane2=new JPanel();
		pane2.setLayout(new GridLayout(rows,cols,1,1));
		pane2.setBorder(new BevelBorder(BevelBorder.LOWERED));
		pane2.setPreferredSize(new Dimension(175,170));
	}

	/**
	 *  读取文件信息
	 */
	public void ReadFile()
	{
		al=new ArrayList();
		try
		{
			FileInputStream fo=new FileInputStream("mine.dat");
			ObjectInputStream oos=new ObjectInputStream(fo);
			Object obj=oos.readObject();
			fo.close();

			if(obj instanceof ArrayList)
			{
				ArrayList hh=(ArrayList)obj;

				for(int i=0;i<hh.size();i++)
				{
					Object tmp=hh.get(i);
					if(tmp instanceof String)
					{
						names[i]=(String)hh.get(i);
					}
					if(tmp instanceof Point)
					{
						frameP=(Point)hh.get(i);
					}
					al.clear();  //清空ArrayList
				}
			}

		}catch(Exception e)
		{
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
	/**
	 *  存储信息
	 */
	public void write()
	{
		p=getLocation();
		al.add(s1);al.add(s2);al.add(s3);
		al.add(s4);al.add(s5);al.add(s6);
		al.add(p);
		try
		{
			FileOutputStream fo=new FileOutputStream("mine.dat");
			ObjectOutputStream oos=new ObjectOutputStream(fo);
			oos.writeObject(al);
			al.clear();
			fo.close();
		}catch(Exception err)
		{
			System.out.println("写文件出错");
			System.out.println(err.getMessage());
		}
	}

	public void writeB()
	{
		try
		{
			FileOutputStream fo=new FileOutputStream("mine.dat");
			ObjectOutputStream oos=new ObjectOutputStream(fo);
			oos.writeObject(al);
			al.clear();
			fo.close();
		}catch(Exception err)
		{
			System.out.println("写文件出错");
			System.out.println(err.getMessage());
		}
	}

	/**
	 * 初始化按钮的方法
	 */
	public void constructMineBtn()
	{
		for(int i=0;i<rows;i++)
		{
			for(int j=0;j<cols;j++)
			{
				mineBtn[i][j]=new MineButton();
				mineBtn[i][j].addMouseListener(new MouseE());
				mineBtn[i][j].addMouseListener(new doub());
				mineBtn[i][j].setBorder(new BevelBorder(BevelBorder.RAISED));
				mineBtn[i][j].setBackground(new Color(220,220,220));
				pane2.add(mineBtn[i][j]);
			}
		}
	}
	/**
	 * 随机布雷的方法
	 */
	public void constructMine()
	{
		for(int i=0;i<mineNumber;i++)
		{
			int a=(int)(Math.random()*rows);
			int b=(int)(Math.random()*cols);
			if(mineBtn[a][b].id==19)
			{
				i--;
			}
			else
			{
				mineBtn[a][b].id=19;
			}
		}
	}

	/**
	 *初始化英雄榜的标签的方法
	 */
	public void constructYXBlb()
	{
		for(int i=0;i<XYBlb.length;i++)
		{
			XYBlb[i]=new JLabel(YXBStr[i]);
		}
	}
	/**
	 * 设置按钮的状态值的方法
	 */
	public void ShowMineNumber()
	{
		for(int i=0;i<rows;i++)
		{
			for(int j=0;j<cols;j++)
			{
				int index=10;
				if(mineBtn[i][j].id==10)
				{
					if(i-1>=0 & j-1>=0)
					{
						index=mineBtn[i-1][j-1].id==19?++index:index;
					}
					if(i-1>=0)
					{
						index=mineBtn[i-1][j].id==19?++index:index;
					}
					if(i-1>=0 & j+1<cols)
					{
						index=mineBtn[i-1][j+1].id==19?++index:index;
					}
					if(j-1>=0)
					{
						index=mineBtn[i][j-1].id==19?++index:index;
					}
					if(j+1<cols)
					{
						index=mineBtn[i][j+1].id==19?++index:index;
					}
					if(i+1<rows & j-1>=0)
					{
						index=mineBtn[i+1][j-1].id==19?++index:index;
					}
					if(i+1<rows)
					{
						index=mineBtn[i+1][j].id==19?++index:index;
					}
					if(i+1<rows & j+1<cols)
					{
						index=mineBtn[i+1][j+1].id==19?++index:index;
					}
					mineBtn[i][j].id=index;
				}
			}
		}
	}

	/**
	 *  构建菜单方法
	 */
	public void constructMenu()
	{
		menuBar=new JMenuBar();
		if(JiBei==0){ZDYItem.setState(true);}
		if(JiBei==1){CJItem.setState(true);}
		if(JiBei==2){ZJItem.setState(true);}
		if(JiBei==3){GJItem.setState(true);}

		/**
		 * 游戏菜单
		 */
		menuGame.add(KSItem);
		menuGame.addSeparator();
		menuGame.add(CJItem);
		menuGame.add(ZJItem);
		menuGame.add(GJItem);
		menuGame.add(ZDYItem);
		menuGame.addSeparator();
		menuGame.add(YXBItem);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -