当前位置:首页 > 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个方向的地雷数量,将结果存入棋盘数组。

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);
            }
        }
    }
}

判断游戏胜负

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

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);

完整游戏流程

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

Java如何实现扫雷

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

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

分享给朋友:

相关文章

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element.add…

vue项目如何实现

vue项目如何实现

安装Vue.js 通过npm或yarn安装Vue.js。确保Node.js环境已配置完成。 npm install vue # 或 yarn add vue 创建Vue项目 使用Vue CLI工具快…

react如何实现录音

react如何实现录音

使用React实现录音功能 在React中实现录音功能通常需要借助浏览器的MediaRecorder API。以下是实现步骤: 获取用户麦克风权限 需要请求用户授权访问麦克风设备,使用navigat…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

vue如何实现uuid

vue如何实现uuid

生成 UUID 的方法 在 Vue 中生成 UUID 可以通过第三方库或原生 JavaScript 实现。以下是几种常见方法: 使用 uuid 库 安装 uuid 库: npm install u…