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

📄 minesweeping.java

📁 Java版仿Windows自带小游戏——扫雷
💻 JAVA
📖 第 1 页 / 共 2 页
字号:


import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import javax.swing.*;
import java.applet.AudioClip;
/**
 * <p>Title: 扫雷</p>
 *
 * <p>Description: 仿Windows自带的小游戏-扫雷-Java 版</p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 *
 * <p>Company: 中国矿业大学</p>
 *
 * <p>Email:chxzhou012@126.com</p>
 *
 * <p>QQ:395246039</p>
 *
 * @author zhou(周川祥)
 * @version 1.0
 */


class MineSweeping implements MouseListener,MouseMotionListener{

	int xGridCount;  //地图x轴格数
	int yGridCount;  //地图y轴格数
	int mineCount;  //地雷数
	int markedMineCount; //已标示地雷数
	int timeCount;//时间计数
	Container c;//容器
	int mineMap[][];//地雷布置情形;0:空白、1-8:外围地雷数、9:地雷
	int mineFace[][];//地雷表面情形;0:已探测、1:未探测、2:插棋子、3:疑问

	Image offI;
	Graphics offG;
	Draw draw;
	Timer timer;//定时器

	int mousePosition;//鼠标位置;0:笑脸,1:地图,2:其它
	int moursePressPosition;//鼠标按下位置;0:笑脸,1:地图,2:其它
	int xMouseGrid,yMouseGrid;//鼠标相对应地雷区坐标


	boolean lMousePressed,rMousePressed;//鼠标左右键按下

	boolean gameStart;//游戏开始
	boolean gameOver;//游戏结束
	boolean gameFinal;//游戏完成
	boolean noDo;//左右键不动作;

	int gameRunning;//游戏是否执行
	int gameState;//游戏状态 1:成功,0:一般,-1:失败

	AudioClip sound=java.applet.Applet.newAudioClip(getClass().getResource("sound/onMine.wav"));
	public MineSweeping(int gridx,   //地图x轴格数
			    int gridy,   //地图y轴格数
			    int nMine,   //地雷数
			    Container c){//容器

		//初始化
		this.xGridCount=gridx;
		this.yGridCount=gridy;
		this.mineCount=nMine;
		this.markedMineCount=nMine;
		this.c=c;
		mineMap=new int[gridx][gridy];
		mineFace=new int[gridx][gridy];
		draw=new Draw(gridx,gridy,nMine,c);
		reset();
		draw.update();//更新
	}

	private class EventListener implements ActionListener{
		public void actionPerformed(ActionEvent e){
			timeCount++;
			draw.showCount(draw.countX,draw.countY,timeCount);
		}
	}

	//以随机数布置地雷位置
	public void setMinePosition(){
		int m=this.mineCount;

		//当地雷未布置完时持续布置
		while(m>0){

			//随机数产生坐标
			int x=(int)(Math.random()*xGridCount);
			int y=(int)(Math.random()*yGridCount);

			//判断产生的坐标是否成立
			if(x>=0 && x<xGridCount &&//防止超出数组
			   y>=0 && y<yGridCount &&
			   mineMap[x][y]!=9 && //数组值不表示地雷
			   !(x==xMouseGrid && y==yMouseGrid)){

				m--;//布置地雷剩余数
				mineMap[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<xGridCount &&//范围在数组内
						   j>=0 && j<yGridCount &&
						   mineMap[i][j]!=9 &&//数组值不表示地雷
						   !(i==x && j==y)){//不为地雷坐标
							mineMap[i][j]++;
						}
					}
				}
			}
		}
	}


	//鼠标按键
	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://左键
			noDo=false;
			//纪录左键状态
			lMousePressed=true;

			//设定鼠标左键按下的起始区域
			moursePressPosition=mousePosition;

			//游戏状态
			switch(gameRunning){

			case 1://进行中
				//鼠标所在区域
				switch(mousePosition){
				case 0://笑脸区
					draw.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
					if(moursePressPosition!=0){
						if(rMousePressed){//右键按下时按下左键
							showMouseDownMap(xMouseGrid,yMouseGrid);
						}else{//右键未按下时按下左键
							//noDo=false;
						}
						if(mineFace[xMouseGrid][yMouseGrid]==1)
							draw.showMap(xMouseGrid,yMouseGrid,0);//空白
						draw.showSmile(2);//笑脸张嘴
					}
					break;
				case 2://一般区
					draw.showSmile(2);//笑脸张嘴
					break;
				}
				break;

			case 0://初始完成
				//鼠标所在区域
				switch(mousePosition){
				case 0://笑脸区
					draw.showSmile(1);//笑脸陷下
					break;
				case 1://地雷区
					if(moursePressPosition!=0){
						if(rMousePressed){//右键按下时按下左键
							showMouseDownMap(xMouseGrid,yMouseGrid);
						}else{//右键未按下时按下左键
							//noDo=false;
						}
						if(mineFace[xMouseGrid][yMouseGrid]==1)
							draw.showMap(xMouseGrid,yMouseGrid,0);//空白
						draw.showSmile(2);//笑脸张嘴
					}
					break;
				case 2://一般区
					draw.showSmile(2);//笑脸张嘴
					break;
				}
				break;

			case -1://停止
				switch(mousePosition){
				case 0://笑脸区
					draw.showSmile(1);//笑脸陷下
					break;
				}
				break;
			}
			break;

		case MouseEvent.BUTTON3://右键
			noDo=false;
			//纪录右键状态
			rMousePressed=true;
			if(gameRunning!=-1 && moursePressPosition!=0){

				if(lMousePressed){//连同左键按下时
					reloadMap();
					for(int i=(xMouseGrid-1);i<=(xMouseGrid+1);i++){
						for(int j=(yMouseGrid-1);j<=(yMouseGrid+1);j++){
							if(i>=0 && i<xGridCount &&
							   j>=0 && j<yGridCount &&
							   mineFace[i][j]==1){
								draw.showMap(i,j,0);
							}
						}
					}
				}else{//只有右键按下时
					if(mousePosition==1){
						if(mineFace[xMouseGrid][yMouseGrid]!=0){
							mineFace[xMouseGrid][yMouseGrid]++;
							if(mineFace[xMouseGrid][yMouseGrid]>=4){
								mineFace[xMouseGrid][yMouseGrid]=1;
							}
							if(mineFace[xMouseGrid][yMouseGrid]==2)
								markedMineCount--;
							else if(mineFace[xMouseGrid][yMouseGrid]==3)
								markedMineCount++;
							draw.showCount(draw.mineX,draw.mineY,markedMineCount);
							reloadMap();
						}
					}
				}
			}
			break;
		}
		draw.update();
	}

	public void mouseReleased(MouseEvent e){

		setMouseMapPosition(e);//设定鼠标在地图上坐标
		switch(e.getButton()){
		case MouseEvent.BUTTON1://左键

			//纪录左键状态
			lMousePressed=false;

			//游戏状态
			switch(gameRunning){

			case 1://进行中
				//鼠标所在区域
				switch(mousePosition){
				case 0://笑脸区
					if(moursePressPosition==0){//在笑脸区起始(重置游戏游戏)
						reset();//游戏重置
					}
					draw.showSmile(0);//笑脸
					break;
				case 1://地雷区
					if(moursePressPosition!=0){//不在笑脸区起始

						if(!rMousePressed &&
						   !noDo && //右键未按下松开左键
						   mineFace[xMouseGrid][yMouseGrid]==1){//表示未探测

							mineFace[xMouseGrid][yMouseGrid]=0;
							switch(mineMap[xMouseGrid][yMouseGrid]){
							case 0://空白
								autoClear(xMouseGrid,yMouseGrid);//清除空白
								checkCompleted();//检查是否完成
								break;
							case 9://地雷(游戏结束)
								onMine(true);
								break;
							default:
								checkCompleted();//检查是否完成
							}

						}else if(rMousePressed){//右键按下松开左键
							noDo=true;
							draw.showSmile(0);//笑脸
							if(moursePressPosition!=0){
								autoOpen();
								checkCompleted();
							}

						}else if(noDo){
							draw.showSmile(0);//笑脸
						}else{
							draw.showSmile(0);//笑脸
						}
						reloadMap();
					}
					break;
				case 2://一般区
					draw.showSmile(0);//笑脸
					break;
				}
				break;

			case 0://初始完成
				//鼠标所在区域
				switch(mousePosition){
				case 0://笑脸区
					if(moursePressPosition==0)
						reset();
					draw.showSmile(0);//笑脸
					break;
				case 1://地雷区
					if(moursePressPosition!=0 ){//不是在笑脸区起始(开始游戏)
						if(!rMousePressed && //右键未按下松开左键
						   !noDo &&
						   mineFace[xMouseGrid][yMouseGrid]==1){
							setMinePosition();//设定地雷位置
							gameRunning=1;//游戏开始

							//启动定时器
							timer=new Timer(1000,new EventListener());
							timer.start();

							mineFace[xMouseGrid][yMouseGrid]=0;//表示已探测
							switch(mineMap[xMouseGrid][yMouseGrid]){
							case 0://空白
								autoClear(xMouseGrid,yMouseGrid);
								break;
							}
							draw.showSmile(0);//笑脸
							checkCompleted();//检查是否完成
							reloadMap();//重新显示地雷区状况

						}else if(rMousePressed){//右键按下松开左键
							noDo=true;
							reloadMap();//重新显示地雷区状况
						}else if(noDo){
							draw.showSmile(0);//笑脸
						}else{
							draw.showSmile(0);//笑脸
						}

					}else{
						draw.showSmile(0);//笑脸
					}

					break;
				case 2://一般区
					draw.showSmile(0);//笑脸
					break;
				}
				break;

			case -1://停止

⌨️ 快捷键说明

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