java扫雷游戏代码注释
时间: 2023-07-09 13:35:43 浏览: 136
以下是一个简单的Java扫雷游戏代码,带有注释:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Minesweeper implements ActionListener, MouseListener {
private JFrame window; // 游戏窗口
private JButton[][] grid; // 扫雷网格
private int[][] values; // 网格每个方格的值
private boolean[][] revealed; // 网格每个方格是否被翻开
private boolean[][] flagged; // 网格每个方格是否被标记为地雷
private int remaining; // 剩余未揭露的方格数量
private final int ROWS = 10; // 网格的行数
private final int COLUMNS = 10; // 网格的列数
private final int MINES = 10; // 地雷的数量
public Minesweeper() {
window = new JFrame("Minesweeper");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个网格布局并添加到窗口
JPanel panel = new JPanel(new GridLayout(ROWS, COLUMNS));
window.add(panel);
// 初始化网格和值数组
grid = new JButton[ROWS][COLUMNS];
values = new int[ROWS][COLUMNS];
revealed = new boolean[ROWS][COLUMNS];
flagged = new boolean[ROWS][COLUMNS];
// 初始化网格中每个方格的按钮和值
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLUMNS; c++) {
grid[r][c] = new JButton();
grid[r][c].addActionListener(this);
grid[r][c].addMouseListener(this);
panel.add(grid[r][c]);
values[r][c] = 0;
revealed[r][c] = false;
flagged[r][c] = false;
}
}
// 布置地雷
int minesPlaced = 0;
while (minesPlaced < MINES) {
int r = (int) (Math.random() * ROWS);
int c = (int) (Math.random() * COLUMNS);
if (values[r][c] != -1) {
values[r][c] = -1;
minesPlaced++;
}
}
// 计算每个方格周围的地雷数量并存储在值数组中
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLUMNS; c++) {
if (values[r][c] == -1) {
continue;
}
int count = 0;
if (r > 0 && c > 0 && values[r - 1][c - 1] == -1) {
count++;
}
if (r > 0 && values[r - 1][c] == -1) {
count++;
}
if (r > 0 && c < COLUMNS - 1 && values[r - 1][c + 1] == -1) {
count++;
}
if (c > 0 && values[r][c - 1] == -1) {
count++;
}
if (c < COLUMNS - 1 && values[r][c + 1] == -1) {
count++;
}
if (r < ROWS - 1 && c > 0 && values[r + 1][c - 1] == -1) {
count++;
}
if (r < ROWS - 1 && values[r + 1][c] == -1) {
count++;
}
if (r < ROWS - 1 && c < COLUMNS - 1 && values[r + 1][c + 1] == -1) {
count++;
}
values[r][c] = count;
}
}
// 设置窗口大小并显示
window.setSize(500, 500);
window.setVisible(true);
// 初始化剩余未揭露的方格数量
remaining = ROWS * COLUMNS - MINES;
}
// 处理按钮点击事件
public void actionPerformed(ActionEvent e) {
JButton source = (JButton) e.getSource();
int row = -1;
int column = -1;
// 找到被点击的按钮在网格中的行列
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLUMNS; c++) {
if (grid[r][c] == source) {
row = r;
column = c;
break;
}
}
}
// 如果方格已经被揭开或标记为地雷,则不进行任何操作
if (revealed[row][column] || flagged[row][column]) {
return;
}
// 揭开方格
revealed[row][column] = true;
remaining--;
// 如果揭开的方格是地雷,则游戏结束
if (values[row][column] == -1) {
source.setText("X");
JOptionPane.showMessageDialog(window, "You lose!");
System.exit(0);
} else {
// 显示该方格周围的地雷数量
source.setText(Integer.toString(values[row][column]));
// 如果揭开的方格周围没有地雷,则揭开周围的方格
if (values[row][column] == 0) {
revealNeighbors(row, column);
}
// 如果所有非地雷方格都被揭开,则游戏胜利
if (remaining == 0) {
JOptionPane.showMessageDialog(window, "You win!");
System.exit(0);
}
}
}
// 处理鼠标右键点击事件
public void mousePressed(MouseEvent e) {
JButton source = (JButton) e.getSource();
int row = -1;
int column = -1;
// 找到被点击的按钮在网格中的行列
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLUMNS; c++) {
if (grid[r][c] == source) {
row = r;
column = c;
break;
}
}
}
// 如果方格已经被揭开,则不进行任何操作
if (revealed[row][column]) {
return;
}
// 如果方格已经被标记为地雷,则取消标记并更新剩余未标记的地雷数量
if (flagged[row][column]) {
flagged[row][column] = false;
source.setText("");
remaining++;
} else {
// 否则将方格标记为地雷并更新剩余未标记的地雷数量
flagged[row][column] = true;
source.setText("F");
remaining--;
}
}
// 显示指定方格周围的方格
private void revealNeighbors(int row, int column) {
if (row > 0 && column > 0 && !revealed[row - 1][column - 1]) {
grid[row - 1][column - 1].doClick();
}
if (row > 0 && !revealed[row - 1][column]) {
grid[row - 1][column].doClick();
}
if (row > 0 && column < COLUMNS - 1 && !revealed[row - 1][column + 1]) {
grid[row - 1][column + 1].doClick();
}
if (column > 0 && !revealed[row][column - 1]) {
grid[row][column - 1].doClick();
}
if (column < COLUMNS - 1 && !revealed[row][column + 1]) {
grid[row][column + 1].doClick();
}
if (row < ROWS - 1 && column > 0 && !revealed[row + 1][column - 1]) {
grid[row + 1][column - 1].doClick();
}
if (row < ROWS - 1 && !revealed[row + 1][column]) {
grid[row + 1][column].doClick();
}
if (row < ROWS - 1 && column < COLUMNS - 1 && !revealed[row + 1][column + 1]) {
grid[row + 1][column + 1].doClick();
}
}
// 未使用的事件处理方法
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public static void main(String[] args) {
new Minesweeper();
}
}
```
注释解释了每个类、变量、方法和语句的作用和用法。该代码使用Swing库创建了一个简单的GUI界面,并实现了扫雷游戏的主要功能,包括布置地雷、揭开方格、标记地雷和游戏结束判断等。
阅读全文