使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】

简介: 这篇文章介绍了使用Java语言和Swing框架实现的扫雷小游戏的详细代码和实现过程。

代码

package com.atguigu.java4;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/20 14:55
 * @Description:
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

class MineSweeper extends JFrame { private JButton[][] buttons; private int[][] mines; private int[][] counts; private int row; private int col; private int mineNum; private int count; private boolean isGameOver;

    public MineSweeper(int row, int col, int mineNum) {
        this.row = row;
        this.col = col;
        this.mineNum = mineNum;
        this.count = 0;
        this.isGameOver = false;
        this.buttons = new JButton[row][col];
        this.mines = new int[row][col];
        this.counts = new int[row][col];
        initMines();
        initCounts();
        initFrame();
    }

    private void initMines() {
        Random random = new Random();
        int num = 0;
        while (num < mineNum) {
            int x = random.nextInt(row);
            int y = random.nextInt(col);
            if (mines[x][y] == 0) {
                mines[x][y] = 1;
                num++;
            }
        }
    }

    private void initCounts() {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (mines[i][j] == 1) {
                    counts[i][j] = -1;
                } else {
                    int count = 0;
                    if (i > 0 && j > 0 && mines[i - 1][j - 1] == 1) {
                        count++;
                    }
                    if (i > 0 && mines[i - 1][j] == 1) {
                        count++;
                    }
                    if (i > 0 && j < col - 1 && mines[i - 1][j + 1] == 1) {
                        count++;
                    }
                    if (j > 0 && mines[i][j - 1] == 1) {
                        count++;
                    }
                    if (j < col - 1 && mines[i][j + 1] == 1) {
                        count++;
                    }
                    if (i < row - 1 && j > 0 && mines[i + 1][j - 1] == 1) {
                        count++;
                    }
                    if (i < row - 1 && mines[i + 1][j] == 1) {
                        count++;
                    }
                    if (i < row - 1 && j < col - 1 && mines[i + 1][j + 1] == 1) {
                        count++;
                    }
                    counts[i][j] = count;
                }
            }
        }
    }

    private void initFrame() {
        this.setTitle("扫雷");
        this.setSize(col * 50, row * 50);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new GridLayout(row, col));
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                buttons[i][j] = new JButton();
                buttons[i][j].setBackground(Color.GRAY);
                buttons[i][j].addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JButton button = (JButton) e.getSource();
                        int x = 0;
                        int y = 0;
                        for (int i = 0; i < row; i++) {
                            for (int j = 0; j < col; j++) {
                                if (buttons[i][j] == button) {
                                    x = i;
                                    y = j;
                                    break;
                                }
                            }
                        }
                        if (mines[x][y] == 1) {
                            button.setBackground(Color.RED);
                            isGameOver = true;
                        } else {
                            button.setText(String.valueOf(counts[x][y]));
                            button.setEnabled(false);
                            count++;
                        }
                        if (count == row * col - mineNum) {
                            JOptionPane.showMessageDialog(null, "恭喜你,你赢了!");
                            isGameOver = true;
                        }
                        if (isGameOver) {
                            for (int i = 0; i < row; i++) {
                                for (int j = 0; j < col; j++) {
                                    if (mines[i][j] == 1) {
                                        buttons[i][j].setBackground(Color.RED);
                                    }
                                    buttons[i][j].setEnabled(false);
                                }
                            }
                        }
                    }
                });
                this.add(buttons[i][j]);
            }
        }
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new MineSweeper(10, 10, 10);
    }
}

测试

踩到雷会爆红

在这里插入图片描述

相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
25天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
52 2
|
25天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
101 2
|
1月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
75 1
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
20天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
57 10
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别