用Java语言设计一个扫雷游戏,可以通过下拉菜单设置扫雷难度,记录扫雷过程花费的时间,增加开始按钮控制扫雷的开始。写出完整代码
时间: 2024-03-25 21:37:19 浏览: 11
好的,以下是一个简单的Java语言设计扫雷游戏的示例代码:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class MineSweeper implements ActionListener {
private JFrame frame;
private JPanel panel;
private JLabel label;
private JButton[][] buttons;
private JMenuBar menuBar;
private JMenu levelMenu;
private JMenuItem beginnerItem, intermediateItem, advancedItem;
private int rows = 9, cols = 9, mines = 10;
private int[][] board;
private boolean[][] revealed;
private boolean[][] flagged;
private int time = 0;
private Timer timer;
private JButton startButton;
public MineSweeper() {
// 初始化游戏界面
frame = new JFrame("Mine Sweeper");
panel = new JPanel(new GridLayout(rows, cols));
label = new JLabel("Time: 0s");
buttons = new JButton[rows][cols];
board = new int[rows][cols];
revealed = new boolean[rows][cols];
flagged = new boolean[rows][cols];
timer = new Timer(1000, this);
startButton = new JButton("Start");
startButton.addActionListener(this);
// 初始化菜单栏
menuBar = new JMenuBar();
levelMenu = new JMenu("Level");
beginnerItem = new JMenuItem("Beginner");
intermediateItem = new JMenuItem("Intermediate");
advancedItem = new JMenuItem("Advanced");
beginnerItem.addActionListener(this);
intermediateItem.addActionListener(this);
advancedItem.addActionListener(this);
levelMenu.add(beginnerItem);
levelMenu.add(intermediateItem);
levelMenu.add(advancedItem);
menuBar.add(levelMenu);
frame.setJMenuBar(menuBar);
// 添加按钮到游戏界面
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
buttons[i][j] = new JButton();
buttons[i][j].addActionListener(this);
panel.add(buttons[i][j]);
}
}
// 添加组件到游戏界面
frame.add(panel, BorderLayout.CENTER);
frame.add(label, BorderLayout.NORTH);
frame.add(startButton, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
// 开始游戏
public void startGame() {
// 初始化游戏面板
panel.removeAll();
revealed = new boolean[rows][cols];
flagged = new boolean[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
buttons[i][j] = new JButton();
buttons[i][j].addActionListener(this);
panel.add(buttons[i][j]);
}
}
// 初始化游戏时间和地雷数量
time = 0;
label.setText("Time: " + time + "s");
mines = rows * cols / 10;
// 初始化游戏板块
Random rand = new Random();
for (int i = 0; i < mines; i++) {
int x = rand.nextInt(rows);
int y = rand.nextInt(cols);
if (board[x][y] == -1) {
i--;
} else {
board[x][y] = -1;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (x + dx >= 0 && x + dx < rows && y + dy >= 0 && y + dy < cols && board[x + dx][y + dy] != -1) {
board[x + dx][y + dy]++;
}
}
}
}
}
// 开始计时
timer.start();
}
// 点击按钮事件
public void actionPerformed(ActionEvent e) {
// 选择难度
if (e.getSource() == beginnerItem) {
rows = 9;
cols = 9;
startGame();
} else if (e.getSource() == intermediateItem) {
rows = 16;
cols = 16;
startGame();
} else if (e.getSource() == advancedItem) {
rows = 16;
cols = 30;
startGame();
}
// 开始游戏
else if (e.getSource() == startButton) {
startGame();
}
// 点击按钮
else {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (e.getSource() == buttons[i][j]) {
// 点击未翻开的格子
if (!revealed[i][j] && !flagged[i][j]) {
revealed[i][j] = true;
buttons[i][j].setEnabled(false);
// 点中地雷,游戏结束
if (board[i][j] == -1) {
timer.stop();
JOptionPane.showMessageDialog(frame, "Game Over!");
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
if (board[x][y] == -1) {
buttons[x][y].setText("X");
}
}
}
}
// 点中数字,显示数字
else if (board[i][j] > 0) {
buttons[i][j].setText(String.valueOf(board[i][j]));
}
// 点中空白,递归翻开周围的空白格子
else {
buttons[i][j].setText("");
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (i + dx >= 0 && i + dx < rows && j + dy >= 0 && j + dy < cols) {
actionPerformed(new ActionEvent(buttons[i + dx][j + dy], 0, ""));
}
}
}
}
}
// 右键点击标记或取消标记
else if (!revealed[i][j] && SwingUtilities.isRightMouseButton(e)) {
flagged[i][j] = !flagged[i][j];
if (flagged[i][j]) {
buttons[i][j].setText("F");
} else {
buttons[i][j].setText("");
}
}
}
}
}
}
// 更新游戏时间
if (timer.isRunning()) {
time++;
label.setText("Time: " + time + "s");
}
}
public static void main(String[] args) {
new MineSweeper();
}
}
```
以上代码是一个简单的扫雷游戏实现,您可以根据自己的需求进行修改和优化。