使用 Java 语言设计一个九宫格拼图小游戏

本示例使用 Java Swing 库来实现一个简单的九宫格拼图游戏。代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PuzzleGame extends JFrame implements ActionListener {
    private JPanel puzzlePanel;
    private JButton[][] puzzleButtons;
    private JButton shuffleButton;
    private ImageIcon[][] puzzleImages;
    private ImageIcon blankImage;
    private int blankRow;
    private int blankCol;
    private int moves;

    public PuzzleGame() {
        super('Puzzle Game');

        // 初始化拼图面板
        puzzlePanel = new JPanel(new GridLayout(3, 3));
        puzzleButtons = new JButton[3][3];
        puzzleImages = new ImageIcon[3][3];
        blankImage = new ImageIcon('blank.png');
        blankRow = 2;
        blankCol = 2;
        moves = 0;

        // 创建拼图按钮并添加到拼图面板
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                puzzleImages[row][col] = new ImageIcon((row * 3 + col + 1) + '.png');
                puzzleButtons[row][col] = new JButton(puzzleImages[row][col]);
                puzzleButtons[row][col].addActionListener(this);
                puzzlePanel.add(puzzleButtons[row][col]);
            }
        }
        puzzleButtons[2][2].setIcon(blankImage);

        // 创建洗牌按钮
        shuffleButton = new JButton('Shuffle');
        shuffleButton.addActionListener(this);

        // 将组件添加到内容窗格
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(puzzlePanel, BorderLayout.CENTER);
        getContentPane().add(shuffleButton, BorderLayout.SOUTH);

        // 设置窗口属性
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setLocationRelativeTo(null); // 将窗口居中显示
        setResizable(false);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == shuffleButton) {
            shufflePuzzle();
            moves = 0;
        } else {
            JButton button = (JButton) e.getSource();
            int row = -1;
            int col = -1;
            // 查找被点击按钮的行和列
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (puzzleButtons[i][j] == button) {
                        row = i;
                        col = j;
                        break;
                    }
                }
            }
            // 检查是否可以移动被点击的按钮
            if ((row == blankRow && Math.abs(col - blankCol) == 1) ||
                    (col == blankCol && Math.abs(row - blankRow) == 1)) {
                // 将被点击的按钮与空白按钮交换
                puzzleButtons[blankRow][blankCol].setIcon(puzzleImages[row][col]);
                puzzleButtons[row][col].setIcon(blankImage);
                blankRow = row;
                blankCol = col;
                moves++;
                // 检查拼图是否已完成
                if (isPuzzleSolved()) {
                    JOptionPane.showMessageDialog(this, 'Congratulations! You solved the puzzle in ' + moves + ' moves!');
                }
            }
        }
    }

    private boolean isPuzzleSolved() {
        int expectedNumber = 1;
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                if (row == 2 && col == 2) {
                    return true; // 最后一个单元格应为空白
                }
                if (Integer.parseInt(puzzleImages[row][col].getDescription()) != expectedNumber) {
                    return false;
                }
                expectedNumber++;
            }
        }
        return true;
    }

    private void shufflePuzzle() {
        for (int i = 0; i < 100; i++) {
            int direction = (int) (Math.random() * 4); // 0 = 上,1 = 下,2 = 左,3 = 右
            int row = blankRow;
            int col = blankCol;
            switch (direction) {
                case 0:
                    row--;
                    break;
                case 1:
                    row++;
                    break;
                case 2:
                    col--;
                    break;
                case 3:
                    col++;
                    break;
            }
            if (row >= 0 && row <= 2 && col >= 0 && col <= 2) {
                puzzleButtons[blankRow][blankCol].setIcon(puzzleImages[row][col]);
                puzzleButtons[row][col].setIcon(blankImage);
                blankRow = row;
                blankCol = col;
            }
        }
    }

    public static void main(String[] args) {
        new PuzzleGame();
    }
}

在这个示例中,我们使用了 JPanel 对象来包含九宫格拼图的所有按钮。每个按钮都是一个 JButton 对象,它包含一个 ImageIcon 对象,代表当前按钮所显示的拼图块。我们使用了一个二维数组 puzzleButtons 来保存所有按钮对象,同时使用另一个二维数组 puzzleImages 来保存所有拼图块对象。我们还使用了一个 ImageIcon 对象 blankImage 来代表空白块。

在游戏开始时,我们将所有拼图块对象按照正确的顺序加载到 puzzleImages 数组中,然后将它们随机打乱并显示在 puzzleButtons 数组对应的按钮上。我们使用 shufflePuzzle() 方法来实现随机打乱拼图块的逻辑。该方法会随机选择一个方向(上、下、左、右)并尝试移动空白块。如果移动成功,则更新空白块的位置,否则不进行任何操作。

当玩家点击一个拼图块按钮时,我们检查该按钮是否可以移动。如果可以移动,则将它和空白块交换位置,并更新空白块的位置。每次移动完成后,我们都会检查当前的拼图是否已经完成。如果完成了,则弹出一个消息框,告诉玩家他们赢了。

isPuzzleSolved() 方法中,我们检查当前的拼图是否已经按照正确的顺序排列。如果是,则表示拼图已经完成。

最后,在 main() 方法中,我们创建一个 PuzzleGame 对象并显示它。这将启动游戏界面,并开始游戏。

说明:

  • 请确保将名为 'blank.png' 和 '1.png' 到 '9.png' 的图片文件放在项目的根目录下。
  • 可以根据需要修改图片文件名称和大小。
  • 该代码仅为示例,可以根据需要进行扩展和改进。

原文地址: https://www.cveoy.top/t/topic/nlX6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录