Java拼图

发布于:2023-01-10 ⋅ 阅读:(349) ⋅ 点赞:(0)

在App.java引用picPuzzle.java

PicPuzzle.java

package Project;

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

public class PictureFrame extends JFrame {
    // 继承自JFrame

    private int [][] datas = {
                    {1, 2, 3},
                    {4, 5, 6},
                    {7, 8, 0},
    };

    // 定义移动成功后的数组
    private int[][] winDatas = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 0}
    };

    // 定义x0, y0记录0号图片位置, 找到被打乱后0号图片的位置
    private int x0, y0;

    // 前方定义按钮
    private JButton upBtn;
    private JButton downBtn;
    private JButton leftBtn;
    private JButton rightBtn;
    private JButton help;
    private JButton restart;

    // 拼图面板部分
    private JPanel imagePanel;

    public PictureFrame() {
        // 生成窗体方法
        initFrame();
        // 打乱的是数组,然后将乱数组和顺序标号的图片一一对应
        disorganize();
        // 窗体内部组件
        paintView();
        // 按钮添加事件
        addButtonEvent();
        // 窗体可见, 已经继承了JFrame,可直接使用
        this.setVisible(true);
    }

    // 生成窗体方法
    public void initFrame() {
        // 宽高
        this.setSize(960, 565);
        // 名称
        this.setTitle("picPuzzle");
        // 位于中心
        this.setLocationRelativeTo(null);
        // 关闭后自动结束进程
        this.setDefaultCloseOperation(3);
        // 处于所有页面之上
        this.setAlwaysOnTop(true);
        // 删除默认格式
        this.setLayout(null);
    }

    // 窗体内部组件
    public void paintView() {
        // "picPuzzle"的图片标题
        JLabel titleLabel = new JLabel(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\titleLabel.png"));
        titleLabel.setBounds(354, 27, 232, 57);
        this.add(titleLabel);

//        // 二维数组储存图片编号
//        int [][] datas = {
//                {1, 2, 3},
//                {4, 5, 6},
//                {7, 8, 9},
//        };

        // 创建拼图面板
        imagePanel = new JPanel();
        imagePanel.setBounds(150, 114, 360, 360);
        imagePanel.setLayout(null); // 取消面板本身默认布局

        for (int i = 0; i < datas.length; i ++) {
            for (int j = 0; j < datas[i].length; j ++) {
                // 遍历二维数组,得到每一个图片编号
                // 图片绑定到对应的JLabel上
                JLabel imageLabel = new JLabel(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\" + datas[i][j] + ".png"));
                // 调整图片位置
                imageLabel.setBounds(j*120, i*120, 120, 120);
                // 挨个把图片添加到面板上
                imagePanel.add(imageLabel);
            }
        }
        this.add(imagePanel);

        // 参照图
        JLabel picConsult = new JLabel(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\picConsult.png"));
        picConsult.setBounds(574, 114, 122, 121);
        this.add(picConsult);

        // 上下左右,求助,重置按钮
        upBtn = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\btn_up.png"));
        upBtn.setBounds(732, 265, 57, 57);
        this.add(upBtn);

        downBtn = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\btn_down.png"));
        downBtn.setBounds(732, 347, 57, 57);
        this.add(downBtn);

        leftBtn = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\btn_left.png"));
        leftBtn.setBounds(650, 347, 57, 57);
        this.add(leftBtn);

        rightBtn = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\btn_right.png"));
        rightBtn.setBounds(813, 347, 57, 57);
        this.add(rightBtn);

        help = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\help.png"));
        help.setBounds(626, 444, 108, 45);
        this.add(help);

        restart = new JButton(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\restart.png"));
        restart.setBounds(785, 444, 108, 45);
        this.add(restart);

        // 现实背景
        JLabel bgc = new JLabel(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\bgc.png"));
        bgc.setBounds(0, 0, 960, 530);
        this.add(bgc);
    }

    // 打乱图片
    public void disorganize() {
        Random r = new Random();
        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                int x = r.nextInt(datas.length);
                int y = r.nextInt(datas[i].length);

                int temp = datas[x][y];
                datas[x][y] = datas[i][j];
                datas[i][j] = temp;
            }
        }

        // 给循环起名字
        outside:for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas.length; j++) {
                if (datas[i][j] == 0) {
                    x0 = i;
                    y0 = j;
                    // 找到了就可以选择退出循环, 在C语言我会在此设置flag来退出两个循环
                    // Java中我们可以给循环起名字,有更简洁高效的解决方法
                    break outside;
                }
            }
        }
    }

    // 按钮添加事件
    public void addButtonEvent() {
        upBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 不能再向上
                if (x0 == 0) return;

                // 交换实现移动效果
                datas[x0][y0] = datas[x0-1][y0];
                datas[x0-1][y0] = 0;
                x0 -= 1;

                rePaintView();
                if (isSuccess()) success();
            }
        });

        downBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 不能再向下
                if (x0 == 3) return;

                datas[x0][y0] = datas[x0+1][y0];
                datas[x0+1][y0] = 0;
                x0 += 1;

                rePaintView();
                if (isSuccess()) success();
            }
        });

        leftBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if (y0 == 0) return;

                datas[x0][y0] = datas[x0][y0-1];
                datas[x0][y0-1] = 0;
                y0 -= 1;

                rePaintView();
                if (isSuccess()) success();
            }
        });

        rightBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if (y0 == 2) return;

                datas[x0][y0] = datas[x0][y0+1];
                datas[x0][y0+1] = 0;
                y0 += 1;

                rePaintView();
                if (isSuccess()) success();

            }
        });

        restart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                datas = new int[][] {
                        {1, 2, 3},
                        {4, 5, 6},
                        {7, 8, 0}
                };
                disorganize();
                rePaintView();
                upBtn.setEnabled(true);
                downBtn.setEnabled(true);
                leftBtn.setEnabled(true);
                rightBtn.setEnabled(true);
            }
        });

        help.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                success();
                rePaintView();
            }
        });
    }

    // 重绘
    public void rePaintView() {
        // 移除所有组件
        imagePanel.removeAll();

        for (int i = 0; i < datas.length; i ++) {
            for (int j = 0; j < datas[i].length; j ++) {
                // 遍历二维数组,得到每一个图片编号
                // 图片绑定到对应的JLabel上
                JLabel imageLabel = new JLabel(new ImageIcon("D:\\PROJECT\\B_houduan\\codeJava\\picPuzzle\\images\\Mikasa\\" + datas[i][j] + ".png"));
                // 调整图片位置
                imageLabel.setBounds(j*120, i*120, 120, 120);
                // 挨个把图片添加到面板上
                imagePanel.add(imageLabel);
            }
        }
        this.add(imagePanel);

        // 重绘窗体
        imagePanel.repaint();
    }

    // 自动恢复, 按键停用
    public void success() {
        datas = new int[][] {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };
        upBtn.setEnabled(false);
        downBtn.setEnabled(false);
        leftBtn.setEnabled(false);
        rightBtn.setEnabled(false);
        rePaintView();
    }

    // 判断移动是否成功
    public boolean isSuccess() {
        for (int i = 0; i < winDatas.length; i++) {
            for (int j = 0; j < winDatas[i].length; j++) {
                if (datas[i][j] != winDatas[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
}

App.java

package Project;

public class App {
    public static void main(String[] args) {
        PictureFrame pf = new PictureFrame();
    }
}

图片

0.png

1.png

2.png

3.png

4.png

5.png

                                                                          6.png

                                                                         7.png

                                                                         8.png 

9.png

                                                                   bgc.png

     

btn_down.png

 

btn_left.png

btn_right.png

btn_up.png

help.png

mikasa.png

picConsult.png

restart.png

picPuzzle.png


网站公告

今日签到

点亮在社区的每一天
去签到