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

📄 singlemine.java

📁 这个是一个扫雷游戏,用来显示Java的按扭等效果
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					if(MOUSE_PRESSED_START==0){
						reset();//游戏重置	
					}
					break;
				}
				break;
			}
			break;	
			
		case MouseEvent.BUTTON3://右键
			//纪录右键状态
			MOUSE_RIGHT_PRESSED=false;
			switch(GAME_RUN){
			case 1://进行中
				//break;	
			case 0://初始
				if(MOUSE_PRESSED_START!=0){
					if(!MOUSE_LEFT_PRESSED && !UNDO){//左键未按下松开右键
						md.showSmile(0);//笑脸
					}else if(MOUSE_LEFT_PRESSED){//左键按下松开右键
						UNDO=true;
						if(MOUSE_PRESSED_START!=0 && GAME_RUN==1){
							checkAutoOpen();	
							checkFinal();
						}						
					}else if(UNDO){
						md.showSmile(0);//笑脸	
					}			
					reloadMap();		
				}else{
					md.showSmile(0);//笑脸	
				}
				break;				
			case -1://停止
				break;								
			}
			break;
		}
		md.update();
		MOUSE_PRESSED_START=2;		
	}
	
	//鼠标事件
	public void mouseMoved(MouseEvent e){
		setMousePosition(e);//设定鼠标所在区域
	}
	
	public void mouseDragged(MouseEvent e){

		//设定鼠标所在区域
		setMousePosition(e);
		setMouseMapPosition(e);
		
		//依游戏状态
		switch(GAME_RUN){
		case 1://进行中
		case 0://初始完成
			if(!UNDO){
				if(MOUSE_PRESSED_START!=0)
					showMouseDownMap(MOUSE_X,MOUSE_Y);
			}
			
			if(MOUSE_PRESSED_START==0){//起始在笑脸区
				switch(MOUSE_POSITION){
				case 0://笑脸区
					md.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
				case 2://一般区
					md.showSmile(0);//笑脸							
					break;					
				}
			}
			break;
		case -1://停止
			if(MOUSE_LEFT_PRESSED && MOUSE_PRESSED_START==0){
				switch(MOUSE_POSITION){
				case 0://笑脸区
					md.showSmile(1);//笑脸陷下
					break;

				case 1://地雷区
				case 2://一般区
					switch(GAME_STATE){
					case 1://成功
						md.showSmile(3);//戴眼镜
						break;	
					case 0://一般
						md.showSmile(0);//笑脸
						break;
					case -1://失败
						md.showSmile(4);//哭脸
						break;
					}
					break;	
				}				
			}
			break;
		}
		md.update();

	}
	
	//设定鼠标所在区域
	public void setMousePosition(MouseEvent e){

		//笑脸区
		if((e.getX())>=md.SMILE_X && 
		   (e.getX())<(md.SMILE_X+md.SMILE_WIDTH) &&
		   (e.getY())>=md.SMILE_Y && 
		   (e.getY())<(md.SMILE_Y+md.SMILE_HEIGHT)){
		   	MOUSE_POSITION=0;

		//地雷区
		}else if((e.getX())>=md.MAP_X && 
		   		 (e.getX())<(md.MAP_X+GRIDX*md.MAP_WIDTH) &&
		   		 (e.getY())>=md.MAP_Y && 
		   		 (e.getY())<(md.MAP_Y+GRIDY*md.MAP_HEIGHT)){
		   	MOUSE_POSITION=1;
		
		//其它区
		}else{
			MOUSE_POSITION=2;
		}
	
	}
	
	//设定鼠标在地图上坐标
	public void setMouseMapPosition(MouseEvent e){
		MOUSE_X=(e.getX()-md.MAP_X)/md.MAP_WIDTH;
		MOUSE_Y=(e.getY()-md.MAP_Y)/md.MAP_HEIGHT;
	}
	
	//显示鼠标按下的地雷区
	public void showMouseDownMap(int x,int y){
		
		reloadMap();//更新地图图示

		if(MOUSE_LEFT_PRESSED && MOUSE_RIGHT_PRESSED){

			
			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 &&
					   FACE[i][j]==1){		
						md.showMap(i,j,0);
					}
				}
			}				
			
		}else if(MOUSE_LEFT_PRESSED){
			if(x>=0 && x<GRIDX &&//防止超出数组
			   y>=0 && y<GRIDY &&
			   FACE[x][y]==1){		
				md.showMap(x,y,0);
			}		
		}		
	}
	
	//更新地图图示
	public void reloadMap(){
		for(int i=0;i<GRIDX;i++){
			for(int j=0;j<GRIDY;j++){
				if(FACE[i][j]==0){//已探测
					md.showMap(i,j,MAP[i][j]);
				}else{//未探测
					switch(FACE[i][j]){
					case 1://未探测
						md.showMap(i,j,12);
						break;
					case 2://插棋子
						md.showMap(i,j,13);
						break;
					case 3://问号
						md.showMap(i,j,14);
						break;							
					}
				}
			}					
		}		
	}	
	
	//设定地图表面状态
	public void setFace(int mode){
		if(MOUSE_X>=0 && MOUSE_X<GRIDX &&//防止超出数组
		   MOUSE_Y>=0 && MOUSE_Y<GRIDY){
			FACE[MOUSE_X][MOUSE_Y]=mode;
		}
	}
	
	//清除空白区
	public void doClear(int x,int y){
		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 &&	
				   FACE[i][j]==1 && //表示未探测
				   !(i==x && j==y)){
					switch(MAP[i][j]){
					case 0:
						FACE[i][j]=0;
						doClear(i,j);
						break;	
					case 1:
					case 2:
					case 3:
					case 4:
					case 5:
					case 6:
					case 7:
					case 8:
						FACE[i][j]=0;
						break;
					}		
				}
			}			
		}	
	}
	
	//鼠标两件按下时松开任一键检查自动翻开
	public void checkAutoOpen(){
		int x=MOUSE_X;
		int y=MOUSE_Y;
		int n=MAP[x][y];
		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 &&
				   FACE[i][j]==2)
					n--;
			}			
		}
		if(n==0){
			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 &&
					   FACE[i][j]==1 && 
					   !GAME_OVER){
						FACE[i][j]=0;
						if(MAP[i][j]==0)
							doClear(i,j);
						else if(MAP[i][j]==9)
							onMine(false);
					}
				}			
			}			
		}
	}
	
	//踩到地雷
	public void onMine(boolean right){
		if(right)//是否在正上方
			MAP[MOUSE_X][MOUSE_Y]=11;//地雷加红边
			
		GAME_RUN=-1;//游戏停止
		GAME_STATE=-1;//失败
		
		if(timer!=null){
			timer.stop();							
			timer=null;								
		}
		
		for(int ii=0;ii<GRIDX;ii++){
			for(int jj=0;jj<GRIDY;jj++){
				if(FACE[ii][jj]==2 &&//插错棋子
				   MAP[ii][jj]!=9){//非地雷
					MAP[ii][jj]=10;
					FACE[ii][jj]=0;		
				}
				if(FACE[ii][jj]==2 &&//插对棋子
				   MAP[ii][jj]==9)//地雷
				   	FACE[ii][jj]=0;
				if(FACE[ii][jj]==1 &&//未探索
				   MAP[ii][jj]==9)		
					FACE[ii][jj]=0;
			}								
		}	
		md.showSmile(4);//哭脸
	}
	
	//检查是否完成
	public void checkFinal(){
		int m=MINES;
		for(int i=0;i<GRIDX;i++){
			for(int j=0;j<GRIDY;j++){
				if(FACE[i][j]!=0)
					m--;
			}				
		}	
		
		if(m==0){
			for(int i=0;i<GRIDX;i++){
				for(int j=0;j<GRIDY;j++){
					if(MAP[i][j]==9)
						MAP[i][j]=13;
					FACE[i][j]=0;				
				}				
			}	

			GAME_RUN=-1;//游戏停止
			GAME_STATE=1;//成功
			timer.stop();
			md.showSmile(3);//戴眼镜
			md.showCount(md.MCOUNT_X,md.MCOUNT_Y,0);
		}else{
			if(GAME_RUN==1)
				md.showSmile(0);//笑脸
			else{
				if(GAME_STATE==-1)	
					md.showSmile(4);//哭脸
			}
		}
	}
	
	//重置游戏
	public void reset(){
		for(int i=0;i<GRIDX;i++){
			for(int j=0;j<GRIDY;j++){
				FACE[i][j]=1;//地雷表面设定(未探索)
				MAP[i][j]=0;//地雷设定(空白)
			}				
		}	
		
		GAME_RUN=0;  //游戏初始完成
		GAME_STATE=0;//一般状态	
		MOUSE_LEFT_PRESSED=false;
		MOUSE_RIGHT_PRESSED=false;
		UNDO=false;
		
		//定时器重置
		if(timer!=null)
			timer.stop();
		TIME_COUNT=0;//时间计数设定
		MMINES=MINES;//标记地雷数设定		
		reloadMap();
		md.showSmile(0);
		md.showCount(md.MCOUNT_X,md.MCOUNT_Y,MINES);
		md.showCount(md.COUNT_X,md.COUNT_Y,TIME_COUNT);
	}
}

⌨️ 快捷键说明

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