21xrx.com
2025-04-16 11:00:58 Wednesday
文章检索 我的文章 写文章
《Java经典游戏》教你制作扫雷小游戏
2023-06-16 15:25:24 深夜i     11     0
Java语言 扫雷小游戏 游戏制作

扫雷是一款经典的小游戏,在电脑上也有相应的版本。今天,我们来学习如何用Java语言制作一个属于自己的扫雷游戏吧!

首先,我们需要知道扫雷游戏的规则:在一个方格棋盘上,有长度和宽度确定的格子,里面隐藏着雷或者数字(代表周围的地雷数量)。玩家需要根据数字来猜测哪些方格里面有地雷,哪些是安全的。如果玩家猜错了地雷位置,游戏就会结束。如果玩家成功猜出所有的地雷位置,则游戏获胜。

接下来就是Java代码时间啦!我们可以用swing包来制作一个界面,包括开始游戏、查看排行榜和结束游戏等功能。我们还需要定义雷区类和游戏区类,其中雷区类要生成并记录雷的位置,游戏区类要实现鼠标点击事件。

下面是雷区类的代码:

import java.util.Random;
public class MineField {
  private int[][] mines;
  public MineField(int row, int col, int mineCount) {
    mines = new int[row][col];
    Random rand = new Random();
    int count = 0;
    while (count < mineCount) {
      int i = rand.nextInt(row);
      int j = rand.nextInt(col);
      if (mines[i][j] == 0) {
        mines[i][j] = -1;
        count++;
      }
    }
  }
  
  public int[][] getMines()
    return mines;
  
}

这个类包括了生成地雷位置的方法。我们用一个二维数组来保存地雷的位置,其中-1表示该位置有地雷。在构造方法中,我们会不停地随机生成一个位置,直到生成了足够数量的地雷。

下面是游戏区类的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GameArea extends JPanel {
  private int[][] mines;
  private int[][] board;
  private int rows, cols, minesCount;
  public GameArea(int rows, int cols, int minesCount) {
    this.rows = rows;
    this.cols = cols;
    this.minesCount = minesCount;
    setPreferredSize(new Dimension(rows * 20, cols * 20));
    setVisible(true);
    initGame();
    addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        int row = e.getY() / 20;
        int col = e.getX() / 20;
        if (SwingUtilities.isRightMouseButton(e)) {
          if (board[row][col] == 9) {
            board[row][col] = 11;
          } else if (board[row][col] == 11) {
            board[row][col] = 9;
          }
        } else {
          if (mines[row][col] == -1) {
            JOptionPane.showMessageDialog(null,"GameOver");
            initGame();
          } else if (board[row][col] == 9) {
            board[row][col] = mines[row][col] + 1;
            if (board[row][col] == 10) {
              if (checkWin()) {
                JOptionPane.showMessageDialog(null,"You Win!");
                initGame();
              }
            }
            repaint();
          }
        }
      }
    });
  }
  private boolean checkWin() {
    int count = 0;
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
        if (board[i][j] == 10) {
          count++;
        }
      }
    }
    return count == minesCount;
  }
  private void initGame() {
    MineField mineField = new MineField(rows, cols, minesCount);
    mines = mineField.getMines();
    board = new int[rows][cols];
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
        board[i][j] = 9;
      }
    }
    repaint();
  }
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
        if (board[i][j] == 9 || board[i][j] == 11) {
          g.setColor(Color.gray);
          g.fillRect(i * 20, j * 20, 20, 20);
        } else if (board[i][j] == 10) {
          g.setColor(Color.green);
          g.fillRect(i * 20, j * 20, 20, 20);
        } else {
          g.setColor(Color.white);
          g.fillRect(i * 20, j * 20, 20, 20);
          g.setColor(Color.black);
          if (mines[i][j] != 0) {
            g.drawString("" + (mines[i][j]), i * 20 + 5, j * 20 + 15);
          }
        }
      }
    }
  }
}

这个类包括了鼠标点击事件和游戏初始化的方法。我们用一个二维数组来记录游戏区每个位置的状态,初始状态为9,表示未翻开。右键点击表示标记有地雷的位置,左键点击会翻开该位置,如果该位置有地雷,则游戏结束,否则会显示周围地雷的数量。如果所有地雷位置都被标记,游戏获胜。

最后,我们只需要将两个类组装起来就可以了:

import javax.swing.*;
import java.awt.*;
public class MineSweeper extends JFrame {
  public MineSweeper() {
    setTitle("MineSweeper");
    setSize(300, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    JButton start = new JButton("Start");
    start.addActionListener(e -> showGame());
    buttonPanel.add(start);
    add(buttonPanel, BorderLayout.NORTH);
    setVisible(true);
  }
  private void showGame() {
    JFrame gameFrame = new JFrame();
    gameFrame.setTitle("MineSweeper");
    gameFrame.setSize(400,400);
    gameFrame.setLocationRelativeTo(null);
    gameFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    GameArea gameArea = new GameArea(10,10,10);
    gameFrame.setContentPane(gameArea);
    gameFrame.setVisible(true);
  }
  public static void main(String[] args) {
    new MineSweeper();
  }
}

这个类包括了主界面和开始按钮的功能,点击开始按钮会弹出游戏界面并开始游戏。

好了,代码已经介绍完毕。现在您可以试试自己动手编写一个Java版扫雷游戏了!

  
  

评论区

    相似文章
请求出错了