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

📄 mainexe.java

📁 java挖雷游戏 一个运用java线程设计的一个游戏代码 不用修改就可以运行
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.applet.*;

//Bomb 开始 定义地雷
class Bomb extends JLabel{
	//存放图像标记:分别为数字0-8;
	public static Icon icon[]={new ImageIcon("icon/0.jpg"),
							   new ImageIcon("icon/1.jpg"),
							   new ImageIcon("icon/2.jpg"),
							   new ImageIcon("icon/3.jpg"),
							   new ImageIcon("icon/4.jpg"),
							   new ImageIcon("icon/5.jpg"),
							   new ImageIcon("icon/6.jpg"),
							   new ImageIcon("icon/7.jpg"),
							   new ImageIcon("icon/8.jpg"),
	//地雷标记:踩中地雷 地雷 地雷标识错误
							   new ImageIcon("icon/9.jpg"),
							   new ImageIcon("icon/10.jpg"),
							   new ImageIcon("icon/11.jpg"),
	//怀疑按下 地雷标识 怀疑 默认  
							   new ImageIcon("icon/12.jpg"),
							   new ImageIcon("icon/13.jpg"),
							   new ImageIcon("icon/14.jpg"),
							   new ImageIcon("icon/15.jpg")
	};
	
	public int num_x,num_y; //第几号方块 
	public int BombRoundCount; //周围雷数 
	public boolean isBomb; //是否为雷 
	public boolean isClicked; //是否被点击 
	public int BombFlag; //探雷标记 
	
	public Bomb(int x,int y) {
		BombFlag = -1; 
		//num_x = x; 
		//num_y = y; 
		BombRoundCount = 0; 
		isBomb = false; 
		isClicked = false; 
		
		setIcon(icon[15]); 
	}
	
	//设置显示图标
	public void setBombIcon(int iconNum){
		
		setIcon(icon[iconNum]);
	}
	
	//重置
	public void reSet(){
		BombFlag = -1; 
		BombRoundCount = 0; 
		isBomb = false; 
		isClicked = false; 
		
		setIcon(icon[15]);
		
	}//重置完毕

}
//Bomb 结束

//LayTime 开始 显示用时的JLabel控件
class LayTime extends JLabel implements Runnable{
	private volatile Thread t;
	
	LayTime(){
   		super();
   		setText("0");
    }
    
    public void start(){
    	t=new Thread(this,"showtime");
    	t.start();
    }
    
    public void run(){
    	int usedtime=0;
    	
    	Thread thisThread = Thread.currentThread();
    	while(t==thisThread){
			try{
				usedtime++;
				setText(Integer.toString(usedtime));
				t.sleep(1000);
				
			} catch(InterruptedException e){
				setText("无法准确显示时间");
			}
		}
    }
    
    public void stopShow(){
    	t=null;
    }
}
//LayTime结束

//MyFrame 开始 定义程序运行框架
class MyFrame extends JFrame implements MouseListener{
	
	public int RowNum=16,LineNum=30,BombNum=99; //当前行,列,雷数
	private Panel mainPanel = new Panel(); 
    private Bomb[][] bombButton;
    
	//显示状态的控件
	private JPanel StatusPanel= new JPanel();
	private JLabel LeftBomb= new JLabel(Integer.toString(BombNum));//剩余雷数
	private LayTime UseTime = new LayTime();//使用时间
	private boolean gameBegin=false;//用于显示用时的控制变量
	
	private Icon StatusBobIcon[]={new ImageIcon("icon/16.jpg"),
								new ImageIcon("icon/17.jpg"),
								new ImageIcon("icon/18.jpg"),
								new ImageIcon("icon/19.jpg"),
								new ImageIcon("icon/20.jpg"),
	};
	private JLabel StatusBon=new JLabel(StatusBobIcon[0]);
    
    private boolean gameOver=false; //游戏是否结束
    
	//初始化
	MyFrame(){
		
	    super("扫雷 0.8");
	    
	    Container c=getContentPane(); 
	    
	    c.setBackground(Color.gray); 
		c.setLayout(new BorderLayout()); 
		
		//初始化状态标签开始
		StatusPanel.add(LeftBomb,BorderLayout.EAST);
		StatusPanel.add(StatusBon);//,BorderLayout.CENTER);
		StatusPanel.add(UseTime);//,BorderLayout.WEST);
		
		
		c.add(StatusPanel,"North"); //初始化状态标签完毕
		
		StatusBon.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent me){

				replay();
				StatusBon.setIcon(StatusBobIcon[0]);
			}
			
			public void mousePressed(MouseEvent e){
				StatusBon.setIcon(StatusBobIcon[1]);
			}
			});
		
		//初始化扫雷窗口
		mainPanel.setLayout(new GridLayout(RowNum,LineNum));
		bombButton=new Bomb[RowNum][]; 
		for(int i = 0 ; i < RowNum; i++) { 
		
			bombButton[ i ]=new Bomb[LineNum]; 
		} 
		for(int i=0;i<RowNum;i++)
		  for(int j=0;j<LineNum;j++){
		  	bombButton[i][j]= new Bomb(i,j);
		  	mainPanel.add(bombButton[i][j]);
		}
		
		c.add(mainPanel,"Center");//初始化扫雷窗口完毕
		creatBomb();//开始布雷
		CountRoundBomb();//计算周围雷数
		
		mainPanel.addMouseListener(this);//添加监听器
		
		setLocation(350,200);//确定程序窗口在显示屏幕中的位置
		setResizable(false);
	    
	    
	}//初始化完毕
	
	//重新开始
	public void replay() {
		UseTime.stopShow();
		UseTime.setText("0");
		LeftBomb.setText(Integer.toString(BombNum));
				
		for(int i=0;i<RowNum;i++)
			for(int j=0;j<LineNum;j++){
				bombButton[ i ][ j ].reSet(); 
		}
		creatBomb();//开始布雷
		CountRoundBomb();//计算周围雷数
		gameOver=false;
		gameBegin=false;
	}//完毕
	
	//布雷
	public void creatBomb() { 
	
		for(int i=0;i<BombNum;i++) { 
			int x =(int)(Math.random()*(RowNum-1)); 
			int y =(int)(Math.random()*(LineNum-1)); 
		
			if(bombButton[ x ][ y ].isBomb==true) 
			i--; 
			else 
			bombButton[ x ][ y ].isBomb=true ; 
		} 
	} //布雷完毕
	
	//计算雷数
	public void CountRoundBomb(){
		int count;
		
		for(int i=0;i<RowNum;i++)
			for(int j=0;j<LineNum;j++){
			count=0;
			if(bombButton[i][j].isBomb==false){
				if((i-1)>=0&&(j-1)>=0&&(bombButton[i-1][j-1].isBomb==true))
					count++;//左上方
				if((i-1)>=0&&(bombButton[i-1][j].isBomb==true))
					count++;//上方
				if((i-1)>=0&&(j+1)<LineNum&&(bombButton[i-1][j+1].isBomb==true))
					count++;//右上方
				if((j-1)>=0&&(bombButton[i][j-1].isBomb==true))
					count++;//左边
				if((j+1)<LineNum&&(bombButton[i][j+1].isBomb==true))
					count++;//右边
				if((i+1)<RowNum&&(j-1)>=0&&(bombButton[i+1][j-1].isBomb==true))
					count++;//左下方
				if((i+1)<RowNum&&(bombButton[i+1][j].isBomb==true))
					count++;//下方
				if((i+1)<RowNum&&(j+1)<LineNum&&(bombButton[i+1][j+1].isBomb==true))
					count++;//右下方
			}
			bombButton[i][j].BombRoundCount=count;	
		}
	}//计算雷数完毕
	
	//挖雷
	public void digBomb(int x,int y){
		if(bombButton[x][y].isBomb==false){//不是地雷
			if(bombButton[x][y].BombRoundCount==0){// 周围无雷
				bombButton[x][y].setBombIcon(0);
				digZeroBomb(x,y);
				//bombButton[x][y].isClicked=true;
			}
			else{//周围有雷
				bombButton[x][y].setBombIcon(bombButton[x][y].BombRoundCount);
				bombButton[x][y].isClicked=true;
			}
			
		}
		else{//踩中地雷
			for(int i=0;i<RowNum;i++)
				for(int j=0;j<LineNum;j++){
					if(bombButton[i][j].isBomb==true)
						bombButton[i][j].setBombIcon(10);
			}
			bombButton[x][y].setBombIcon(9);
			StatusBon.setIcon(StatusBobIcon[3]);
			gameOver=true;
			UseTime.stopShow();
		}
	}//挖雷完毕
	
	//当遇到空格周围没有地雷时的处理函数
	public void digZeroBomb(int x,int y){
		if(bombButton[x][y].isClicked==false){//此处主要是防止无限循环
			bombButton[x][y].isClicked=true;
			if((x-1)>=0&&(y-1)>=0){
				if(bombButton[x-1][y-1].BombRoundCount==0){//周围无雷
					bombButton[x-1][y-1].setBombIcon(0);
					//bombButton[x-1][y-1].isClicked=true;
					digZeroBomb(x-1,y-1);
				}
				else{
					bombButton[x-1][y-1].setBombIcon(bombButton[x-1][y-1].BombRoundCount);
					bombButton[x-1][y-1].isClicked=true;
				}	
			}//左上方
			if((x-1)>=0){
				if(bombButton[x-1][y].BombRoundCount==0){//周围无雷
					//bombButton[x-1][y].isClicked=true;
					bombButton[x-1][y].setBombIcon(0);
					digZeroBomb(x-1,y);
				}
				else{
					bombButton[x-1][y].setBombIcon(bombButton[x-1][y].BombRoundCount);
					bombButton[x-1][y].isClicked=true;
				}	
			}//上方
			if((x-1)>=0&&(y+1)<LineNum){
				if(bombButton[x-1][y+1].BombRoundCount==0){//周围无雷
					//bombButton[x-1][y+1].isClicked=true;
					bombButton[x-1][y+1].setBombIcon(0);
					digZeroBomb(x-1,y+1);
				}
				else{
					bombButton[x-1][y+1].setBombIcon(bombButton[x-1][y+1].BombRoundCount);
					bombButton[x-1][y+1].isClicked=true;
				}	
			}//右上方
			if((y-1)>=0){
				if(bombButton[x][y-1].BombRoundCount==0){//周围无雷
					//bombButton[x][y-1].isClicked=true;
					bombButton[x][y-1].setBombIcon(0);
					digZeroBomb(x,y-1);
				}
				else{
					bombButton[x][y-1].setBombIcon(bombButton[x][y-1].BombRoundCount);
					bombButton[x][y-1].isClicked=true;
				}	
			}//左边
			if((y+1)<LineNum){
				if(bombButton[x][y+1].BombRoundCount==0){//周围无雷
					//bombButton[x][y+1].isClicked=true;
					bombButton[x][y+1].setBombIcon(0);
					digZeroBomb(x,y+1);
				}
				else{
					bombButton[x][y+1].setBombIcon(bombButton[x][y+1].BombRoundCount);
					bombButton[x][y+1].isClicked=true;
				}	
			}//右边
			if((x+1)<RowNum&&(y-1)>=0){
				if(bombButton[x+1][y-1].BombRoundCount==0){//周围无雷
					//bombButton[x+1][y-1].isClicked=true;
					bombButton[x+1][y-1].setBombIcon(0);
					digZeroBomb(x+1,y-1);
				}
				else{
					bombButton[x+1][y-1].setBombIcon(bombButton[x+1][y-1].BombRoundCount);
					bombButton[x+1][y-1].isClicked=true;
				}	
			}//坐下方
			if((x+1)<RowNum){
				if(bombButton[x+1][y].BombRoundCount==0){//周围无雷
					//bombButton[x+1][y].isClicked=true;
					bombButton[x+1][y].setBombIcon(0);
					digZeroBomb(x+1,y);
				}
				else{
					bombButton[x+1][y].setBombIcon(bombButton[x+1][y].BombRoundCount);
					bombButton[x+1][y].isClicked=true;
				}	
			}//下方
			if((x+1)<RowNum&&(y+1)<LineNum){
				if(bombButton[x+1][y+1].BombRoundCount==0){//周围无雷
					//bombButton[x+1][y+1].isClicked=true;
					bombButton[x+1][y+1].setBombIcon(0);
					digZeroBomb(x+1,y+1);
				}
				else{
					bombButton[x+1][y+1].setBombIcon(bombButton[x+1][y+1].BombRoundCount);
					bombButton[x+1][y+1].isClicked=true;
				}	
			}//右上方
		}
		
	}//处理完毕
	
	//当按下鼠标按钮时的处理函数
	public void mouseClicked(MouseEvent e) {  //根据鼠标的左右键决定相应的行动
	
		int x=0,y=0;//存放鼠标点击方块的坐标
		int z=0;
		
		y=e.getX()/16;
		x=e.getY()/16;
		
		boolean right = SwingUtilities.isRightMouseButton(e);
		if(gameOver==false){
			if(right){//点击右键
				if(bombButton[x][y].isClicked==false){
					z=13+(++bombButton[x][y].BombFlag)%3;
					bombButton[x][y].setBombIcon(z);//确定载入图像
				}
			}
			if(!right){//点击左键
				if(bombButton[x][y].isClicked==false&&(bombButton[x][y].BombFlag%3!=0)){
					//bombButton[x][y].isClicked=true;
					digBomb(x,y);
				}
			}
		}
		
		if((gameBegin==false)&&(!gameOver)){//此处添加!gameOver主要是当第一次按键就中雷时停止显示
			//LayTime laytime=new LayTime(StatusBon);
			gameBegin=true;
			UseTime.start();
			//laytime.start();
		}
	} 
	
	public void mouseEntered(MouseEvent e) {
	} 
	public void mouseReleased(MouseEvent e) {
		StatusBon.setIcon(StatusBobIcon[0]);
	} 
	public void mouseExited(MouseEvent e) {
	} 
	public void mousePressed(MouseEvent e) {

		StatusBon.setIcon(StatusBobIcon[2]);
	}
}//MyFrame 结束

//程序主控函数
public class MainExe{
	
	public static void main(String[] args){
	  
	  JFrame.setDefaultLookAndFeelDecorated(true);
	  
	  MyFrame MainFrame= new MyFrame();
	  MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	  
	  //显示窗口
	  MainFrame.pack();
	  MainFrame.setVisible(true);
	}
}

⌨️ 快捷键说明

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