当前位置:首页 > 开发教程 > java教程 >

用java实现扫雷游戏

时间:2022-06-06 12:31 来源:未知 作者:天大地 收藏

这篇文章主要为大家详细介绍了用java实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

用java做出简单一个扫雷游戏,供大家参考,具体内容如下

1.创造窗口

//创建扫雷窗口界面 
 public Saolei() {
  
   frame.setSize(600,700);
   frame.setResizable(false);//设置窗口尺寸不能变化
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setLayout(new BorderLayout());//分块
   setHeader();//设置界面初始化
   addlei();  //添加雷
   setButtons();//添加按钮
   timer.start();  //启动时钟;
   frame.setVisible(true);
  }

2.定义数据结构以及初始化

//数据结构start
 int ROW = 20;
 int COL = 20;
 int [][] data = new int[ROW][COL];
 JButton[][] btns = new JButton[ROW][COL];
 int LEICOUNT = 30;  //雷个数
 int LEICODE = -1;
 int unopened = ROW*COL;
 int opened = 0;
 int timeSecond =0;
 //三个 jlabel 状态栏 已开未开,用时
 JLabel label1= new JLabel("待开:"+unopened);
 JLabel label2= new JLabel("已开:"+opened);
 JLabel label3= new JLabel("用时:"+timeSecond+"s");
 Timer timer = new Timer(1000, this); //定义时间为一秒 

3.窗体按钮

private void setButtons() {
  Container con = new Container();//container容器
  con.setLayout(new GridLayout(ROW,COL));//创建方格
  
  for(int i=0;i<ROW;i++) {
   for(int j=0;j<COL;j++) {
    JButton btn = new JButton();
    btn.setOpaque(true);
    btn.setBackground(new Color(200,183,113)); //设置扫雷背景颜色
    btn.addActionListener(this); //Btn添加按钮监听事件
    btn.setMargin(new Insets(0,0,0,0)); //button数字显示不出来,加上该语句即可显示
    con.add(btn);
    btns[i][j] = btn;
   }
  }
  frame.add(con,BorderLayout.CENTER);//中间位置
  
 }

4.埋雷

private void addlei() {
  Random rand = new Random();
  for(int i=0;i<LEICOUNT;) {
   int r = rand.nextInt(ROW);
   int c= rand.nextInt(COL);
   if(data[r][c]!=LEICODE) {
    data[r][c] = LEICODE;
    i++;
//    System.out.println(r+" "+c+" "+data[r][c]);
   }
  }

5.计算周围雷的数量

//计算周边雷的数量
   for(int i=0;i<ROW;i++) {
    for(int j=0;j<COL;j++) {
     if(data[i][j]!=LEICODE) {
       int c=0;
       if(i>0&&j>0&&data[i-1][j-1]==LEICODE) c++;
       if(i>0&&data[i-1][j]==LEICODE) c++;
       if(i>0&&j<19&&data[i-1][j+1]==LEICODE) c++;
       if(j>0&&data[i][j-1]==LEICODE) c++;
       if(j<19&&data[i][j+1]==LEICODE) c++;
       if(i<19&&j>0&&data[i+1][j-1]==LEICODE) c++;
       if(i<19&&data[i+1][j]==LEICODE) c++;
       if(i<19&&j<19&&data[i+1][j+1]==LEICODE) c++;
       data[i][j]=c;
     } 
    }
   }

6.Banner设置

//设置开头显示
 private void setHeader() {
  //设置画布 Jpanel
  JPanel panel = new JPanel(new GridBagLayout());
  GridBagConstraints c1 = new GridBagConstraints(0,0,3,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
  panel.add(bannerBtn,c1);
  
  bannerBtn.addActionListener(this);
  label1.setOpaque(true);  //设置不透明,背景色,
  label1.setBackground(Color.white); 
  label1.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  
  label2.setOpaque(true);
  label2.setBackground(Color.white);
  label2.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  
  label3.setOpaque(true);
  label3.setBackground(Color.white);
  label3.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  
  bannerBtn.setOpaque(true);
  bannerBtn.setBackground(Color.white);
  bannerBtn.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  
  GridBagConstraints c2 = new GridBagConstraints(0,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
  panel.add(label1,c2);
  GridBagConstraints c3 = new GridBagConstraints(1,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
  panel.add(label2,c3);
  GridBagConstraints c4 = new GridBagConstraints(2,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
  panel.add(label3,c4);
  
  frame.add(panel,BorderLayout.NORTH);
  
 }

7.游戏胜利还是失败

//判断胜利!!!
private void checkWin() {
  
   int count=0;
   for(int i=0;i<ROW;i++) {
    for(int j=0;j<COL;j++) {
     if(btns[i][j].isEnabled()) {
      count++;
      
     }
    }
   }
   unopened = count;
   opened = ROW*COL-count;
   
   label1.setText("待开:"+ unopened);
   label2.setText("已开:"+ opened);
   if(count==LEICOUNT) {
    timer.stop();
    bannerBtn.setText("游戏胜利!!!");
    for(int i=0;i<ROW;i++) {
     for(int j=0;j<COL;j++) {
      if(btns[i][j].isEnabled()) {
        btns[i][j].setBackground(new Color(100,183,0));
         
      }
     }
    }
    bannerBtn.setText("Banner:restart!");
    JOptionPane.showMessageDialog(frame, "恭喜你!游戏胜利啦!\n 可以点击上面的Banner重新开始!","游戏结束!",JOptionPane.PLAIN_MESSAGE);
   }
   
  
 }

 //踩雷成功,游戏结束!
 private void lose() {
  timer.stop();
   bannerBtn.setText("很遗憾,踩雷成功,游戏结束!!!");
  for(int i=0;i<ROW;i++) {
   for(int j=0;j<COL;j++) {
    if(btns[i][j].isEnabled()) {
     JButton btn = btns[i][j];
     if(data[i][j]==LEICODE) {
//     btns[i][j].setEnabled(false); btns[i][j].setIcon(bombIcon); btns[i][j].setDisabledIcon(bombIcon);
     
      btn.setBackground(Color.red);  //置为红色
      btn.setText(data[i][j]+"");
     }
     else {
      btn.setIcon(null);
      btn.setEnabled(false);  //btn已经打开不可点击
      btn.setOpaque(true);
  
     }
    }
   }
  }
  bannerBtn.setText("Banner:restart!");
  JOptionPane.showMessageDialog(frame, "很遗憾,暴雷成功,游戏结束!!!\n 可以点击上面的Banner重新开始!","游戏结束!",JOptionPane.PLAIN_MESSAGE);
  
 }

8.空白级联打开(实现点击一个即可打开多个)

private void openCell(int i,int j,int Blankcount ){
  JButton btn=btns[i][j];
  if(!btn.isEnabled()) return ;
  if(Blankcount==10)  //部分打开,设置数字限制
   return;
  btn.setIcon(null);
  btn.setEnabled(false);
  btn.setOpaque(true);
  Blankcount++;
  btn.setBackground(Color.GREEN);
  btn.setText(data[i][j]+"");
  if(data[i][j]==0) {
    if(i>0&&j>0&&data[i-1][j-1]==0) openCell(i-1,j-1,Blankcount);
     if(i>0&&data[i-1][j]==0) openCell(i-1,j,Blankcount);
     if(i>0&&j<19&&data[i-1][j+1]==0) openCell(i-1,j+1,Blankcount);
     if(j>0&&data[i][j-1]==0) openCell(i,j-1,Blankcount);
     if(j<19&&data[i][j+1]==0) openCell(i,j+1,Blankcount);
     if(i<19&&j>0&&data[i+1][j-1]==0) openCell(i+1,j-1,Blankcount);
     if(i<19&&data[i+1][j]==0) openCell(i+1,j,Blankcount);
     if(i<19&&j<19&&data[i+1][j+1]==0) openCell(i+1,j+1,Blankcount);
  }
  
 }

9.最终游戏界面

用java实现扫雷游戏

用java实现扫雷游戏

总结

游戏界面颜色设置的有点丑,代码是跟着某站上老师做的,感谢老师!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持源码搜藏网。


java教程阅读排行

最新文章