📄 minesweeping.java
字号:
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 + -