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

📄 mine.java

📁 自己写的java扫雷小游戏。
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Grid extends JLabel
{
	private int id,status;
	private boolean mine;
	
	public Grid(int number)
	{
		super();
		id=number;
		status=2;
		mine=false;
	}
	
	public void setMine(boolean m)
	{
		mine=m;
	}
	
	public boolean beMine()
	{
		return mine;
	}
	
	public void setStatus(int s)
	{
		status=s;
	}
	
	public int getStatus()
	{
		return status;
	}
	
	public int getID()
	{
		return id;
	}
}

/****************************************************************************
 *status 	clicked		labeled		clickable		labelable	doubleClick	*
 *0			true		     		false			false		true		*
 *1			false		true		false			true		false		*
 *2			false		false		true			true		false		*
 ****************************************************************************/

public class Mine extends JFrame
{
	private Grid grid[];
	private JButton restartButton;
	private JPanel centerPanel,northPanel;
	private JLabel labelField,timeField;
	private Thread timeThread;
	private int showCount,labelCount;
	private boolean firstClick;
	public final int WIDTH=9,MINES=10,B=WIDTH*WIDTH;
	
	//setup GUI
	public Mine()
	{
		super("扫雷--by Colin");
		
		Container container=getContentPane();
		container.setLayout(new BorderLayout());
		
		//add northPanel
		northPanel=new JPanel();
		northPanel.setLayout(new GridLayout(1,3));
		
		timeField=new JLabel("0",SwingConstants.CENTER);
		northPanel.add(timeField);
		
		//restartButton
		restartButton=new JButton("restart");
		restartButton.addActionListener
		(
			//anonymous inner class ActionListener
			new ActionListener()
			{
				public void actionPerformed(ActionEvent actionEvent)
				{
					//stop timeThread if any
					timeThread=null;
					
					changeMine();
					
					showCount=0;
					labelCount=MINES;
					firstClick=true;
					timeField.setText("0");
					labelField.setText(""+MINES);
				}
			}
		);
		northPanel.add(restartButton);
		
		labelField=new JLabel(""+MINES,SwingConstants.CENTER);
		northPanel.add(labelField);

		container.add(northPanel,BorderLayout.NORTH);
		
		//add grids
		centerPanel=new JPanel();
		centerPanel.setLayout(new GridLayout(WIDTH,WIDTH));
		
		grid=new Grid[B];
		for(int i=0;i<B;i++)
		{
			grid[i]=new Grid(i);
			grid[i].setIcon(new ImageIcon("PICS/10.gif"));
			grid[i].addMouseListener
			(
				//anonymous inner class MouseAdapter
				new MouseAdapter()
				{
					public void mouseClicked(MouseEvent mouseEvent)
					{
						//start timethread on first click
						if(firstClick)
						{
							timeThread=new TimeThread();
							timeThread.start();
							firstClick=false;
						}
						
						//judge which grid is clicked
						Grid clicked=(Grid)mouseEvent.getSource();
						int i=clicked.getID();
						
						//click when neither clicked nor labeled
						if(mouseEvent.getButton()==1&&grid[i].getStatus()==2)
							clickGrid(i,1);
						//label when not clicked
						else if(mouseEvent.getButton()==3&&grid[i].getStatus()!=0)
							labelMine(i);
						//double click when clicked
						else if(mouseEvent.getButton()==2&&grid[i].getStatus()==0)
							clickGrid(i,2);
					}
				}
			);
			centerPanel.add(grid[i]);
		}
		container.add(centerPanel,BorderLayout.CENTER);
		
		//lay mines
		for(int i=0;i<MINES;i++)
			grid[i].setMine(true);
			
		changeMine();
		
		showCount=0;
		labelCount=MINES;
		firstClick=true;
		
		setSize(267,321);
		setResizable(false);
		show();
	}
	
	//Method changeMine
	private void changeMine()
	{
		boolean temp;
		
		for(int i=0;i<B;i++)
		{
			int j=(int)(Math.random()*B);
			grid[i].setIcon(new ImageIcon("PICS/10.gif"));
			grid[i].setStatus(2);
			//change
			temp=grid[i].beMine();
			grid[i].setMine(grid[j].beMine());
			grid[j].setMine(temp);
		}
	}
	
	//Method labelMine
	private void labelMine(int i)
	{
		//being labeled
		if(grid[i].getStatus()==1)
		{
			grid[i].setIcon(new ImageIcon("PICS/10.gif"));
			grid[i].setStatus(2);
			labelCount++;
		}
		//not being labeled
		else
		{
			grid[i].setIcon(new ImageIcon("PICS/11.gif"));
			grid[i].setStatus(1);
			labelCount--;
		}
		//upgrade labelField
		labelField.setText(labelCount+"");
	}
	
	//when grid[i] been clicked(cl indicate the botton).
	private void clickGrid(int i,int cl)
	{
		int j;
		int g[]={i-WIDTH-1,i-WIDTH,i-WIDTH+1,i-1,-1,i+1,i+WIDTH-1,i+WIDTH,i+WIDTH+1};
		int count=0;
		int lcount=0;
		
		//change status to clicked
		grid[i].setStatus(0);
		
		//mine is clicked		
		if(grid[i].beMine())
		{						
			grid[i].setIcon(new ImageIcon("PICS/13.gif"));
			endGame(0);
			return;
		}
		//not mine
		//count mines and labeled grids around grid[i]
		if(i%WIDTH==0)
		{
			g[0]=-1;
			g[3]=-1;
			g[6]=-1;
		}
		else if(i%WIDTH==WIDTH-1)
		{
			g[2]=-1;
			g[5]=-1;
			g[8]=-1;
		}
		if(i/WIDTH==0)
		{
			g[0]=-1;
			g[1]=-1;
			g[2]=-1;
		}
		else if(i/WIDTH==WIDTH-1)
		{
			g[6]=-1;
			g[7]=-1;
			g[8]=-1;
		}
		
		for(j=0;j<9;j++)
		{
			if(g[j]>=0)
			{
				if(grid[g[j]].beMine())
					count++;
				if(grid[g[j]].getStatus()==1)
					lcount++;
			}
		}//end count
		
		//click by left button
		if(cl==1)
		{
			grid[i].setIcon(new ImageIcon("PICS/"+count+".gif"));
			showCount++;
			if(showCount==B-MINES)
			{
				endGame(1);
				return;
			}
			//no mine around
			if(count==0)
			{
				for(j=0;j<9;j++)
				{
					if(g[j]>=0&&grid[g[j]].getStatus()==2)
						clickGrid(g[j],1);
				}
			}
		}
		//click by middle button
		else
		{		
			if(count==lcount)
			{
				for(j=0;j<9;j++)
				{
					if(g[j]>=0&&grid[g[j]].getStatus()==2)
						clickGrid(g[j],1);
				}
			}
		}
	}
	
	//execute on winning or losing
	private void endGame(int status)
	{
		//stop counting time
		timeThread=null;
		
		//win
		if(status==1)
			JOptionPane.showMessageDialog(null,"you win!");
		//lose
		else
		{
			JOptionPane.showMessageDialog(null,"you lose!");
			for(int i=0;i<B;i++)
			{
				//show mines not labeled
				if(grid[i].beMine()&&grid[i].getStatus()==2)
					grid[i].setIcon(new ImageIcon("PICS/9.gif"));
				//show grid wrong labeled
				if(!grid[i].beMine()&&grid[i].getStatus()==1)
					grid[i].setIcon(new ImageIcon("PICS/12.gif"));
			}
		}
		//forbid any actions
		for(int i=0;i<B;i++)
			grid[i].setStatus(0);
	}
	
	//execution application
	public static void main(String args[])
	{
		Mine application=new Mine();
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	//class TimeThread to count time
	private class TimeThread extends Thread
	{
		private int timepassed;
		
		public TimeThread()
		{
			timepassed=0;
		}
		
		public void run()
		{
			final Thread currentThread=Thread.currentThread();
			
			while(timepassed<1000&&currentThread==timeThread)
			{
				//change timeField
				SwingUtilities.invokeLater
				(
					//inner class Runnable
					new Runnable()
					{
						public void run()
						{
							timeField.setText(""+timepassed);
						}
					}
				);
				try
				{
					Thread.sleep(999);
				}
				catch(InterruptedException i)
				{
					System.err.println("sleep interrupted");
				}
				timepassed++;
			}
		}//end of method run
		
	}//end of class TimeThread	
	
}//end of class Mine

/************************************
 * (C) Copyright 2004 by Colin Lin. *
 * All Rights Reserved.             *
 ************************************/

⌨️ 快捷键说明

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