📄 singlemine.java
字号:
if(MOUSE_PRESSED_START==0){
reset();//游戏重置
}
break;
}
break;
}
break;
case MouseEvent.BUTTON3://右键
//纪录右键状态
MOUSE_RIGHT_PRESSED=false;
switch(GAME_RUN){
case 1://进行中
//break;
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;
case -1://停止
break;
}
break;
}
md.update();
MOUSE_PRESSED_START=2;
}
//鼠标事件
public void mouseMoved(MouseEvent e){
setMousePosition(e);//设定鼠标所在区域
}
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 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;//成功
timer.stop();
md.showSmile(3);//戴眼镜
md.showCount(md.MCOUNT_X,md.MCOUNT_Y,0);
}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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -