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

📄 minesweeping.java

📁 Java版仿Windows自带小游戏——扫雷
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				switch(mousePosition){
				case 0://笑脸区
					if(moursePressPosition==0){
						reset();//游戏重置
					}
					break;
				}
				break;
			}
			break;

		case MouseEvent.BUTTON3://右键
			//纪录右键状态
			rMousePressed=false;
			switch(gameRunning){
			case 1://进行中
				//break;
			case 0://初始
				if(moursePressPosition!=0){
					if(!lMousePressed && !noDo){//左键未按下松开右键
						draw.showSmile(0);//笑脸
					}else if(lMousePressed){//左键按下松开右键
						noDo=true;
						if(moursePressPosition!=0 && gameRunning==1){
							autoOpen();
							checkCompleted();
						}
					}else if(noDo){
						draw.showSmile(0);//笑脸
					}
					reloadMap();
				}else{
					draw.showSmile(0);//笑脸
				}
				break;
			case -1://停止
				break;
			}
			break;
		}
		draw.update();
		moursePressPosition=2;
	}

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

	public void mouseDragged(MouseEvent e){

		//设定鼠标所在区域
		setMousePosition(e);
		setMouseMapPosition(e);

		//依游戏状态
		switch(gameRunning){
		case 1://进行中
		case 0://初始完成
			if(!noDo){
				if(moursePressPosition!=0)
					showMouseDownMap(xMouseGrid,yMouseGrid);
			}

			if(moursePressPosition==0){//起始在笑脸区
				switch(mousePosition){
				case 0://笑脸区
					draw.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
				case 2://一般区
					draw.showSmile(0);//笑脸
					break;
				}
			}
			break;
		case -1://停止
			if(lMousePressed && moursePressPosition==0){
				switch(mousePosition){
				case 0://笑脸区
					draw.showSmile(1);//笑脸陷下
					break;

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

	}

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

		//笑脸区
		if((e.getX())>=draw.smileX &&
		   (e.getX())<(draw.smileX+draw.smileWidth) &&
		   (e.getY())>=draw.smileY &&
		   (e.getY())<(draw.smileY+draw.simleHeight)){
			mousePosition=0;

		//地雷区
		}else if((e.getX())>=draw.mapX &&
				 (e.getX())<(draw.mapX+xGridCount*draw.mapWidth) &&
				 (e.getY())>=draw.mapY &&
				 (e.getY())<(draw.mapY+yGridCount*draw.mapHeight)){
			mousePosition=1;

		//其它区
		}else{
			mousePosition=2;
		}

	}

	//设定鼠标在地图上坐标
	public void setMouseMapPosition(MouseEvent e){
		xMouseGrid=(e.getX()-draw.mapX)/draw.mapWidth;
		yMouseGrid=(e.getY()-draw.mapY)/draw.mapHeight;
	}

	//显示鼠标按下的地雷区
	public void showMouseDownMap(int x,int y){

		reloadMap();//更新地图图示

		if(lMousePressed && rMousePressed){


			for(int i=(x-1);i<=(x+1);i++){
				for(int j=(y-1);j<=(y+1);j++){
					if(i>=0 && i<xGridCount &&//防止超出数组
					   j>=0 && j<yGridCount &&
					   mineFace[i][j]==1){
						draw.showMap(i,j,0);
					}
				}
			}

		}else if(lMousePressed){
			if(x>=0 && x<xGridCount &&//防止超出数组
			   y>=0 && y<yGridCount &&
			   mineFace[x][y]==1){
				draw.showMap(x,y,0);
			}
		}
	}

	//更新地图图示
	public void reloadMap(){
		for(int i=0;i<xGridCount;i++){
			for(int j=0;j<yGridCount;j++){
				if(mineFace[i][j]==0){//已探测
					draw.showMap(i,j,mineMap[i][j]);
				}else{//未探测
					switch(mineFace[i][j]){
					case 1://未探测
						draw.showMap(i,j,12);
						break;
					case 2://插棋子
						draw.showMap(i,j,13);
						break;
					case 3://问号
						draw.showMap(i,j,14);
						break;
					}
				}
			}
		}
	}

	//设定地图表面状态
	public void setFace(int nIndex){
		if(xMouseGrid>=0 && xMouseGrid<xGridCount &&//防止超出数组
		   yMouseGrid>=0 && yMouseGrid<yGridCount){
			mineFace[xMouseGrid][yMouseGrid]=nIndex;
		}
	}

	//清除空白区
	public void autoClear(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<xGridCount &&
				   j>=0 && j<yGridCount &&
				   mineFace[i][j]==1 && //表示未探测
				   !(i==x && j==y)){
					switch(mineMap[i][j]){
					case 0:
						mineFace[i][j]=0;
						autoClear(i,j);
						break;
					case 1:
					case 2:
					case 3:
					case 4:
					case 5:
					case 6:
					case 7:
					case 8:
						mineFace[i][j]=0;
						break;
					}
				}
			}
		}
	}

	//鼠标两件按下时松开任一键检查自动翻开
	public void autoOpen(){
		int x=xMouseGrid;
		int y=yMouseGrid;
		int n=mineMap[x][y];
		for(int i=(x-1);i<=(x+1);i++){
			for(int j=(y-1);j<=(y+1);j++){
				if(i>=0 && i<xGridCount &&
				   j>=0 && j<yGridCount &&
				   mineFace[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<xGridCount &&
					   j>=0 && j<yGridCount &&
					   mineFace[i][j]==1 &&
					   !gameOver){
						mineFace[i][j]=0;
						if(mineMap[i][j]==0)
							autoClear(i,j);
						else if(mineMap[i][j]==9)
							onMine(false);
					}
				}
			}
		}
	}

	//踩到地雷
	public void onMine(boolean right){
		if(right)//是否在正上方
			mineMap[xMouseGrid][yMouseGrid]=11;//地雷加红边

		gameRunning=-1;//游戏停止
		gameState=-1;//失败

		if(timer!=null){
			timer.stop();
			timer=null;
		}

		for(int ii=0;ii<xGridCount;ii++){
			for(int jj=0;jj<yGridCount;jj++){
				if(mineFace[ii][jj]==2 &&//插错棋子
				   mineMap[ii][jj]!=9){//非地雷
					mineMap[ii][jj]=10;
					mineFace[ii][jj]=0;
				}
				if(mineFace[ii][jj]==2 &&//插对棋子
				   mineMap[ii][jj]==9)//地雷
					mineFace[ii][jj]=0;
				if(mineFace[ii][jj]==1 &&//未探索
				   mineMap[ii][jj]==9)
					mineFace[ii][jj]=0;
			}
		}
		
		sound.play();
		draw.showSmile(4);//哭脸
	}

	//检查是否完成
	public void checkCompleted(){
		int m=mineCount;
		for(int i=0;i<xGridCount;i++){
			for(int j=0;j<yGridCount;j++){
				if(mineFace[i][j]!=0)
					m--;
			}
		}

		if(m==0){
			for(int i=0;i<xGridCount;i++){
				for(int j=0;j<yGridCount;j++){
					if(mineMap[i][j]==9)
						mineMap[i][j]=13;
					mineFace[i][j]=0;
				}
			}

			gameRunning=-1;//游戏停止
			gameState=1;//成功
			timer.stop();
			draw.showSmile(3);//戴眼镜
			draw.showCount(draw.mineX,draw.mineY,0);
		}else{
			if(gameRunning==1)
				draw.showSmile(0);//笑脸
			else{
				if(gameState==-1)
					draw.showSmile(4);//哭脸
			}
		}
	}

	//重置游戏
	public void reset(){
		for(int i=0;i<xGridCount;i++){
			for(int j=0;j<yGridCount;j++){
				mineFace[i][j]=1;//地雷表面设定(未探索)
				mineMap[i][j]=0;//地雷设定(空白)
			}
		}

		gameRunning=0;  //游戏初始完成
		gameState=0;//一般状态
		lMousePressed=false;
		rMousePressed=false;
		noDo=false;

		//定时器重置
		if(timer!=null)
			timer.stop();
		timeCount=0;//时间计数设定
		markedMineCount=mineCount;//标记地雷数设定
		reloadMap();
		draw.showSmile(0);
		draw.showCount(draw.mineX,draw.mineY,mineCount);
		draw.showCount(draw.countX,draw.countY,timeCount);
	}
}

⌨️ 快捷键说明

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