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

Java Swing实现扫雷源码

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java Swing实现扫雷源码

本文实例为大家分享了Java Swing实现扫雷源码的具体代码,供大家参考,具体内容如下

先来看下效果

运行时只需要创建一个GameWindow的对象即可,可使用有参构造函数自定义雷区行列数及炸弹个数,也可使用无参构造函数设置默认值(小旗和炸弹的图标自己去找吧,我就不在这里放了)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.LinkedList;

public class GameWindow{

    private static Font labelFont = new Font("隶书",Font.BOLD,45);
    private static Font buttonFont = new Font("隶书",Font.CENTER_BASELINE,20);

    private static Icon flag = new ImageIcon("class="lazy" data-src/images/小旗.jpg");//小旗图标
    private static Icon bomb = new ImageIcon("class="lazy" data-src/images/炸弹.png");//炸弹图标

    private static int labelWeight = 30;//小方块(雷区)宽度
    private static int labelHeigth = 30;//小方块(雷区)高度
    private static int labelSpace = 1;//小方块(雷区)间距

    private static int scoreHeight = 50;//积分区域高度

    private static int[] x8 = {-1,-1,-1,0,0,1,1,1};//原坐标周围 8 个坐标的 x 值变化
    private static int[] y8 = {-1,0,1,-1,1,-1,0,1};//原坐标周围 8 个坐标的 y 值变化

    private static int[] x4 = {0,0,1,-1};//原坐标周围 4 个坐标的 x 值变化
    private static int[] y4 = {1,-1,0,0};//原坐标周围 4 个坐标的 x 值变化

    private JFrame frame;

    private int[][] data;//存储和炸弹位置有关数据,值为-1时表示炸弹
    private JLabel[][] labels;

    private JPanel mainPanel;//雷区主面板
    private JPanel scorePanel;//积分区域面板

    private JLabel areaLabel;//未扫雷区个数标签
    private JLabel bombLabel;//剩余地雷数标签

    private int width;//窗体宽度
    private int height;//窗体高度

    private int row;//行数
    private int column;//列数
    private int bombNum;//炸弹个数

    private int remainArea;//未扫雷区个数
    private int remainBomb;//剩余地雷数

    public GameWindow(int row,int column,int bombNum){
        frame = new JFrame("扫雷-洋仔小游戏");
        this.row = row;
        this.column = column;
        this.bombNum = bombNum;
        mainPanel = new JPanel();
        init();
    }

    public GameWindow(){
        this(10,10,20);
    }

    private void setWidthAndHeight(){
        width = labelWeight * column + (column + 1) * labelSpace;
        height = scoreHeight + labelHeigth * row + (row + 1) * labelSpace;
    }


    private void setBomb(){
        if(bombNum > row * column)
            throw new RuntimeException("炸弹数设置过多!");
        data = new int[row][column];
        int count = 0;
        while (count < bombNum){
            int r = (int)(Math.random() * row);
            int c = (int)(Math.random() * column);
            System.out.println("r = " + r + "\tc = " + c);

            if(data[r][c] == -1)
                continue;

            data[r][c] = -1;
            for(int i = 0; i < 8; i ++){
                int x = r + x8[i];
                int y = c + y8[i];
                if(x < 0 || x >= row || y < 0 || y >= column || data[x][y] == -1)
                    continue;
                data[r + x8[i]][c + y8[i]] ++;
            }
            count ++;
            System.out.println(count);
        }
    }

    private class ButtonListener extends MouseAdapter {

        private JButton button;
        private int r;
        private int w;
        private GameWindow window;
        private boolean disabled = true;

        public ButtonListener(JButton button,int r,int w,GameWindow window){
            this.button = button;
            this.r = r;
            this.w = w;
            this.window = window;
        }

        @Override
        public void mouseClicked(MouseEvent mouseEvent) {
            synchronized (window){
                if(!button.isEnabled())
                    return;
                if(mouseEvent.getButton() == MouseEvent.BUTTON3){
                    if(disabled) {
                        button.setIcon(flag);
                        data[r][w] -= 20;
                        remainBomb --;
                        remainArea --;
                    }
                    else {
                        button.setIcon(null);
                        data[r][w] += 20;
                        remainBomb ++;
                        remainArea ++;
                    }
                    disabled = !disabled;
                    bombLabel.setText("" + remainBomb);
                    areaLabel.setText("" + remainArea);
                    return;
                }
                if(!disabled)
                    return;

                int cnt = 1;
                button.setVisible(false);
                if(data[r][w] == -1){
                    gameOver();
//                    System.out.println("\n点到炸弹,全体按钮已禁用");
                    return;
                }
                LinkedList<int[]> stack = new LinkedList<>();
                stack.push(new int[]{r,w});
                data[r][w] = -1;
                while (stack.size() > 0){
                    int[] source = stack.pop();
                    for(int i = 0; i < 4; i ++){
                        int x = source[0] + x4[i];
                        int y = source[1] + y4[i];
                        if(x < 0 || x >= row || y < 0 || y >= column || data[x][y] < 0)
                            continue;
                        if(data[x][y] == 0)
                            stack.push(new int[]{x,y});
                        labels[x][y].getLabelFor().setVisible(false);
                        cnt ++;
                        data[x][y] = -1;
                    }
                }
                remainArea -= cnt;
                areaLabel.setText("" + remainArea);
                if(remainArea == remainBomb){
                    gameOver();
                }
            }
        }

    }

    private void gameOver(){
        for(JLabel[] ls : labels){
            for(JLabel l : ls){
                JButton button = (JButton) l.getLabelFor();
                button.setEnabled(false);
            }
        }
    }

    private void init(){
        setWidthAndHeight();

        frame.setBounds(380,100,width + 9,height + 32);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLayout(null);

        mainPanel.setBackground(Color.GRAY);
        mainPanel.setBounds(1,scoreHeight + 1,width,height);
        mainPanel.setLayout(null);

        scorePanel = new JPanel();
        scorePanel.setBounds(0,0,width,scoreHeight);
        scorePanel.setLayout(new GridLayout(1,3,0,0));

        areaLabel = new JLabel();

        areaLabel.setFont(labelFont);
        areaLabel.setHorizontalAlignment(JLabel.CENTER);
        scorePanel.add(areaLabel);

        JLabel buttonLabel = new JLabel();
        scorePanel.add(buttonLabel);

        JButton resetButton = new JButton("重开");
        resetButton.setFont(buttonFont);
        resetButton.setFocusPainted(false);
        resetButton.setBounds(width/ 24,10,width / 4,30);
        resetButton.addActionListener((event)->{
            frame.setVisible(false);
            mainPanel.removeAll();
            resetGame();
        });
        buttonLabel.add(resetButton);

        bombLabel = new JLabel();
        bombLabel.setFont(labelFont);
        bombLabel.setHorizontalAlignment(JLabel.CENTER);
        scorePanel.add(bombLabel);

        frame.add(scorePanel);
        frame.add(mainPanel);


        resetGame();
    }

    public void resetGame(){
        setBomb();
        remainArea = row * column;
        remainBomb = bombNum;

        labels = new JLabel[row][column];

        System.gc();

        for(int i = 0; i < row; i ++){
            for(int j = 0; j < column; j ++){
                labels[i][j] = new JLabel();
                //设置元素居中
                labels[i][j].setHorizontalAlignment(JLabel.CENTER);
                if(data[i][j] == -1) {
                    labels[i][j].setIcon(bomb);
                }
                else if(data[i][j] > 0)
                    labels[i][j].setText("" + data[i][j]);

                int y = (i + 1) * labelSpace + i * labelWeight;
                int x = (j + 1) * labelSpace + j * labelHeigth;
                labels[i][j].setBounds(x,y,labelWeight,labelHeigth);

                JButton button = new JButton();

                button.addMouseListener(new ButtonListener(button,i,j,this));
                button.setBounds(0,0,labelWeight,labelHeigth);
                labels[i][j].setLayout(null);
                labels[i][j].add(button);
                labels[i][j].setLabelFor(button);
                mainPanel.add(labels[i][j]);
            }
        }

        areaLabel.setText("" + remainArea);
        bombLabel.setText("" + remainBomb);

        frame.setVisible(true);
    }
}

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

免责声明:

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

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

Java Swing实现扫雷源码

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

下载Word文档

猜你喜欢

怎么在java中使用swing实现一个扫雷游戏

这篇文章给大家介绍怎么在java中使用swing实现一个扫雷游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。版本1:package awtDemo;import java.awt.event.ActionEvent;
2023-05-30

Python:游戏:扫雷(附源码)

这次我们基于 pygame 来做一个扫雷,上次有园友问我代码的 python 版本,我说明一下,我所有的代码都是基于 python 3.6 的。先看截图,仿照 XP 上的扫雷做的,感觉 XP 上的样式比 win7 上的好看多了。原谅我手残,
2023-01-30

红包扫雷APP源码开发

房间功能:  点击福袋:进入选大厅页面如:大厅1大厅2大厅3大厅4四个大厅选择,每个大厅4个房间按钮显示;发包最小金币到最大金币,倍数和发包数量规则。  例如:大厅1、20-100最少要发20最多只能发100个金币。倍数是1.1倍中雷者赔。
2023-06-02

怎么用java实现扫雷游戏

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

c语言扫雷小游戏源代码

这期内容当中小编将会给大家带来有关c语言扫雷小游戏源代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。说明:该游戏的实现需要建立三个文件test2.c:整个游戏,开始游戏/退出游戏的大体执行流程game2
2023-06-06

Android 实现扫雷小游戏实例代码

Android 实现扫雷小游戏实例 最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用, 以下是实现代码: MainActivity 类public class MainActivit
2022-06-06

java如何实现扫雷游戏程序

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

Java如何实现简单扫雷程序

本篇内容介绍了“Java如何实现简单扫雷程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!页面设置:框架是borderlayout,在上中下
2023-06-30

编程热搜

  • 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动态编译

目录