Java制作拼图小游戏——基础编程实战

拼图游戏是一种经典的益智游戏,玩家通过移动拼图块来还原一幅完整的图像。本文将通过Java语言实现一个简单的拼图游戏,从创建窗口、加载图片、切割拼图到游戏逻辑的实现,详细讲解代码流程与注释。

1. 项目准备

在开始之前,我们需要准备一些工具和环境:

  • JDK 1.8或以上
  • 一个Java开发环境,比如Eclipse或IntelliJ IDEA
  • 一幅适合拼图的图片

2. 创建基本窗口

首先,我们创建一个简单的窗口,作为游戏的主界面。以下代码片段展示了如何创建一个基本的Java Swing窗口:

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

public class PuzzleGame extends JFrame {

    public PuzzleGame() {
        setTitle("拼图游戏"); // 设置窗口标题
        setSize(600, 600); // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出
        setLocationRelativeTo(null); // 窗口居中
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PuzzleGame game = new PuzzleGame();
            game.setVisible(true); // 设置窗口可见
        });
    }
}

3. 载入与切割图片

接下来,我们需要载入一幅图片,并将其切割成多个小块。为了简单起见,我们这里以4x4的拼图为例。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PuzzleGame extends JFrame {
    private BufferedImage originalImage; // 原始图片
    private BufferedImage[][] pieces; // 拼图块
    private int rows = 4; // 行数
    private int cols = 4; // 列数

    public PuzzleGame() {
        // ... 窗口设置代码
        loadImage(); // 加载图片
        cutImage(); // 切割图片加载拼图块
    }

    private void loadImage() {
        try {
            originalImage = ImageIO.read(new File("path/to/your/image.jpg")); // 替换为你的图片路径
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void cutImage() {
        pieces = new BufferedImage[rows][cols]; // 初始化拼图块数组
        int pieceWidth = originalImage.getWidth() / cols; // 计算每个拼图块的宽度
        int pieceHeight = originalImage.getHeight() / rows; // 计算每个拼图块的高度

        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                // 使用getSubimage切割图片
                pieces[row][col] = originalImage.getSubimage(col * pieceWidth, row * pieceHeight, pieceWidth, pieceHeight);
            }
        }
    }
}

4. 绘制拼图块

我们需要重写paint方法来绘制拼图块。下面的代码显示如何将切割好的拼图块绘制到窗口上:

@Override
public void paint(Graphics g) {
    super.paint(g);
    // 绘制拼图块
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            g.drawImage(pieces[row][col], col * pieces[row][col].getWidth(), row * pieces[row][col].getHeight(), null);
        }
    }
}

5. 移动拼图块

最后,我们需要实现拼图块的移动逻辑。这一部分的代码相对复杂,但核心思想是使用鼠标事件来判断用户点击的拼图块,并交换它与空白块的位置。

private int emptyRow = rows - 1; // 空白块的行位置
private int emptyCol = cols - 1; // 空白块的列位置

// 鼠标点击事件
public PuzzleGame() {
    // ... 窗口设置代码
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            int x = e.getX() / (originalImage.getWidth() / cols);
            int y = e.getY() / (originalImage.getHeight() / rows);
            movePiece(x, y);
            repaint(); // 重新绘制拼图
        }
    });
}

private void movePiece(int x, int y) {
    // 检查点击的位置是否与空白块相邻
    if ((Math.abs(emptyRow - y) == 1 && emptyCol == x) || 
        (Math.abs(emptyCol - x) == 1 && emptyRow == y)) {
        // 交换拼图块
        BufferedImage temp = pieces[y][x];
        pieces[y][x] = pieces[emptyRow][emptyCol];
        pieces[emptyRow][emptyCol] = temp;

        // 更新空白块的位置
        emptyRow = y;
        emptyCol = x;
    }
}

6. 完整的代码

将上述所有片段组合在一起,就形成了一个简单的拼图游戏。完整示例代码如下:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PuzzleGame extends JFrame {
    private BufferedImage originalImage; // 原始图片
    private BufferedImage[][] pieces; // 拼图块
    private int rows = 4; // 行数
    private int cols = 4; // 列数
    private int emptyRow = rows - 1; // 空白块的行位置
    private int emptyCol = cols - 1; // 空白块的列位置

    public PuzzleGame() {
        setTitle("拼图游戏");
        setSize(600, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        loadImage();
        cutImage();

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                int x = e.getX() / (originalImage.getWidth() / cols);
                int y = e.getY() / (originalImage.getHeight() / rows);
                movePiece(x, y);
                repaint();
            }
        });
    }

    private void loadImage() {
        try {
            originalImage = ImageIO.read(new File("path/to/your/image.jpg")); // 替换为你的路径
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void cutImage() {
        pieces = new BufferedImage[rows][cols];
        int pieceWidth = originalImage.getWidth() / cols;
        int pieceHeight = originalImage.getHeight() / rows;

        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                pieces[row][col] = originalImage.getSubimage(col * pieceWidth, row * pieceHeight, pieceWidth, pieceHeight);
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                g.drawImage(pieces[row][col], col * pieces[row][col].getWidth(), row * pieces[row][col].getHeight(), null);
            }
        }
    }

    private void movePiece(int x, int y) {
        if ((Math.abs(emptyRow - y) == 1 && emptyCol == x) || 
            (Math.abs(emptyCol - x) == 1 && emptyRow == y)) {
            BufferedImage temp = pieces[y][x];
            pieces[y][x] = pieces[emptyRow][emptyCol];
            pieces[emptyRow][emptyCol] = temp;

            emptyRow = y;
            emptyCol = x;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PuzzleGame game = new PuzzleGame();
            game.setVisible(true);
        });
    }
}

结论

以上就是使用Java实现拼图小游戏的完整过程。通过设置窗口、加载与切割图片、绘制拼图块以及实现交互逻辑,我们完成了一个基础的拼图游戏。这个项目不仅是一个很好的编程练习,也为我们日后开发更复杂的游戏奠定了基础。在未来的项目中,你可以考虑增加时间倒计时、步数限制、随机打乱拼图等功能,以丰富游戏体验。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部