Java扫雷游戏代码示例:简单易懂的实现
由于扫雷游戏比较复杂,需要涉及到图形界面、用户交互、游戏逻辑等多个方面的知识,因此需要比较深厚的Java编程基础和相关技能才能完成。以下是一个简单的扫雷游戏的代码示例,供参考:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Minesweeper extends JFrame implements ActionListener, MouseListener {
private int width = 10; // 游戏宽度
private int height = 10; // 游戏高度
private int mines = 10; // 雷数
private int[][] board = new int[width][height]; // 游戏面板
private boolean[][] revealed = new boolean[width][height]; // 已揭开的方块
private boolean[][] flagged = new boolean[width][height]; // 标记的方块
private JButton[][] buttons = new JButton[width][height]; // 方块按钮
public Minesweeper() {
super('Minesweeper');
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
// 初始化游戏面板
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
board[i][j] = 0;
revealed[i][j] = false;
flagged[i][j] = false;
buttons[i][j] = new JButton();
buttons[i][j].setPreferredSize(new Dimension(20, 20));
buttons[i][j].addActionListener(this);
buttons[i][j].addMouseListener(this);
}
}
// 随机放置雷
int count = 0;
while (count < mines) {
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
if (board[x][y] != -1) {
board[x][y] = -1;
count++;
}
}
// 计算每个方块周围雷的数量
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (board[i][j] != -1) {
int countMines = 0;
for (int k = -1; k <= 1; k++) {
for (int l = -1; l <= 1; l++) {
if (i + k >= 0 && i + k < width && j + l >= 0 && j + l < height && board[i + k][j + l] == -1) {
countMines++;
}
}
}
board[i][j] = countMines;
}
}
}
// 添加方块按钮到窗口
JPanel panel = new JPanel(new GridLayout(width, height));
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
panel.add(buttons[i][j]);
}
}
getContentPane().add(panel);
// 显示窗口
pack();
setLocationRelativeTo(null);
setVisible(true);
}
// 处理方块按钮的点击事件
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
int x = -1, y = -1;
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (buttons[i][j] == button) {
x = i;
y = j;
break;
}
}
}
if (!flagged[x][y]) {
reveal(x, y);
checkWin();
}
}
// 处理方块按钮的鼠标事件
public void mousePressed(MouseEvent e) {
JButton button = (JButton) e.getSource();
int x = -1, y = -1;
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (buttons[i][j] == button) {
x = i;
y = j;
break;
}
}
}
if (SwingUtilities.isRightMouseButton(e)) {
flag(x, y);
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// 标记或取消标记方块
private void flag(int x, int y) {
if (!revealed[x][y]) {
flagged[x][y] = !flagged[x][y];
if (flagged[x][y]) {
buttons[x][y].setText('F');
} else {
buttons[x][y].setText('');
}
}
}
// 揭开方块
private void reveal(int x, int y) {
if (!revealed[x][y]) {
revealed[x][y] = true;
if (board[x][y] == -1) {
gameOver();
} else if (board[x][y] == 0) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (x + i >= 0 && x + i < width && y + j >= 0 && y + j < height) {
reveal(x + i, y + j);
}
}
}
} else {
buttons[x][y].setText(Integer.toString(board[x][y]));
}
}
}
// 检查是否获胜
private void checkWin() {
boolean win = true;
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (!revealed[i][j] && board[i][j] != -1) {
win = false;
break;
}
}
}
if (win) {
JOptionPane.showMessageDialog(this, 'You win!');
System.exit(0);
}
}
// 游戏失败
private void gameOver() {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (board[i][j] == -1) {
buttons[i][j].setText('*');
}
}
}
JOptionPane.showMessageDialog(this, 'Game over!');
System.exit(0);
}
public static void main(String[] args) {
new Minesweeper();
}
}
以上代码实现了一个简单的扫雷游戏,包括随机放置雷、计算每个方块周围的雷数、揭开方块、标记方块、检查获胜和游戏失败等功能。使用Java Swing库实现了图形界面,并处理了方块按钮的点击和鼠标事件。由于代码比较长,具体实现细节可以自行查看。
这个简单的扫雷游戏代码示例能帮助你快速上手Java图形界面编程和游戏逻辑设计。你可以根据自己的需求进行修改和扩展,例如增加难度级别、游戏音效等。希望这个示例对你有帮助。
原文地址: https://www.cveoy.top/t/topic/l4t5 著作权归作者所有。请勿转载和采集!