📄 singlemine.java
字号:
case -1://停止
break;
}
break;
}
md.update();
MOUSE_PRESSED_START=2;
}
public void mouseMoved(MouseEvent e){
setMousePosition(e);
if(MOUSE_POSITION==1) DrawMouseHover(e);
else md.update();
}
public void mouseDragged(MouseEvent e){
setMousePosition(e);
setMouseMapPosition(e);
//游戏状态
switch(GAME_RUN){
case 1:
case 0:
if(!UNDO){
if(MOUSE_PRESSED_START!=0)
showMouseDownMap(MOUSE_X,MOUSE_Y);
}
if(MOUSE_PRESSED_START==0){//起始在笑脸区
switch(MOUSE_POSITION){
case 0:
md.showSmile(1);//笑脸陷下
break;
case 1:
case 2:
md.showSmile(0);
break;
}
}
break;
case -1:
if(MOUSE_LEFT_PRESSED && MOUSE_PRESSED_START==0){
switch(MOUSE_POSITION){
case 0:
md.showSmile(1);
break;
case 1:
case 2:
switch(GAME_STATE){
case 1://成功
md.showSmile(3);//戴墨镜
break;
case 0://一般
md.showSmile(0);
break;
case -1://失败
md.showSmile(4);//苦脸
break;
}
break;
}
}
break;
}
md.update();
}
//设定鼠标所在区域
public void setMousePosition(MouseEvent e){
//笑脸区
if((e.getX())>=md.SMILE_X && (e.getX())<(md.SMILE_X+md.SMILE_WIDTH) && (e.getY())>=md.SMILE_Y && (e.getY())<(md.SMILE_Y+md.SMILE_HEIGHT)){
MOUSE_POSITION=0;
}
//地雷区
else if((e.getX())>=md.MAP_X && (e.getX())<(md.MAP_X+GRIDX*md.MAP_WIDTH) && (e.getY())>=md.MAP_Y && (e.getY())<(md.MAP_Y+GRIDY*md.MAP_HEIGHT)){
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 DrawMouseHover(MouseEvent e){
setMouseMapPosition(e);
if(MOUSE_X!=MOUSE_PREV_X || MOUSE_Y!=MOUSE_PREV_Y){
reloadMap();
if(FACE[MOUSE_X][MOUSE_Y]==1) md.showMap(MOUSE_X,MOUSE_Y,15);
else if(FACE[MOUSE_X][MOUSE_Y]==2) md.showMap(MOUSE_X,MOUSE_Y,16);
else if(FACE[MOUSE_X][MOUSE_Y]==3) md.showMap(MOUSE_X,MOUSE_Y,17);
}
MOUSE_PREV_X=MOUSE_X;
MOUSE_PREV_Y=MOUSE_Y;
md.update();
}
//更新地图提示
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;//成功
timDelaye=timer.getDelay();
timer.stop();
md.showSmile(3);//戴眼镜
md.showCount(md.MCOUNT_X,md.MCOUNT_Y,0);
tjDialog mm=new tjDialog(TIME_COUNT,level);
}
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);
}
//保存游戏数据到 saveGame.dat
public void saveGame(){
try{
DataOutputStream out=new DataOutputStream(new FileOutputStream("saveGame.dat"));
for(int i=0;i<GRIDX;i++){
for(int j=0;j<GRIDY;j++){
out.writeInt(FACE[i][j]);
out.writeInt(MAP[i][j]);
}
}
out.writeInt(TIME_COUNT);
out.writeInt(MINES);
out.writeInt(MMINES);
out.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"保存失败!");
}
}
//从 saveGame.dat 读入游戏数据
public void loadGame(){
File sav=new File("saveGame.dat");
try{
DataInputStream in=new DataInputStream(new FileInputStream(sav));
for(int i=0;i<GRIDX;i++){
for(int j=0;j<GRIDY;j++){
FACE[i][j]=in.readInt();
MAP[i][j]=in.readInt();
}
}
TIME_COUNT=in.readInt();
MINES=in.readInt();
MMINES=in.readInt();
in.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"读取失败!");
System.exit(1);
}
//删除存档
sav.delete();
//刷新界面
reloadMap();
md.showCount(md.MCOUNT_X,md.MCOUNT_Y,MINES);
md.showCount(md.COUNT_X,md.COUNT_Y,TIME_COUNT);
md.update();
GAME_RUN=1;//游戏开始
//启动定时器
timer=new Timer(1000,new EventListener());
timer.start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -