📄 minesweeping.java
字号:
switch(mousePosition){
case 0://笑脸区
if(moursePressPosition==0){
reset();//游戏重置
}
break;
}
break;
}
break;
case MouseEvent.BUTTON3://右键
//纪录右键状态
rMousePressed=false;
switch(gameRunning){
case 1://进行中
//break;
case 0://初始
if(moursePressPosition!=0){
if(!lMousePressed && !noDo){//左键未按下松开右键
draw.showSmile(0);//笑脸
}else if(lMousePressed){//左键按下松开右键
noDo=true;
if(moursePressPosition!=0 && gameRunning==1){
autoOpen();
checkCompleted();
}
}else if(noDo){
draw.showSmile(0);//笑脸
}
reloadMap();
}else{
draw.showSmile(0);//笑脸
}
break;
case -1://停止
break;
}
break;
}
draw.update();
moursePressPosition=2;
}
//鼠标事件
public void mouseMoved(MouseEvent e){
setMousePosition(e);//设定鼠标所在区域
}
public void mouseDragged(MouseEvent e){
//设定鼠标所在区域
setMousePosition(e);
setMouseMapPosition(e);
//依游戏状态
switch(gameRunning){
case 1://进行中
case 0://初始完成
if(!noDo){
if(moursePressPosition!=0)
showMouseDownMap(xMouseGrid,yMouseGrid);
}
if(moursePressPosition==0){//起始在笑脸区
switch(mousePosition){
case 0://笑脸区
draw.showSmile(1);//笑脸陷下
break;
case 1://地雷区
case 2://一般区
draw.showSmile(0);//笑脸
break;
}
}
break;
case -1://停止
if(lMousePressed && moursePressPosition==0){
switch(mousePosition){
case 0://笑脸区
draw.showSmile(1);//笑脸陷下
break;
case 1://地雷区
case 2://一般区
switch(gameState){
case 1://成功
draw.showSmile(3);//戴眼镜
break;
case 0://一般
draw.showSmile(0);//笑脸
break;
case -1://失败
draw.showSmile(4);//哭脸
break;
}
break;
}
}
break;
}
draw.update();
}
//设定鼠标所在区域
public void setMousePosition(MouseEvent e){
//笑脸区
if((e.getX())>=draw.smileX &&
(e.getX())<(draw.smileX+draw.smileWidth) &&
(e.getY())>=draw.smileY &&
(e.getY())<(draw.smileY+draw.simleHeight)){
mousePosition=0;
//地雷区
}else if((e.getX())>=draw.mapX &&
(e.getX())<(draw.mapX+xGridCount*draw.mapWidth) &&
(e.getY())>=draw.mapY &&
(e.getY())<(draw.mapY+yGridCount*draw.mapHeight)){
mousePosition=1;
//其它区
}else{
mousePosition=2;
}
}
//设定鼠标在地图上坐标
public void setMouseMapPosition(MouseEvent e){
xMouseGrid=(e.getX()-draw.mapX)/draw.mapWidth;
yMouseGrid=(e.getY()-draw.mapY)/draw.mapHeight;
}
//显示鼠标按下的地雷区
public void showMouseDownMap(int x,int y){
reloadMap();//更新地图图示
if(lMousePressed && rMousePressed){
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 &&
mineFace[i][j]==1){
draw.showMap(i,j,0);
}
}
}
}else if(lMousePressed){
if(x>=0 && x<xGridCount &&//防止超出数组
y>=0 && y<yGridCount &&
mineFace[x][y]==1){
draw.showMap(x,y,0);
}
}
}
//更新地图图示
public void reloadMap(){
for(int i=0;i<xGridCount;i++){
for(int j=0;j<yGridCount;j++){
if(mineFace[i][j]==0){//已探测
draw.showMap(i,j,mineMap[i][j]);
}else{//未探测
switch(mineFace[i][j]){
case 1://未探测
draw.showMap(i,j,12);
break;
case 2://插棋子
draw.showMap(i,j,13);
break;
case 3://问号
draw.showMap(i,j,14);
break;
}
}
}
}
}
//设定地图表面状态
public void setFace(int nIndex){
if(xMouseGrid>=0 && xMouseGrid<xGridCount &&//防止超出数组
yMouseGrid>=0 && yMouseGrid<yGridCount){
mineFace[xMouseGrid][yMouseGrid]=nIndex;
}
}
//清除空白区
public void autoClear(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<xGridCount &&
j>=0 && j<yGridCount &&
mineFace[i][j]==1 && //表示未探测
!(i==x && j==y)){
switch(mineMap[i][j]){
case 0:
mineFace[i][j]=0;
autoClear(i,j);
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
mineFace[i][j]=0;
break;
}
}
}
}
}
//鼠标两件按下时松开任一键检查自动翻开
public void autoOpen(){
int x=xMouseGrid;
int y=yMouseGrid;
int n=mineMap[x][y];
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 &&
mineFace[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<xGridCount &&
j>=0 && j<yGridCount &&
mineFace[i][j]==1 &&
!gameOver){
mineFace[i][j]=0;
if(mineMap[i][j]==0)
autoClear(i,j);
else if(mineMap[i][j]==9)
onMine(false);
}
}
}
}
}
//踩到地雷
public void onMine(boolean right){
if(right)//是否在正上方
mineMap[xMouseGrid][yMouseGrid]=11;//地雷加红边
gameRunning=-1;//游戏停止
gameState=-1;//失败
if(timer!=null){
timer.stop();
timer=null;
}
for(int ii=0;ii<xGridCount;ii++){
for(int jj=0;jj<yGridCount;jj++){
if(mineFace[ii][jj]==2 &&//插错棋子
mineMap[ii][jj]!=9){//非地雷
mineMap[ii][jj]=10;
mineFace[ii][jj]=0;
}
if(mineFace[ii][jj]==2 &&//插对棋子
mineMap[ii][jj]==9)//地雷
mineFace[ii][jj]=0;
if(mineFace[ii][jj]==1 &&//未探索
mineMap[ii][jj]==9)
mineFace[ii][jj]=0;
}
}
sound.play();
draw.showSmile(4);//哭脸
}
//检查是否完成
public void checkCompleted(){
int m=mineCount;
for(int i=0;i<xGridCount;i++){
for(int j=0;j<yGridCount;j++){
if(mineFace[i][j]!=0)
m--;
}
}
if(m==0){
for(int i=0;i<xGridCount;i++){
for(int j=0;j<yGridCount;j++){
if(mineMap[i][j]==9)
mineMap[i][j]=13;
mineFace[i][j]=0;
}
}
gameRunning=-1;//游戏停止
gameState=1;//成功
timer.stop();
draw.showSmile(3);//戴眼镜
draw.showCount(draw.mineX,draw.mineY,0);
}else{
if(gameRunning==1)
draw.showSmile(0);//笑脸
else{
if(gameState==-1)
draw.showSmile(4);//哭脸
}
}
}
//重置游戏
public void reset(){
for(int i=0;i<xGridCount;i++){
for(int j=0;j<yGridCount;j++){
mineFace[i][j]=1;//地雷表面设定(未探索)
mineMap[i][j]=0;//地雷设定(空白)
}
}
gameRunning=0; //游戏初始完成
gameState=0;//一般状态
lMousePressed=false;
rMousePressed=false;
noDo=false;
//定时器重置
if(timer!=null)
timer.stop();
timeCount=0;//时间计数设定
markedMineCount=mineCount;//标记地雷数设定
reloadMap();
draw.showSmile(0);
draw.showCount(draw.mineX,draw.mineY,mineCount);
draw.showCount(draw.countX,draw.countY,timeCount);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -