📄 minesquare.java
字号:
//雷区MineSquare
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
public class MineSquare extends JPanel implements MouseListener
{
int rows=10,cols=10,雷数=10;
JButton buttonFace=null;
Block block[][];
TimeCount time;
CountMine count;
String grade=null;
RandomSetMine 随机布雷者;
FindAroundMineNumber 确定周围雷数者;
FindSafeArea 找出无雷联通区者;
DetermineDigArea 成片挖开者;
DetermineMineMarkIsRightOrWrong 确定雷标记是否正确者;
FindAroundMineMarkNumber 确定周围雷标数目者;
DecideWinner 判断是否胜利者;
Record 记录对话框=null;
public MineSquare(String grade,int mineNumber,int rows,int cols,JButton b,JDialog dialog)
{
this.grade=grade;
this.rows=rows;
this.cols=cols;
雷数=mineNumber;
判断是否胜利者=new DecideWinner();
记录对话框=(Record)dialog;
block=new Block[rows+1][cols+1];
buttonFace=b;
time=new TimeCount();
count=new CountMine(雷数);
count.textShowMine.setText(""+雷数);
setLayout(new GridLayout(rows,cols));
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=cols;j++)
{
block[i][j]=new Block();
block[i][j].设置在雷区中的位置(i,j);
}
}
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=cols;j++)
{
add(block[i][j].label);
block[i][j].addMouseListener(this);
}
}
随机布雷者=new RandomSetMine();
随机布雷者.随机布雷(雷数,block,rows,cols);
确定周围雷数者=new FindAroundMineNumber();
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=cols;j++)
{
确定周围雷数者.设置周围的雷数(i,j,block,rows,cols);
}
}
}
public void gameOver()
{
time.interrupt();
buttonFace.setIcon(new ImageIcon("哭脸.gif"));
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=cols;j++)
{
block[i][j].removeMouseListener(this);
if((block[i][j].判断是否是雷()) && (block[i][j].isOpaque()) && (block[i][j].探雷标记!=0))
{
block[i][j].requestFocus();
block[i][j].setOpaque(false);
}
if((block[i][j].探雷标记==0) && (!block[i][j].判断是否是雷()))
{
block[i][j].requestFocus();
block[i][j].探雷标记=-1;
block[i][j].repaint();
block[i][j].setIcon(new ImageIcon("探雷错误.gif"));
}
}
}
}
public void mousePressed(MouseEvent e)
{
boolean left=SwingUtilities.isLeftMouseButton(e);
boolean right=SwingUtilities.isRightMouseButton(e);
Block blockSource=(Block)e.getSource();
boolean 雷=blockSource.判断是否是雷();
if((left==true) && (blockSource.isOpaque()==true) && (blockSource.获取探雷标记()!=0))
{
try{
time.start();
}catch(Exception ee){}
if(雷==true)
{
blockSource.requestFocus();
blockSource.setOpaque(false);
blockSource.探雷标记=-1;
blockSource.repaint();
blockSource.setIcon(new ImageIcon("触雷.gif"));
gameOver();
}
else
{
buttonFace.setIcon(new ImageIcon("微笑脸.gif"));
if((blockSource.周围无雷==false) && (blockSource.获取探雷标记()!=0))
{
blockSource.setOpaque(false);
blockSource.探雷标记=-1;
blockSource.repaint();
}
if((blockSource.周围无雷==true) && (blockSource.isOpaque()))
{
blockSource.setOpaque(false);
Point blockPoint=(Point)blockSource.获取在雷区中的位置();
int i=blockPoint.x;
int j=blockPoint.y;
找出无雷联通区者=new FindSafeArea();
Vector tree=找出无雷联通区者.确定无雷联通区(i,j,block,rows,cols);
for (int index=0;index<tree.size() ;index++ )
{
Point p=(Point)tree.elementAt(index);
int m=p.x,n=p.y;
for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++)
{
for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++)
{
if(block[k][t].探雷标记==0)
{gameOver();}
else
{
block[k][t].requestFocus();
block[k][t].setOpaque(false);
block[k][t].探雷标记=-1;
block[k][t].repaint();
}
}
}
}
tree.removeAllElements();
}
}
}
if(right)
{
if((blockSource.探雷标记==0) && (blockSource.isOpaque()))
{
count.countMineSub();
}
if((blockSource.探雷标记==1) && (blockSource.isOpaque()))
{
count.countMineAdd();
}
}
}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e)
{
boolean success=判断是否胜利者.判断是否成功(雷数,block,rows,cols);
if(success==true)
{
time.interrupt();
记录对话框.setGrade(grade);
int spendTime=Integer.parseInt(time.textShowTime.getText());
记录对话框.setTime(spendTime);
File f=new File("英雄榜.txt");
try{
FileInputStream in=new FileInputStream(f);
ObjectInputStream object_in=new ObjectInputStream(in);
Hashtable hashtable=(Hashtable)object_in.readObject();
object_in.close();
in.close();
String temp=(String)hashtable.get(grade);
StringTokenizer fenxi=new StringTokenizer(temp,"#");
fenxi.nextToken();
int recordTime=Integer.parseInt(fenxi.nextToken());
if(spendTime<recordTime)
记录对话框.setVisible(true);
}catch(Exception eee){}
}
}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e)
{
if(SwingUtilities.isRightMouseButton(e))
{
Block blockSource=(Block)e.getSource();
Point blockPoint=(Point)blockSource.获取在雷区中的位置();
int i=blockPoint.x;
int j=blockPoint.y;
确定周围雷标数目者=new FindAroundMineMarkNumber();
int 周围雷标数=确定周围雷标数目者.获取周围雷标记的数目(i,j,block,rows,cols);
int 周围雷数=blockSource.获取周围的雷数();
确定雷标记是否正确者=new DetermineMineMarkIsRightOrWrong();
boolean correct=确定雷标记是否正确者.判断雷标记是否正确(i,j,block,rows,cols);
if((blockSource.isOpaque()==false) && (周围雷数>0) && correct)
{
成片挖开者=new DetermineDigArea();
Vector tree=成片挖开者.确定成片挖开区域(i,j,block,rows,cols);
for(int index=0;index<tree.size();index++)
{
Point p=(Point)tree.elementAt(index);
int m=p.x,n=p.y;
for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++)
{
for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++)
{
if((block[k][t].isOpaque()) && (!block[k][t].判断是否是雷()) && (block[k][t].探雷标记!=0))
{
block[k][t].requestFocus();
block[k][t].setOpaque(false);
block[k][t].探雷标记=-1;
block[k][t].repaint();
}
repaint();
}
}
}
tree.removeAllElements();
}
if((blockSource.isOpaque()==false) && (周围雷标数==周围雷数) && !correct)
{gameOver();}
if((blockSource.isOpaque()==false) && (周围雷标数!=周围雷数)){}
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -