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

📄 singlemine.java

📁 这个是一个扫雷游戏,用来显示Java的按扭等效果
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*程序:SingleMine.java
 *说明:扫雷游戏主要控制类
 */
 
import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import javax.swing.*;

class SingleMine implements MouseListener,
							MouseMotionListener{
	
	int GRIDX;  //地图x轴格数
	int GRIDY;  //地图y轴格数
	int MINES;  //地雷数
	int MMINES; //已标示地雷数
	int TIME_COUNT;//时间计数
	Container c;//容器
	int MAP[][];//地雷布置情形;0:空白、1-8:外围地雷数、9:地雷
	int FACE[][];//地雷表面情形;0:已探测、1:未探测、2:插棋子、3:疑问
	
	Image offI;
	Graphics offG;
	MDraw md;
	Timer timer;//定时器
	
	int MOUSE_POSITION;//鼠标位置;0:笑脸,1:地图,2:其它
	int MOUSE_PRESSED_START;//鼠标按下位置;0:笑脸,1:地图,2:其它
	int MOUSE_X;//鼠标相对应地雷区坐标
	int MOUSE_Y;
	
	boolean MOUSE_RIGHT_PRESSED;//鼠标右键按下
	boolean MOUSE_LEFT_PRESSED;//鼠标左键按下
	boolean GAME_START;//游戏开始
	boolean GAME_OVER;//游戏结束
	boolean GAME_FINAL;//游戏完成
	boolean UNDO;//左右键不动作;
	
	int GAME_RUN;//游戏是否执行 [true:进行中],[false:停止]
	int GAME_STATE;//游戏状态 [1:成功],[0:一般],[-1:失败]
	
	
	public SingleMine(int gridx,   //地图x轴格数
					  int gridy,   //地图y轴格数
					  int mines,   //地雷数
					  Container c){//容器
		
		//资料初始
		this.GRIDX=gridx;
		this.GRIDY=gridy;
		this.MINES=mines;
		this.MMINES=mines;
		this.c=c;
		
		//产生绘图对象
		md=new MDraw(gridx,gridy,mines,c);
		
		//产生地雷布置数组及表面情形并初始数组值
		MAP=new int[gridx][gridy];
		FACE=new int[gridx][gridy];
		
		//游戏重置
		reset();
  		md.update();			
	}
	
	private class EventListener implements ActionListener{
		public void actionPerformed(ActionEvent e){
			TIME_COUNT++;
			md.showCount(md.COUNT_X,md.COUNT_Y,TIME_COUNT);	
		}	
	}	
	
	//以随机数布置地雷位置
	public void setMinePosition(){
		int m=this.MINES;
		
		//当地雷未布置完时持续布置
		while(m>0){
			
			//随机数产生坐标
			int x=(int)(Math.random()*GRIDX);	
			int y=(int)(Math.random()*GRIDY);
			
			//判断产生的坐标是否成立			
			if(x>=0 && x<GRIDX &&//防止超出数组
			   y>=0 && y<GRIDY &&
			   MAP[x][y]!=9 && //数组值不表示地雷
			   !(x==MOUSE_X && y==MOUSE_Y)){
			   	
				m--;//布置地雷剩余数
				MAP[x][y]=9;//地图坐标标示为地雷
				
				//将地雷周围数字加一
				for(int i=(x-1);i<=(x+1);i++){
					for(int j=(y-1);j<=(y+1);j++){
						if(i>=0 && i<GRIDX &&//范围在数组内
						   j>=0 && j<GRIDY &&
						   MAP[i][j]!=9 &&//数组值不表示地雷
						   !(i==x && j==y)){//不为地雷坐标
						 	MAP[i][j]++;  	
						}   
					}						
				}	
			}
		}
	}
	
	//取得窗口大小
	public static Dimension getDimension(int x,int y){
		return new Dimension((x+2)*16+10,(y+6)*16+50);
	}
	
	//鼠标按键
	public void mouseClicked(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void mousePressed(MouseEvent e){
		
		setMouseMapPosition(e);//设定鼠标在地图上坐标			
		switch(e.getButton()){
		case MouseEvent.BUTTON1://左键
			UNDO=false;
			//纪录左键状态
			MOUSE_LEFT_PRESSED=true;
			
			//设定鼠标左键按下的起始区域
			MOUSE_PRESSED_START=MOUSE_POSITION;
			
			//游戏状态
			switch(GAME_RUN){
			
			case 1://进行中
				//鼠标所在区域
				switch(MOUSE_POSITION){
				case 0://笑脸区
					md.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
					if(MOUSE_PRESSED_START!=0){
						if(MOUSE_RIGHT_PRESSED){//右键按下时按下左键
							showMouseDownMap(MOUSE_X,MOUSE_Y);
						}else{//右键未按下时按下左键
							//UNDO=false;
						}
						if(FACE[MOUSE_X][MOUSE_Y]==1)
							md.showMap(MOUSE_X,MOUSE_Y,0);//空白
						md.showSmile(2);//笑脸张嘴	
					}				
					break;
				case 2://一般区
					md.showSmile(2);//笑脸张嘴
					break;
				}
				break;
				
			case 0://初始完成
				//鼠标所在区域
				switch(MOUSE_POSITION){
				case 0://笑脸区
					md.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
					if(MOUSE_PRESSED_START!=0){
						if(MOUSE_RIGHT_PRESSED){//右键按下时按下左键
							showMouseDownMap(MOUSE_X,MOUSE_Y);
						}else{//右键未按下时按下左键
							//UNDO=false;
						}
						if(FACE[MOUSE_X][MOUSE_Y]==1)
							md.showMap(MOUSE_X,MOUSE_Y,0);//空白
						md.showSmile(2);//笑脸张嘴	
					}
					break;
				case 2://一般区
					md.showSmile(2);//笑脸张嘴
					break;
				}
				break;
				
			case -1://停止	
				switch(MOUSE_POSITION){
				case 0://笑脸区
					md.showSmile(1);//笑脸陷下
					break;
				}
				break;
			}
			break;	
			
		case MouseEvent.BUTTON3://右键
			UNDO=false;
			//纪录右键状态
			MOUSE_RIGHT_PRESSED=true;
			if(GAME_RUN!=-1 && MOUSE_PRESSED_START!=0){
				
				if(MOUSE_LEFT_PRESSED){//连同左键按下时
					reloadMap();
					for(int i=(MOUSE_X-1);i<=(MOUSE_X+1);i++){
						for(int j=(MOUSE_Y-1);j<=(MOUSE_Y+1);j++){
							if(i>=0 && i<GRIDX &&
							   j>=0 && j<GRIDY &&
							   FACE[i][j]==1){
								md.showMap(i,j,0);   	
							}
						}						
					}					
				}else{//只有右键按下时
					if(MOUSE_POSITION==1){
						if(FACE[MOUSE_X][MOUSE_Y]!=0){
							FACE[MOUSE_X][MOUSE_Y]++;
							if(FACE[MOUSE_X][MOUSE_Y]>=4){
								FACE[MOUSE_X][MOUSE_Y]=1;
							}	
							if(FACE[MOUSE_X][MOUSE_Y]==2)
								MMINES--;
							else if(FACE[MOUSE_X][MOUSE_Y]==3)
								MMINES++;
							md.showCount(md.MCOUNT_X,md.MCOUNT_Y,MMINES);
							reloadMap();
						}
					}
				}	
			}
			break;
		}
		md.update();
	}
	
	public void mouseReleased(MouseEvent e){
		
		setMouseMapPosition(e);//设定鼠标在地图上坐标		
		switch(e.getButton()){
		case MouseEvent.BUTTON1://左键
			
			//纪录左键状态
			MOUSE_LEFT_PRESSED=false;
			
			//游戏状态
			switch(GAME_RUN){
			
			case 1://进行中
				//鼠标所在区域
				switch(MOUSE_POSITION){
				case 0://笑脸区
					if(MOUSE_PRESSED_START==0){//在笑脸区起始(重置游戏游戏)
						reset();//游戏重置
					}
					md.showSmile(0);//笑脸
					break;
				case 1://地雷区
					if(MOUSE_PRESSED_START!=0){//不在笑脸区起始

						if(!MOUSE_RIGHT_PRESSED && 
						   !UNDO && //右键未按下松开左键
						   FACE[MOUSE_X][MOUSE_Y]==1){//表示未探测
							
							FACE[MOUSE_X][MOUSE_Y]=0;
							switch(MAP[MOUSE_X][MOUSE_Y]){
							case 0://空白
								doClear(MOUSE_X,MOUSE_Y);//清除空白
								checkFinal();//检查是否完成
								break;	
							case 9://地雷(游戏结束)
								onMine(true);
								break;
							default:
								checkFinal();//检查是否完成
							}
							
						}else if(MOUSE_RIGHT_PRESSED){//右键按下松开左键
							UNDO=true;
							md.showSmile(0);//笑脸
							if(MOUSE_PRESSED_START!=0){
								checkAutoOpen();	
								checkFinal();
							}
						
						}else if(UNDO){
							md.showSmile(0);//笑脸		
						}else{
							md.showSmile(0);//笑脸
						}
						reloadMap();
					}					
					break;
				case 2://一般区
					md.showSmile(0);//笑脸
					break;
				}
				break;
				
			case 0://初始完成
				//鼠标所在区域
				switch(MOUSE_POSITION){
				case 0://笑脸区
					if(MOUSE_PRESSED_START==0)
						reset();
					md.showSmile(0);//笑脸
					break;
				case 1://地雷区
					if(MOUSE_PRESSED_START!=0 ){//不是在笑脸区起始(开始游戏)
						if(!MOUSE_RIGHT_PRESSED && //右键未按下松开左键
						   !UNDO && 
						   FACE[MOUSE_X][MOUSE_Y]==1){
							setMinePosition();//设定地雷位置
							GAME_RUN=1;//游戏开始
							
							//启动定时器
							timer=new Timer(1000,new EventListener());
							timer.start();
	
							FACE[MOUSE_X][MOUSE_Y]=0;//表示已探测
							switch(MAP[MOUSE_X][MOUSE_Y]){
							case 0://空白
								doClear(MOUSE_X,MOUSE_Y);
								break;						
							}
							md.showSmile(0);//笑脸
							checkFinal();//检查是否完成
							reloadMap();//重新显示地雷区状况
						
						}else if(MOUSE_RIGHT_PRESSED){//右键按下松开左键
							UNDO=true;
							reloadMap();//重新显示地雷区状况
						}else if(UNDO){
							md.showSmile(0);//笑脸
						}else{
							md.showSmile(0);//笑脸	
						}

					}else{
						md.showSmile(0);//笑脸	
					}
					
					break;
				case 2://一般区
					md.showSmile(0);//笑脸
					break;
				}
				break;
				
			case -1://停止	
				switch(MOUSE_POSITION){
				case 0://笑脸区

⌨️ 快捷键说明

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