📄 mine.java
字号:
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);
}
}
class MDraw{
//游戏数据
int GRIDX; //地图x轴格数
int GRIDY; //地图y轴格数
int MINES; //地雷数
Container c;//容器
//次显示区
Image offI;
Graphics offG;
//图片数组
Image[] imgSmile;
Image[] imgMap;
Image[] imgCount;
//所有图片宽与长
int SMILE_WIDTH;
int SMILE_HEIGHT;
int MAP_WIDTH;
int MAP_HEIGHT;
int COUNT_WIDTH;
int COUNT_HEIGHT;
//各区域坐标
int STATE_X;//游戏状态区
int STATE_Y;
int COUNT_X;//时间计数
int COUNT_Y;
int MCOUNT_X;//地雷计数
int MCOUNT_Y;
int MAP_X;//地雷区
int MAP_Y;
int SMILE_X;//笑脸
int SMILE_Y;
public MDraw(int gridx, //地图x轴格数
int gridy, //地图y轴格数
int mines, //地雷数
Container c){//容器
//资料初始
this.GRIDX=gridx;
this.GRIDY=gridy;
this.MINES=mines;
this.c=c;
//建立次画面
offI=c.createImage(c.getWidth(),c.getHeight());
offG=offI.getGraphics();
//读入所有图片
imgSmile=new Image[5]; //游戏状态图(笑脸)
for(int i=0;i<=4;i++)
imgSmile[i]=(new ImageIcon("smile/s"+i+".gif")).getImage();
imgCount=new Image[10];//计数(LED字型)
for(int i=0;i<=9;i++)
imgCount[i]=(new ImageIcon("count/"+i+".gif")).getImage();
imgMap=new Image[15]; //地图上(数字、地雷)
for(int i=0;i<=14;i++)
imgMap[i]=(new ImageIcon("map/m"+i+".gif")).getImage();
//纪录图片宽与长
SMILE_WIDTH=imgSmile[0].getWidth(null);//游戏状态图
SMILE_HEIGHT=imgSmile[0].getHeight(null);
COUNT_WIDTH=imgCount[0].getWidth(null);//计数图
COUNT_HEIGHT=imgCount[0].getHeight(null);
MAP_WIDTH=imgMap[0].getWidth(null);//地图状态图
MAP_HEIGHT=imgMap[0].getHeight(null);
//所有区域坐标
MAP_X=MAP_WIDTH;//地雷区
MAP_Y=MAP_HEIGHT*5;
DrawMapFrame(MAP_X-3,MAP_Y-3,
GRIDX*MAP_WIDTH+6,GRIDY*MAP_HEIGHT+6,
3,false);
STATE_X=MAP_WIDTH;//游戏状态区
STATE_Y=MAP_HEIGHT;
DrawMapFrame(STATE_X-3,STATE_Y-3,
GRIDX*MAP_WIDTH+6,MAP_HEIGHT*3+6,
3,false);
MCOUNT_X=STATE_X+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;//地雷数
MCOUNT_Y=STATE_Y+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;
DrawMapFrame(MCOUNT_X-2,MCOUNT_Y-2,
COUNT_WIDTH*3+4,COUNT_HEIGHT+4,
2,false);
COUNT_X=(STATE_X-3)+
(GRIDX*MAP_WIDTH+6)-MAP_WIDTH-COUNT_WIDTH*3;//秒数
COUNT_Y=MCOUNT_Y;
DrawMapFrame(COUNT_X-2,COUNT_Y-2,
COUNT_WIDTH*3+4,COUNT_HEIGHT+4,2,false);
SMILE_X=(STATE_X-3)+(GRIDX*MAP_WIDTH+6-SMILE_WIDTH)/2;//笑脸
SMILE_Y=STATE_Y+(MAP_HEIGHT*3-SMILE_HEIGHT)/2;
//画出立体框
DrawMapFrame(0,0,(GRIDX+2)*MAP_WIDTH,(GRIDY+6)*MAP_HEIGHT,
4,true);
//mapInit();//地图初始化
showCount(MCOUNT_X,MCOUNT_Y,MINES);//显示地雷数
showCount(COUNT_X,COUNT_Y,0);//显示秒数
showSmile(0);//显示笑脸
}
//显示地图图标
public void showMap(int x,int y,int mode){
if(x>=0 && x<GRIDX &&//防止超出数组
y>=0 && y<GRIDY){
offG.drawImage(imgMap[mode],
MAP_X+x*MAP_WIDTH,
MAP_Y+y*MAP_HEIGHT,
null);
}
}
//显示笑脸
public void showSmile(int i){
if(i>=0 && i<=4)
offG.drawImage(imgSmile[i],SMILE_X,SMILE_Y,null);
update();
}
//显示计数数字
public void showCount(int x,int y,int count){
if(count>=0){
offG.drawImage(imgCount[(count%1000)/100],x,y,null);
offG.drawImage(imgCount[(count%100)/10],x+COUNT_WIDTH,y,null);
offG.drawImage(imgCount[(count%10)],x+COUNT_WIDTH*2,y,null);
update();//更新画面
}
}
//画出砖块组动作区地图外框
public void DrawMapFrame(int x,int y,int wid,int hig,int side,boolean raised){
//定义多边形坐标
int xx[][]={{x,x+wid,x+wid-side,x+side},//上
{x+wid-side,x+wid,x+wid,x+wid-side},//右
{x+side,x+wid-side,x+wid,x},//下
{x,x+side,x+side,x}};//左
int yy[][]={{y,y,y+side,y+side},//上
{y+side,y,y+hig,y+hig-side},//右
{y+hig-side,y+hig-side,y+hig,y+hig},//下
{y,y+side,y+hig-side,y+hig}};//左
//画出多边形
for(int i=0;i<=3;i++){
if(raised){//设定框为凸起
switch(i){//不同边设定不同颜色
case 0:
offG.setColor(new Color(250,250,250));
break;
case 1:
offG.setColor(new Color(120,120,120));
break;
case 2:
offG.setColor(new Color(100,100,100));
break;
case 3:
offG.setColor(new Color(240,240,240));
break;
}
}else{//设定框为凹陷
switch(i){//不同边设定不同颜色
case 0:
offG.setColor(new Color(100,100,100));
break;
case 1:
offG.setColor(new Color(240,240,240));
break;
case 2:
offG.setColor(new Color(250,250,250));
break;
case 3:
offG.setColor(new Color(120,120,120));
break;
}
}
offG.fillPolygon(xx[i],yy[i],4);
}
update();//更新画面
}
public void update(){
c.getGraphics().drawImage(offI,0,0,null);
}
}
public class Mine extends JFrame{
static SingleMine sm;
//建构子
public Mine(){
super();
}
//程序进入点
public static void main(String[] args){
int gridx=12;
int gridy=12;
int mines=20;
JFrame.setDefaultLookAndFeelDecorated(true);//设定标准接口
Mine m=new Mine();
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//预设窗口关闭方式
m.setTitle("扫雷Java版");
m.setSize(SingleMine.getDimension(gridx,gridy));//设定窗口大小
m.setLocation(300,200);
m.setVisible(true);
m.setResizable(false);
sm=new SingleMine(gridx,gridy,mines,m.getContentPane());//建立SingleMine对象
m.getContentPane().addMouseListener(sm);//加入鼠标监听事件
m.getContentPane().addMouseMotionListener(sm);//加入鼠标监听事件
}
public void paint(Graphics g){
super.paint(g);
if(sm!=null)
sm.md.update();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -