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

📄 singlemine.java

📁 研学作品
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					case -1://停止
					break;
				}
			break;
		}
		md.update();
		MOUSE_PRESSED_START=2;
	}

	public void mouseMoved(MouseEvent e){
		setMousePosition(e);
		if(MOUSE_POSITION==1) DrawMouseHover(e);
		else md.update();
	}

	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 DrawMouseHover(MouseEvent e){
		setMouseMapPosition(e);
		if(MOUSE_X!=MOUSE_PREV_X || MOUSE_Y!=MOUSE_PREV_Y){
			reloadMap();
			if(FACE[MOUSE_X][MOUSE_Y]==1)	md.showMap(MOUSE_X,MOUSE_Y,15);
			else if(FACE[MOUSE_X][MOUSE_Y]==2)	md.showMap(MOUSE_X,MOUSE_Y,16);
			else if(FACE[MOUSE_X][MOUSE_Y]==3)	md.showMap(MOUSE_X,MOUSE_Y,17);
		}
		MOUSE_PREV_X=MOUSE_X;
		MOUSE_PREV_Y=MOUSE_Y;
		md.update();
	}

	//更新地图提示
	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;//成功
			timDelaye=timer.getDelay();
			timer.stop();
			md.showSmile(3);//戴眼镜
			md.showCount(md.MCOUNT_X,md.MCOUNT_Y,0);
			tjDialog mm=new tjDialog(TIME_COUNT,level);
		}
		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);
	}

	//保存游戏数据到 saveGame.dat
	public void saveGame(){
		try{
			DataOutputStream out=new DataOutputStream(new FileOutputStream("saveGame.dat"));
			for(int i=0;i<GRIDX;i++){
				for(int j=0;j<GRIDY;j++){
					out.writeInt(FACE[i][j]);
					out.writeInt(MAP[i][j]);
				}
			}
			out.writeInt(TIME_COUNT);
			out.writeInt(MINES);
			out.writeInt(MMINES);
			out.close();
		}
		catch(Exception e){
			JOptionPane.showMessageDialog(null,"保存失败!");
		}
	}

	//从 saveGame.dat 读入游戏数据
	public void loadGame(){
		File sav=new File("saveGame.dat");
		try{
			DataInputStream in=new DataInputStream(new FileInputStream(sav));
			for(int i=0;i<GRIDX;i++){
				for(int j=0;j<GRIDY;j++){
					FACE[i][j]=in.readInt();
					MAP[i][j]=in.readInt();
				}
			}
			TIME_COUNT=in.readInt();
			MINES=in.readInt();
			MMINES=in.readInt();
			in.close();
		}
		catch(Exception e){
			JOptionPane.showMessageDialog(null,"读取失败!");
      		System.exit(1);
		}
		//删除存档
      	sav.delete();
		//刷新界面
		reloadMap();
		md.showCount(md.MCOUNT_X,md.MCOUNT_Y,MINES);
		md.showCount(md.COUNT_X,md.COUNT_Y,TIME_COUNT);
		md.update();
		GAME_RUN=1;//游戏开始
		//启动定时器
		timer=new Timer(1000,new EventListener());
		timer.start();
	}
}

⌨️ 快捷键说明

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