java面向对象之简单的九宫格拼图实现

需要准备8张大小相等的图片,命名并修改图片存放位置

话不多说,先上代码

1.GamePanel类

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class GamePanel extends JPanel implements MouseListener {
    private Cell[] cells = new Cell[9]; // 存储九个格子的数组
    private Cell cellBlank = null; // 空白格子

    public GamePanel() {
        super();
        setLayout(null);
        init(); // 初始化游戏面板
    }

    private void init() {
        int num = 0;
        Icon icon = null;
        Cell cell = null;
        for (int i = 0; i < 3; i++) { // 行
            for (int j = 0; j < 3; j++) { // 列
                num = i * 3 + j; // 计算格子的数字
                icon = new ImageIcon("D:\\UserData\\lenovo\\Desktop\\img\\" + (num + 1) + ".jpg"); // 加载格子的图片
                cell = new Cell(icon, num); // 创建格子对象
                cell.setLocation(j * Cell.IMAGEWIDTH, i * Cell.IMAGEWIDTH); // 设置格子的位置
                cells[num] = cell; // 将格子添加到数组中
            }
        }
        for (int i = 0; i < cells.length; i++) { // 将所有格子添加到面板中
            this.add(cells[i]);
        }
    }

    public void random() {
        Random rand = new Random();
        int m, n, x, y;
        if (cellBlank == null) { // 如果空白格子为空,说明是第一次随机排列格子
            cellBlank = cells[cells.length - 1]; // 将最后一个格子设为空白格子
            for (int i = 0; i < cells.length; i++) {
                if (i != cells.length - 1) {
                    cells[i].addMouseListener(this); // 为非空白格子添加鼠标监听器
                }
            }
        }
        for (int i = 0; i < cells.length; i++) { // 随机交换格子的位置
            m = rand.nextInt(cells.length);
            n = rand.nextInt(cells.length);
            x = cells[m].getX();
            y = cells[m].getY();
            cells[m].setLocation(cells[n].getX(), cells[n].getY());
            cells[n].setLocation(x, y);
        }
    }

    public boolean isSuccess() {
        for (int i = 0; i < cells.length; i++) {
            int x = cells[i].getX();
            int y = cells[i].getY();
            if (i != 0) {
                if (y / Cell.IMAGEWIDTH * 3 + x / Cell.IMAGEWIDTH != cells[i].getPlace()) // 判断格子是否按照正确的顺序排列
                    return false;
            }
        }
        return true;
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {
        Cell cell = (Cell) e.getSource(); // 获取被点击的格子
        int x = cellBlank.getX();
        int y = cellBlank.getY();
        if ((x - cell.getX()) == Cell.IMAGEWIDTH && cell.getY() == y) { // 判断被点击的格子是否与空白格子相邻并且在右边
            cell.move(Direction.RIGHT); // 移动格子至空白格子的位置
            cellBlank.move(Direction.LEFT); // 移动空白格子至被点击的格子的位置
        } else if ((x - cell.getX()) == -Cell.IMAGEWIDTH && cell.getY() == y) { // 判断被点击的格子是否与空白格子相邻并且在左边
            cellBlank.move(Direction.RIGHT);
            cell.move(Direction.LEFT);
        } else if ((cell.getY() - y) == Cell.IMAGEWIDTH && cell.getX() == x) { // 判断被点击的格子是否与空白格子相邻并且在下边
            cellBlank.move(Direction.DOWN);
            cell.move(Direction.UP);
        } else if ((cell.getY() - y) == -Cell.IMAGEWIDTH && cell.getX() == x) { // 判断被点击的格子是否与空白格子相邻并且在上边
            cellBlank.move(Direction.UP);
            cell.move(Direction.DOWN);
        }
        if (isSuccess()) { // 如果成功拼图完成
            int i = JOptionPane.showConfirmDialog(this, "成功,再来一局?", "拼图成功", JOptionPane.YES_NO_OPTION); // 弹出对话框询问是否再来一局
            if (i == JOptionPane.YES_OPTION) {
                random(); // 重新随机排列格子
            }
        }
    }
    public void reset() {
        for (int i = 0; i < cells.length; i++) {
            Cell cell = cells[i];
            int row = i / 3;
            int col = i % 3;
            int x = col * Cell.IMAGEWIDTH;
            int y = row * Cell.IMAGEWIDTH;
            cell.setLocation(x, y);
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

2.Cell类

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

public class Cell extends JButton {
    public static final int IMAGEWIDTH = 117; // 格子图片的宽度
    private int place; // 格子的数字

    public Cell(Icon icon, int place) {
        this.setSize(IMAGEWIDTH, IMAGEWIDTH); // 设置格子按钮的大小
        this.setIcon(icon); // 设置格子按钮的图片
        this.place = place; // 设置格子的数字
    }

    public void move(Direction dir) { // 移动格子的方法
        Rectangle rec = this.getBounds();
        switch (dir) {
            case UP:
                this.setLocation(rec.x, rec.y - IMAGEWIDTH); // 向上移动一个格子的距离
                break;
            case DOWN:
                this.setLocation(rec.x, rec.y + IMAGEWIDTH); // 向下移动一个格子的距离
                break;
            case LEFT:
                this.setLocation(rec.x - IMAGEWIDTH, rec.y); // 向左移动一个格子的距离
                break;
            case RIGHT:
                this.setLocation(rec.x + IMAGEWIDTH, rec.y); // 向右移动一个格子的距离
                break;
        }
    }

    public int getX() {
        return this.getBounds().x; // 获取格子按钮的横坐标
    }

    public int getY() {
        return this.getBounds().y; // 获取格子按钮的纵坐标
    }

    public int getPlace() {
        return place; // 获取格子的数字4932
    }
}

3.Direction类(用来定义四个方向)

public enum Direction {
    UP, DOWN, RIGHT, LEFT; // 定义四个方向:上、下、右、左
}

4.MainFrame类(主类)

import com.sun.tools.javac.Main;

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

public class MainFrame extends JFrame {
    public MainFrame() throws HeadlessException {
        getContentPane().setLayout(new BorderLayout());
        setTitle("拼图游戏");
        setBounds(300, 300, 358, 414);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        final JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.NORTH);
        final GamePanel gamePanel = new GamePanel();
        getContentPane().add(gamePanel, BorderLayout.CENTER);
        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gamePanel.random(); // 点击按钮开始游戏,随机排列格子
            }
        });
        button.setText("开始");
        panel.add(button);
	// 添加“重置”按钮
        final JButton resetButton = new JButton("重置");
        resetButton.addActionListener(new ActionListener() {
        	public void actionPerformed(ActionEvent e) {
        		gamePanel.reset(); // 将拼图还原成最初的模样
        	}
    });
    panel.add(resetButton);
}


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

此程序是一个拼图游戏的简单实现。程序包括了几个主要的类:

MainFrame 类:继承自 JFrame,是程序的主窗口,包含了游戏面板和开始按钮。

GamePanel 类:继承自 JPanel,表示拼图的游戏面板,包含了九个格子对象,并实现了对格子的随机排列和移动操作,以及判断是否完成拼图的方法。

Cell 类:继承自 JButton,表示每个拼图的格子,包含了格子的图片和位置信息,并实现了格子的移动方法。

Direction 类:表示格子移动的方向,包括上、下、左、右四个方向。

主要逻辑是在 GamePanel 中,通过随机排列格子,并且监听玩家的鼠标点击事件,实现拼图的移动和完成判断。MainFrame 则负责创建窗口并初始化游戏面板和开始按钮。

该程序实现了一个简单的拼图游戏,玩家可以通过点击按钮开始游戏,然后尝试移动格子以完成拼图,或点击重置按钮直接复原拼图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值