用java实现扫雷游戏

用java做出简单一个扫雷游戏
1.创造窗口
2.定义数据结构以及初始化
3.窗体按钮
4.埋雷
5.计算周围雷的数量
6.Banner设置
7.游戏胜利还是失败
8.空白级联打开(实现点击一个即可打开多个)
9.最终游戏界面
总结
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);
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
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); //定义时间为一秒  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);//中间位置
      
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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]);
            }
        }
        
1
2
3
4
5
6
7
8
9
10
11
12
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;
                  }     
              }
          }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
        
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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);
        
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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.最终游戏界面

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

(0)

相关推荐

  • java swing实现的扫雷游戏及改进版完整示例

    本文实例讲述了java swing实现的扫雷游戏及改进版.分享给大家供大家参考,具体如下: 版本1: package awtDemo; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import jav

  • Java实现简单的扫雷小程序

    前两天看了个扫雷的视频,于是自己跟着做了下,感觉还不是很难. 初学Java的同学可以尝试自己操作下Java小程序 这样子才能提高自己的理解能力和编程水平 不用多说了,直接上代码吧! 具体代码操作如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(type) b.工程架构 设计工程包结构 bean:存放实体类 core:游戏核心类(游戏操作) test:扫雷玩的测试类 c.编写类 Grid(属性:content.type) Core类–游戏核心类(雷区创建.显示雷区.布雷.踩雷) Test类–测试类 d.核心类设计 1.格子对象创建方法定义 2.显

  • Java语言实现的扫雷游戏(2)

    本文实例为大家分享了Java语言实现的扫雷游戏的第2部分代码,供大家参考,具体内容如下 在上一篇文章中,我们已经将扫雷的绘制了方格阵列并随机分配了炸弹的位置,接下来我们要将阵列全部覆盖上按钮.因为我们要通过按钮来获知当前方格的坐标,所以简单的Button按钮还无法满足我们的要求,所以,我们就自定义一个按钮的类,让它继承自Button类,但要给他加上行号和列号,这样我们就能直接通过按钮读取它的位置了 import javax.swing.JButton; public class MyButton

  • java实现扫雷游戏

    初学Java,写了一个扫雷代码来锻炼一下自己的代码能力. 一.代码思路 代码思路很重要,如果事先就想好了代码思路,那么写这一个代码肯定是事半功倍,比在哪里瞎打要强不知道多少. 经过思考,觉得可以创建一个二维数组来记录情况 未翻开的牌:(统一显示 █ ) 数组的值 代表 -1 雷 0 旁边没有雷 1 旁边有一个雷 以此类推 翻开的牌则: if(a[x][y] == 9) System.out.print("?"); if(a[x][y] == 10) System.out.print(&

  • java实现简单扫雷小游戏

    本文实例为大家分享了java实现扫雷游戏的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event

  • Java Swing实现扫雷小游戏

    swing设计扫雷心得,供大家参考,具体内容如下 最近学习swing学习之余做了一个小游戏:扫雷 1.前期设计 2.实现 其实完成这个游戏的核心就在于对数组的操纵,下面贴主要代码Main.java: package first; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.

  • java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.

  • Java语言实现的扫雷游戏(1)

    Java类库中提供了用于GUI的swing开发工具包,我们可以利用swing设计出一些简单的经典小游戏,如扫雷,推箱子,俄罗斯方块等.接下来我就简单分享一下用Java设计扫雷游戏的思路与过程. 首先,我们要设计出扫雷的窗口界面,说白了,也就是在窗口上绘制出指定行数和列数的小方格.要在窗体上绘制方格,我们需要一个JPanel面板,所以我们定义类GamePanel让它继承自JPanel,然后我们在就可以这个类上绘制我们所要的信息了.然后,在类中,我们定义一些基本的变量,如行数,列数,雷的数量等等,方

随机推荐