当前位置:首页 > Java

Java如何实现扫雷

2026-03-24 02:53:09Java

实现扫雷游戏的基本思路

扫雷游戏的核心逻辑包括生成地雷、计算周围地雷数、处理用户点击以及判断游戏胜负。以下是实现扫雷的关键步骤。

游戏初始化

创建一个二维数组表示游戏棋盘,初始化时所有格子为未打开状态。随机生成指定数量的地雷位置,确保不重复。

int[][] board = new int[rows][cols];
boolean[][] mines = new boolean[rows][cols];
Random random = new Random();

for (int i = 0; i < mineCount; i++) {
    int x = random.nextInt(rows);
    int y = random.nextInt(cols);
    if (!mines[x][y]) {
        mines[x][y] = true;
    } else {
        i--; // 重新生成
    }
}

计算周围地雷数量

遍历每个非地雷格子,统计周围8个方向的地雷数量,将结果存入棋盘数组。

Java如何实现扫雷

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        if (!mines[i][j]) {
            int count = 0;
            for (int dx = -1; dx <= 1; dx++) {
                for (int dy = -1; dy <= 1; dy++) {
                    int nx = i + dx, ny = j + dy;
                    if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && mines[nx][ny]) {
                        count++;
                    }
                }
            }
            board[i][j] = count;
        }
    }
}

处理用户点击

当用户点击格子时,如果是地雷则游戏结束。如果是空白格子(周围无地雷),则递归展开相邻空白区域。

void reveal(int x, int y) {
    if (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]) {
        return;
    }
    revealed[x][y] = true;
    if (mines[x][y]) {
        gameOver();
        return;
    }
    if (board[x][y] == 0) {
        for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                reveal(x + dx, y + dy);
            }
        }
    }
}

判断游戏胜负

检查所有非地雷格子是否均已揭开,或者标记的地雷数量与实际一致。

Java如何实现扫雷

boolean checkWin() {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (!mines[i][j] && !revealed[i][j]) {
                return false;
            }
        }
    }
    return true;
}

图形界面实现

使用Java Swing创建图形界面,绘制棋盘和处理鼠标事件。

JFrame frame = new JFrame("Minesweeper");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width, height);

JPanel panel = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 绘制棋盘逻辑
    }
};

panel.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX() / cellSize;
        int y = e.getY() / cellSize;
        if (e.getButton() == MouseEvent.BUTTON1) {
            reveal(x, y);
        } else if (e.getButton() == MouseEvent.BUTTON3) {
            flag(x, y); // 标记地雷
        }
        panel.repaint();
    }
});

frame.add(panel);
frame.setVisible(true);

完整游戏流程

初始化游戏后进入主循环,等待用户操作。每次操作后更新界面并检查游戏状态,直到游戏结束。

while (!gameOver && !gameWon) {
    // 等待用户输入
    if (checkWin()) {
        gameWon = true;
        showWinMessage();
    }
}

以上代码片段展示了Java实现扫雷游戏的核心逻辑,可根据需求进一步扩展功能如难度选择、计时器等。

分享给朋友:

相关文章

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现截图

vue如何实现截图

Vue 实现截图的方法 在 Vue 中实现截图功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 html2canvas 库 html2canvas 是一个流行的 JavaScript 库,…

vue如何实现ifream

vue如何实现ifream

Vue 中实现 iframe 的方法 在 Vue 中可以通过多种方式实现 iframe 的嵌入和控制。以下是几种常见的方法: 使用 HTML 原生 iframe 标签 在 Vue 模板中直接使用…

react如何实现keepalive

react如何实现keepalive

React 实现 KeepAlive 的方法 React 本身没有内置的 KeepAlive 组件,但可以通过以下方式模拟类似功能,实现组件状态保持或避免重复渲染。 使用 CSS 隐藏组件 通过 C…

java如何实现分布式

java如何实现分布式

分布式系统实现方式 Java实现分布式系统通常涉及多种技术和框架,以下是几种核心方法: 基于RPC框架 使用Dubbo、gRPC等RPC框架实现服务间的远程调用。Dubbo提供高性能的RPC通信,支…

vue如何实现cron

vue如何实现cron

Vue 中实现 Cron 表达式功能 在 Vue 项目中实现 Cron 表达式功能通常需要借助第三方库或自定义组件。以下是几种常见方法: 使用 vue-cron 组件 vue-cron 是一个专门为…