⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javaclearbomb.java

📁 简单的扫雷小游戏,采用java环境编程.设置有初中高级!并有扫雷英雄榜
💻 JAVA
字号:
import java.awt.*; 
import java.awt.event.*; 
import java.math.*;
import java.util.*;
import javax.swing.*;
//程序入口
public class JavaClearBomb {
public static void main(String args[]){
   DrawInterFace DIF=new DrawInterFace();
   DIF.RandomMine();
   }

}


//生成界面 
class DrawInterFace{
   //地雷标志,0无雷,1有雷
   private static int fmine[]=new int[81];
   //右键记录标志
   private static boolean rmouse;
   //用来存放总地雷数
   private static int fcount=10;
   //存放剩余地雷数
   private static int rcount;
   //存放随机生成的数
   private static int r[]=new int[10];
   //记录标签是否翻开标志
   private static boolean appear[]=new boolean[81];
   //记录时间
   private static long time=0;
   //标记线程
   private boolean stop = true;
   //标记又右键
   private static boolean rightclick[]=new boolean[81];
  
   private Frame fr;
   private Menu m1,m2;
   private MenuBar mb;
   private MenuItem mi11,mi12,mi13,mi14,mi15,mi19,mi110,mi21,mih;
   private CheckboxMenuItem mi16,mi17,mi18;
   //用CardLayout来放置按钮和标签,plbmine里包含lbmine和btmine,为了实现CardLayout的功能
   private Panel pup,pdown;
   private Label lbleft,lbright,lbover;
   private Button btagain,btexit;
   private JButton btstart;
   private static Button btmine[];
   private static Label lbmine[];
   private static Panel plbmine[];
   private int minenum=0;
   private int mine[]=new int[10];
   private static CardLayout CLayout=new CardLayout();
   private Dialog digOver;
public DrawInterFace(){
  
//生成菜单栏   
   fr=new Frame("扫雷");
   mb=new MenuBar();
   fr.setMenuBar(mb);
   m1=new Menu("游戏");
   m2=new Menu("帮助");
   mb.add(m1);
   mb.setHelpMenu(m2);
   mi11=new MenuItem("开局");
   mi12=new MenuItem("初级");
   mi13=new MenuItem("中级");
   mi14=new MenuItem("高级");
   mi15=new MenuItem("自定义");
   mi16=new CheckboxMenuItem("标记");
   mi17=new CheckboxMenuItem("颜色");
   mi18=new CheckboxMenuItem("声音");
   mi19=new MenuItem("扫雷英雄榜");
   mi110=new MenuItem("退出");
   mih=new MenuItem("河海大学");
   mi21=new MenuItem("06计算机周挺川");
   m1.add(mi11);
   m1.addSeparator();
   m1.add(mi12);
   m1.add(mi13);
   m1.add(mi14);
   m1.add(mi15);
   m1.addSeparator();
   m1.add(mi16);
   m1.add(mi17);
   m1.add(mi18);
   m1.addSeparator();  
   m1.add(mi19);
   m1.addSeparator();  
   m1.add(mi110);
   m2.add(mih);
   m1.addSeparator();  
   m2.add(mi21);
   fr.setMenuBar(mb);
   mb.add(m1);
   mb.add(m2);
   fr.setResizable(false);
   fr.setLocation(500,200);
  
  
//生成时间显示区,雷数显示区和开始游戏按钮
   pup=new Panel();
   pdown=new Panel();
   pup.setLayout(new FlowLayout());
   lbleft=new Label("0");
   lbleft.setAlignment(Label.CENTER);
   lbright=new Label("0");
   lbright.setAlignment(Label.CENTER);
   btstart=new JButton("",new ImageIcon("image/mine.gif"));
//   lbleft.setLocation(1,10);
//   lbright.setLocation(250,1);
//   btstart.setBounds(125,1,24,24);
   pup.add(lbleft);
   pup.add(btstart);
   pup.add(lbright);  
//对话框
   lbover=new Label("踩到雷了");
   btagain=new Button("再玩一局");
   btexit=new Button("算了");
   digOver=new Dialog(fr,"你输了");
   digOver.setLayout(new FlowLayout());
   digOver.setResizable(false);
   digOver.setSize(250,70);
   digOver.add(lbover);
   digOver.add(btagain);
   digOver.add(btexit);
   btagain.addActionListener(new Restart());
   btexit.addActionListener(new Exit());
   digOver.setLocation(500,250);
//生成雷区
   pdown.setLayout(new GridLayout(9,9,1,1));
   btmine=new Button[81];
   lbmine=new Label[81];
   plbmine=new Panel[81];
   for(int i=0;i<81;i++)
    {
     btmine[i]=new Button();
     lbmine[i]=new Label();
     lbmine[i].setBackground(Color.LIGHT_GRAY);
     lbmine[i].setAlignment(Label.CENTER);//设定标签文字居中显示
     plbmine[i]=new Panel();
    }
   for(int i=0;i<81;i++)
    {
     plbmine[i].setLayout(CLayout);
     plbmine[i].add(btmine[i],"up");
     plbmine[i].add(lbmine[i],"up");
     pdown.add(plbmine[i],"down");
    }

//设定雷区按钮的监听
   for(int i=0;i<81;i++)
    {
     btmine[i].addActionListener(new BombAction());
     btmine[i].addMouseListener(new UnitEvent(i));
    }
//设定开始按钮的监听
   btstart.addActionListener(new Start());      
    
//画出panel  
   fr.add(pup,"North");
   fr.add(pdown,"South");
   fr.setSize(222,300);
   fr.setVisible(true);
   fr.addWindowListener(new WindowClosing());
//初始化
   for(int i=0;i<81;i++)
   {
    fmine[i]=0;
    appear[i]=false;
    rightclick[i]=false;
   }
   rmouse=false;
   rcount=10;
   lbright.setText(Integer.toString(rcount));
}
//随机生成10个大小介于0到80之间的整数并对雷进行标记(算法有待优化)


public static void RandomMine(){
//存到fmine[i]中,1为雷,0没有
Random rm=new Random();
for(int i=0;i<10;i++){
   r[i]=rm.nextInt(80);
   for(int j=0;j<i;j++){
    while((r[i]==r[j])&&(i!=j)){
     r[i]=rm.nextInt(80); 
    };
}
}
for(int i=0;i<10;i++)
{
   fmine[r[i]]=1; 
}
} 


//计算某方格周围的雷数
static int HowManyMine(int x){
int temp=0;
switch (x){
   //左上角
   case 0:      temp=fmine[x+1]+fmine[x+9]+fmine[x+10];break;
   //右上角
   case 8:      temp=fmine[x-1]+fmine[x+8]+fmine[x+9];break;
   //左下角
   case 72:     temp=fmine[x-9]+fmine[x-8]+fmine[x+1];break;
   //右下角
   case 80:     temp=fmine[x-10]+fmine[x-9]+fmine[x-1];break;
   //上边
   case 1:
   case 2: 
   case 3: 
   case 4: 
   case 5: 
   case 6: 
   case 7:      temp=fmine[x-1]+fmine[x+1]+fmine[x+8]+fmine[x+9]+fmine[x+10];break;
   //下边
   case 73: 
   case 74: 
   case 75: 
   case 76: 
   case 77: 
   case 78: 
   case 79:     temp=fmine[x-10]+fmine[x-9]+fmine[x-8]+fmine[x-1]+fmine[x+1];break;
   //左边
   case 9: 
   case 18: 
   case 27: 
   case 36: 
   case 45: 
   case 54: 
   case 63:     temp=fmine[x-9]+fmine[x-8]+fmine[x+1]+fmine[x+9]+fmine[x+10];break;
   //右边
   case 17: 
   case 26: 
   case 35: 
   case 44: 
   case 53: 
   case 62: 
   case 71:     temp=fmine[x-10]+fmine[x-9]+fmine[x-1]+fmine[x+8]+fmine[x+9];break;
   //其余
   default:     temp=fmine[x-10]+fmine[x-9]+fmine[x-8]+fmine[x-1]+fmine[x+1]+fmine[x+8]+fmine[x+9]+fmine[x+10];break;
}
return temp;
}
//判断标签是否已经显示

////展开雷区方法(此算法严重需要改进)
static void ClickMine(int i){
CLayout.last(plbmine[i]);
if(fmine[i]==1) {
System.out.println("踩到雷了");
return;
}
else {
   if(HowManyMine(i)==0) 
    {
     CLayout.last(plbmine[i]);
     appear[i]=true;
    } 
   else{
     CLayout.last(plbmine[i]);
     appear[i]=true;
     return;
    }
}
btmine[i].setVisible(false); 
switch (i){
   //左上角
   case 0:      {if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
   //右上角
   case 8:      {if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}break;}
   //左下角
   case 72:     {if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}break;}
   //右下角
   case 80:     {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}break;}
   //上边
   case 1:
   case 2: 
   case 3: 
   case 4: 
   case 5: 
   case 6: 
   case 7:      {if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
   //下边
   case 73: 
   case 74: 
   case 75: 
   case 76: 
   case 77: 
   case 78: 
   case 79:     {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}break;}
   //左边
   case 9: 
   case 18: 
   case 27: 
   case 36: 
   case 45: 
   case 54: 
   case 63:     {if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
   //右边
   case 17: 
   case 26: 
   case 35: 
   case 44: 
   case 53: 
   case 62: 
   case 71:     {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}break;}
   //其余
   default:     {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
}
}

//内部类实现监听,实现扫雷中心算法

class BombAction implements ActionListener{
   public void actionPerformed(ActionEvent e){
     if(stop==true){
      new Clock().start();
     }
     stop = false;     
     for (int i=0;i<81;i++){
      if (e.getSource()==btmine[i]&&rightclick[i]==true) return;
     } 
     for (int i=0;i<81;i++){
     lbmine[i].setText(Integer.toString(HowManyMine(i)));
     if(HowManyMine(i)==0) {lbmine[i].setText("");}
     if (e.getSource()==btmine[i])
      {
       if(fmine[i]==1)
        {
        //判断是否失败 
        stop=true; 
        digOver.setVisible(true);
        fr.setEnabled(false);
        }
       else
       {
        //实现展开雷区(较难算法)  
        ClickMine(i);
        //判断是否胜利(要改进)
        int win=0;
        for(int j=0;j<81;j++){
        if(appear[j]==true) win++;
        }
        if(win==71){
        stop=true;
        lbover.setText("用时"+time+"秒");
        digOver.setTitle("你赢了");
        digOver.setVisible(true);
        }
       }     
     }
   }
}  
}
//右键标记

//线程实现记时
class Clock extends Thread{  
public void run(){
   while(stop==false){
   try{
     sleep(1000);
    }
   catch(InterruptedException e){
    System.out.println(e.getMessage());
    }
    time++;
    lbleft.setText(String.valueOf(time));
   }
   return;  
}
} 
//开始按钮的监听
class Start implements ActionListener{
public void actionPerformed(ActionEvent e){
   for(int i=0;i<81;i++)
   {
    fmine[i]=0;
    appear[i]=false;
    lbmine[i].setText("");
    btmine[i].setVisible(true);
    CLayout.first(plbmine[i]);
    btmine[i].setLabel("");
    btmine[i].setEnabled(true);
    rightclick[i]=false;
   }
   btstart.setIcon(new ImageIcon("image/mine.gif"));
   RandomMine();
   rcount=10;
   lbright.setText(Integer.toString(rcount));
   //初始化线程
   stop = true; 
   time=0;
   lbleft.setText(Long.toString(time));
   }    
}
//右击事件
class UnitEvent extends MouseAdapter{
private int i;
public UnitEvent(int i){
   this.i=i;
}
public void mouseClicked(MouseEvent e){
   if(e.getModifiers()==InputEvent.BUTTON1_MASK){
   }
   if(e.getModifiers()==InputEvent.BUTTON2_MASK){
   }
   if(e.getModifiers()==InputEvent.BUTTON3_MASK){
    if(btmine[i].getLabel()==""){
     btmine[i].setLabel("▲");
     rightclick[i]=true;
     rcount--;
     lbright.setText(String.valueOf(rcount));
     return;
    }
    if(btmine[i].getLabel()=="▲"){
     btmine[i].setLabel("?");
     btmine[i].setEnabled(true);
     rightclick[i]=false;
     rcount++;
     lbright.setText(String.valueOf(rcount));
     return;
    }
    if(btmine[i].getLabel()=="?"){
     btmine[i].setLabel("");
     return;
    }
   }

}
}
//对话框按钮的监听
class Restart implements ActionListener{
public void actionPerformed(ActionEvent e){
   new Start().actionPerformed(e);
   digOver.setVisible(false);
   fr.setEnabled(true);
   lbover.setText("踩到雷了");
   digOver.setTitle("你输了");
}    
}
class Exit implements ActionListener{
public void actionPerformed(ActionEvent e){
   System.exit(0);
}    
}
//内部类关闭窗口
class WindowClosing extends WindowAdapter{
public void windowClosing(WindowEvent e){
   System.exit(0);
}
}  
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -