Java 九宫格拼图游戏:实现与代码示例
使用 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 著作权归作者所有。请勿转载和采集!