📄 mineframe.java
字号:
/**
* 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 + -