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

📄 singlemine.java

📁 研学作品
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.event.*;
import java.util.Calendar;

public 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;
	int MOUSE_PREV_X;
	int MOUSE_PREV_Y;
	boolean MOUSE_LEFT_PRESSED;//鼠标左键按下
	boolean MOUSE_RIGHT_PRESSED;//鼠标右键按下
	boolean GAME_START;//游戏开始
	boolean GAME_OVER;//游戏结束
	boolean GAME_FINAL;//游戏完成
	boolean UNDO;//左右键不动作

	int GAME_RUN;//游戏是否执行[true进行中][false停止]
	int GAME_STATE;//游戏状态 1成功 0一般 -1失败

	static int timDelaye=0;
	static int timDelayn=0;
	static int timDelayh=0;

	int level;//难度

	public SingleMine(int gridx,int gridy,int mines,Container c,int lv){
		//资料初始化
		this.GRIDX=gridx;
		this.GRIDY=gridy;
		this.MINES=mines;
		this.MMINES=mines;
		this.c=c;
		this.level=lv;

		//产生绘图对象
		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-8,(y+6)*16+35);
	}
	//鼠标按键
	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);
									}
									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);
									}
									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){
		setMousePosition(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);
									}
								}
								md.showSmile(0);
							break;
							case 2://一般区
								md.showSmile(0);
							break;
						}
					break;

					case -1://停止
						switch(MOUSE_POSITION){
							case 0://笑脸区
								if(MOUSE_PRESSED_START==0){
									reset();
								}
							break;
						}
					break;
				}
			break;

			case MouseEvent.BUTTON3://右键
				//记录右键状态
				MOUSE_RIGHT_PRESSED=false;
				switch(GAME_RUN){
					case 1:
					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;

⌨️ 快捷键说明

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