我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用java实现扫雷游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用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.最终游戏界面

总结

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用java实现扫雷游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用java实现扫雷游戏

这篇文章主要介绍“怎么用java实现扫雷游戏”,在日常操作中,相信很多人在怎么用java实现扫雷游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用java实现扫雷游戏”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

如何使用Java实现扫雷小游戏

这篇文章主要介绍“如何使用Java实现扫雷小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Java实现扫雷小游戏”文章能帮助大家解决问题。效果展示主类:GameWin类package c
2023-06-30

java如何实现扫雷游戏程序

本篇内容介绍了“java如何实现扫雷游戏程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分析:1.首先布一个10*10的雷阵,即二维数组m
2023-07-01

Easyx如何实现扫雷游戏

今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。代码:#include#include
2023-06-26

C#如何实现扫雷游戏

今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:1、掌握c#窗体和控件
2023-07-02

J2ME怎么实现扫雷游戏

这篇文章主要介绍“J2ME怎么实现扫雷游戏”,在日常操作中,相信很多人在J2ME怎么实现扫雷游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”J2ME怎么实现扫雷游戏”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录