📄 coremine.java
字号:
/** * 文件:CoreMine.java * 说明:扫雷游戏主要控制类 */package javamine;import java.awt.*;import java.awt.event.*;import java.util.Random;import javax.swing.*;public class CoreMine implements MouseListener,MouseMotionListener{ int GRIDX; //地图x轴格数 int GRIDY; //地图y轴格数 int MINES; //地雷数 int MMINES; //已标示地雷数int TIME_COUNT;//时间计数 int TIME_COUNT;//时间计数 int MAP[][];//地雷布置情形;0:空白,1-8:外围地雷数,9:地雷 int FACE[][];//地雷表面情形;0:已探测,1:未探测,2:插棋子,3:疑问 Container c;//容器 MineDraw md; Timer timer;//定时器 int MOUSE_POSITION;//鼠标位置;0:笑脸,1:地图,2:其它 int MOUSE_PRESSED_START;//鼠标按下位置;0:笑脸,1:地图,2:其它 int MOUSE_X;//鼠标相对应地雷区坐标 int MOUSE_Y; boolean MOUSE_RIGHT_PRESSED;//鼠标右键按下 boolean MOUSE_LEFT_PRESSED;//鼠标左键按下 boolean GAME_START;//游戏开始 boolean GAME_OVER;//游戏结束 boolean GAME_FINAL;//游戏完成 boolean UNDO;//左右键不动作; //boolean sound;//游戏是否有声音 int GAME_RUN;//游戏是否执行 [true:进行中],[false:停止] int GAME_STATE;//游戏状态 [1:成功],[0:一般],[-1:失败] public CoreMine(int gridx, //地图x轴格数 int gridy, //地图y轴格数 int mines, //地雷数 Container c){//容器 //资料初始 this.GRIDX=gridx; this.GRIDY=gridy; this.MINES=mines; this.MMINES=mines; //产生绘图对象 md=new MineDraw(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){ //随机数产生坐标 Random r=new Random(); int x=r.nextInt(GRIDX); int y=r.nextInt(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){//数组值不表示地雷 MAP[i][j]++; } } } } } } //取得窗口大小 public static Dimension getDimension(int x,int y){ return new Dimension((x+2)*16+6,(y+6)*16+58); } //鼠标按键 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://进行中 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);//空白 else if(FACE[MOUSE_X][MOUSE_Y]==3) md.showMap(MOUSE_X,MOUSE_Y,10);//按下的问号 md.showSmile(2);//笑脸张嘴 } break; case 2://一般区 md.showSmile(2);//笑脸张嘴 break; } break; case -1://停止 if(MOUSE_POSITION==0) md.showSmile(1);//笑脸陷下 break; } break; case MouseEvent.BUTTON2://中键 UNDO=false; MOUSE_LEFT_PRESSED=true; MOUSE_RIGHT_PRESSED=true; md.showSmile(2);//笑脸张嘴 case MouseEvent.BUTTON3://右键 UNDO=false; //纪录右键状态 MOUSE_RIGHT_PRESSED=true; if(GAME_RUN!=-1 && MOUSE_PRESSED_START!=0){ if(MOUSE_LEFT_PRESSED){//左键按下时按下右键 showMouseDownMap(MOUSE_X,MOUSE_Y); }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){ setMouseMapPosition(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]==3)){//表示疑问 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{ 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|| FACE[MOUSE_X][MOUSE_Y]==3)){ 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{ md.showSmile(0);//笑脸 } }else{ 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.BUTTON2://中键 if(MOUSE_PRESSED_START!=0&&GAME_RUN==1&&MOUSE_POSITION==1){ UNDO=true; checkAutoOpen(); checkFinal(); } md.showSmile(0);//笑脸 reloadMap(); MOUSE_LEFT_PRESSED=false; MOUSE_RIGHT_PRESSED=false; 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);//笑脸
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -