在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