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

📄 minesquare.java

📁 此源码是一款扫雷游戏
💻 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 + -