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