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

📄 mine.java

📁 扫雷游戏的源码 以前上课的时候老师给的 和windows下扫雷
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		   	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);
	}
}

class MDraw{
	
//游戏数据
int GRIDX;  //地图x轴格数
int GRIDY;  //地图y轴格数
int MINES;  //地雷数
Container c;//容器


//次显示区
Image offI;
Graphics offG;

//图片数组
Image[] imgSmile;
Image[] imgMap;
Image[] imgCount;

//所有图片宽与长
int SMILE_WIDTH;
int SMILE_HEIGHT;
int MAP_WIDTH;
int MAP_HEIGHT;
int COUNT_WIDTH;
int COUNT_HEIGHT;

//各区域坐标
int STATE_X;//游戏状态区
int STATE_Y;
int COUNT_X;//时间计数
int COUNT_Y;
int MCOUNT_X;//地雷计数
int MCOUNT_Y;
int MAP_X;//地雷区
int MAP_Y;	
int SMILE_X;//笑脸
int SMILE_Y;
	
public MDraw(int gridx,   //地图x轴格数
			 int gridy,   //地图y轴格数
			 int mines,   //地雷数
			 Container c){//容器

	//资料初始
	this.GRIDX=gridx;
	this.GRIDY=gridy;
	this.MINES=mines;
	this.c=c;
	
	
	//建立次画面
	offI=c.createImage(c.getWidth(),c.getHeight());
	offG=offI.getGraphics();		
	
	//读入所有图片
	imgSmile=new Image[5]; //游戏状态图(笑脸)
	for(int i=0;i<=4;i++)
		imgSmile[i]=(new ImageIcon("smile/s"+i+".gif")).getImage();	
				
	imgCount=new Image[10];//计数(LED字型)
	for(int i=0;i<=9;i++)
		imgCount[i]=(new ImageIcon("count/"+i+".gif")).getImage();	
		
	imgMap=new Image[15];  //地图上(数字、地雷)
	for(int i=0;i<=14;i++)
		imgMap[i]=(new ImageIcon("map/m"+i+".gif")).getImage();
	
	//纪录图片宽与长
	SMILE_WIDTH=imgSmile[0].getWidth(null);//游戏状态图
	SMILE_HEIGHT=imgSmile[0].getHeight(null);
	COUNT_WIDTH=imgCount[0].getWidth(null);//计数图
	COUNT_HEIGHT=imgCount[0].getHeight(null);		
	MAP_WIDTH=imgMap[0].getWidth(null);//地图状态图
	MAP_HEIGHT=imgMap[0].getHeight(null);
	
	//所有区域坐标
	MAP_X=MAP_WIDTH;//地雷区
	MAP_Y=MAP_HEIGHT*5;
	DrawMapFrame(MAP_X-3,MAP_Y-3,
                  GRIDX*MAP_WIDTH+6,GRIDY*MAP_HEIGHT+6,
                  3,false);
		
	STATE_X=MAP_WIDTH;//游戏状态区
	STATE_Y=MAP_HEIGHT;
	DrawMapFrame(STATE_X-3,STATE_Y-3,
                  GRIDX*MAP_WIDTH+6,MAP_HEIGHT*3+6,
                  3,false);		

	MCOUNT_X=STATE_X+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;//地雷数
	MCOUNT_Y=STATE_Y+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;
	DrawMapFrame(MCOUNT_X-2,MCOUNT_Y-2,
                  COUNT_WIDTH*3+4,COUNT_HEIGHT+4,
                  2,false);				

	COUNT_X=(STATE_X-3)+
               (GRIDX*MAP_WIDTH+6)-MAP_WIDTH-COUNT_WIDTH*3;//秒数
	COUNT_Y=MCOUNT_Y;
	DrawMapFrame(COUNT_X-2,COUNT_Y-2,
                  COUNT_WIDTH*3+4,COUNT_HEIGHT+4,2,false);			

	SMILE_X=(STATE_X-3)+(GRIDX*MAP_WIDTH+6-SMILE_WIDTH)/2;//笑脸
	SMILE_Y=STATE_Y+(MAP_HEIGHT*3-SMILE_HEIGHT)/2;
			
	
	//画出立体框
	DrawMapFrame(0,0,(GRIDX+2)*MAP_WIDTH,(GRIDY+6)*MAP_HEIGHT,
                  4,true);			
	
	//mapInit();//地图初始化
	showCount(MCOUNT_X,MCOUNT_Y,MINES);//显示地雷数
	showCount(COUNT_X,COUNT_Y,0);//显示秒数
	showSmile(0);//显示笑脸
	
}

//显示地图图标
public void showMap(int x,int y,int mode){
	if(x>=0 && x<GRIDX &&//防止超出数组
	   y>=0 && y<GRIDY){		
		offG.drawImage(imgMap[mode],
					   MAP_X+x*MAP_WIDTH,
					   MAP_Y+y*MAP_HEIGHT,
					   null);
	}
}

//显示笑脸
public void showSmile(int i){
	if(i>=0 && i<=4)
		offG.drawImage(imgSmile[i],SMILE_X,SMILE_Y,null);
	update();
}

//显示计数数字
public void showCount(int x,int y,int count){
	if(count>=0){
		offG.drawImage(imgCount[(count%1000)/100],x,y,null);
		offG.drawImage(imgCount[(count%100)/10],x+COUNT_WIDTH,y,null);
		offG.drawImage(imgCount[(count%10)],x+COUNT_WIDTH*2,y,null);
		update();//更新画面
	}
}

   //画出砖块组动作区地图外框	
public void DrawMapFrame(int x,int y,int wid,int hig,int side,boolean raised){
	
	//定义多边形坐标
	int xx[][]={{x,x+wid,x+wid-side,x+side},//上
		    	{x+wid-side,x+wid,x+wid,x+wid-side},//右
				{x+side,x+wid-side,x+wid,x},//下
				{x,x+side,x+side,x}};//左

	int yy[][]={{y,y,y+side,y+side},//上
		    	{y+side,y,y+hig,y+hig-side},//右
				{y+hig-side,y+hig-side,y+hig,y+hig},//下
				{y,y+side,y+hig-side,y+hig}};//左		

			
	//画出多边形
	for(int i=0;i<=3;i++){
		if(raised){//设定框为凸起
			switch(i){//不同边设定不同颜色
				case 0:
					offG.setColor(new Color(250,250,250));
					break;
				case 1:
					offG.setColor(new Color(120,120,120));
					break;
				case 2:
					offG.setColor(new Color(100,100,100));
					break;
				case 3:
					offG.setColor(new Color(240,240,240));
					break;
			}
		}else{//设定框为凹陷
			switch(i){//不同边设定不同颜色
				case 0:
					offG.setColor(new Color(100,100,100));
					break;
				case 1:
					offG.setColor(new Color(240,240,240));
					break;
				case 2:
					offG.setColor(new Color(250,250,250));
					break;
				case 3:
					offG.setColor(new Color(120,120,120));					
					break;
			}
		}
		offG.fillPolygon(xx[i],yy[i],4);				
	}
	update();//更新画面
}	

public void update(){
	c.getGraphics().drawImage(offI,0,0,null);
}
}
public class Mine extends JFrame{

static SingleMine sm;

//建构子
public Mine(){
	super();		
}	

//程序进入点
public static void main(String[] args){
	int gridx=12;
	int gridy=12;
	int mines=20;
	JFrame.setDefaultLookAndFeelDecorated(true);//设定标准接口
	Mine m=new Mine();
	m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//预设窗口关闭方式
	m.setTitle("扫雷Java版");
	m.setSize(SingleMine.getDimension(gridx,gridy));//设定窗口大小
	m.setLocation(300,200);		
	
	m.setVisible(true);
	m.setResizable(false);
	
	sm=new SingleMine(gridx,gridy,mines,m.getContentPane());//建立SingleMine对象

	m.getContentPane().addMouseListener(sm);//加入鼠标监听事件
	m.getContentPane().addMouseMotionListener(sm);//加入鼠标监听事件

}

public void paint(Graphics g){
	super.paint(g);
	if(sm!=null)
		sm.md.update();	
}
}

⌨️ 快捷键说明

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