资料地址:https://cowtransfer.com/s/4573fe572f9c4a
项目效果:
练习编程逻辑思维,提高和锻炼自己能力。
一. 绘制游戏界面
1.1窗体绘制
第一个方法:initFrame(),用于窗体的基本设置
public void initFrame() {
this.setSize(960,565); //设置窗体宽和高
this.setTitle(“动漫拼图”); //设置窗体标题
this.setLocationRelativeTo(null);//设置窗体居中
this.setDefaultCloseOperation(3);//设置窗体关闭时退出应用程序
this.setAlwaysOnTop(true); //设置窗体位于其他窗口之上
this.setLayout(null); //取消窗体默认布局
}
第二个方法:setVisible(true),用于设置窗体可见
this.setVisible(true);//设置窗体可见
1.2窗体上组件绘制
一部分:绘制图片标题
//标题图片
JLabel titleLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\title.png”));
titleLabel.setBounds(354,27,232,57);
this.add(titleLabel);
二部分:创建面板绘制拼图成功图片
//定义二维数组,存储图片编号
int[][] datas = {{1,2,3,4}, {5,6,7,8},{9,10,11,12},{13,14,15,16}};
//创建面板
JPanel 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 imageLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\”+datas[i][j]+“.png”));
imageLabel.setBounds(j90,i90,90,90);
imagePanel.add(imageLabel);
}
}
this.add(imagePanel);
三部分:创建面板绘制拼图成功图片
//动漫参照图[JLabel]
canzhaotu.png -> 574,114,122,121
//上下左右,求助,重置按钮添加[JButton]
{“shang.png”,“zuo.png”,“xia.png”,“you.png”,“qiuzhu.png”,“chongzhi.png”}
{{732,265,57,57},{650,347,57,57},{732,347,57,57},{813,347,57,57},{626,444,108,45},{786,444,108,45}}
//背景图[JLabel]
background.png->0,0,960,530
二. 图片打乱并记录0号图片的位置
Random r = new Random();
int x0;
int y0;
for(int i=0; i<datas.length;i++){
for(int j=0;j<datas[i];j++){
int x = r.nextInt(datas.length);
int y = r.nextInt(datas[i].length);
int tmp = datas[i][j];
datas[i][j] = datas[x][y];
datas[x][y] = tmp;
if(tmp==0){
x0 = x;
y0 = y
}
}
}
三. 给按钮注册事件
JButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
四. 移动业务实现
重新绘制图形
public void rePaintView() {
//移除容器上的组件
imagePanel.removeAll();
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 imageLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\” + datas[i][j] + “.png”));
imageLabel.setBounds(j * 90, i * 90, 90, 90);
imagePanel.add(imageLabel);
}
}
this.add(imagePanel);
//重新绘制
imagePanel.repaint();
}
上移动规则:空白图片,和下方元素,进行交换
边界处理:当x0=3,不能进行上移
空白图片坐标: datas[x0][y0]
空白图片下方元素坐标:datas[x0+1][y0]
移动的规则:
datas[x0][y0] = datas[x0+1][y0];
datas[x0+1][y0] = 0;
x0 = x0 + 1;
编写重绘方法:rePaintView()
调用重绘方法
左移动规则:
边界:y0=3
datas[x0][y0] = datas[x0][y0+1];
datas[x0][y0+1] = 0;
y0 = y0 + 1;
下移动规则:
边界:x0=0
datas[x0][y0] = datas[x0-1][y0];
datas[x0-1][y0] = 0;
x0 = x0-1;
右移动规则:
边界:y0=0
datas[x0][y0] = datas[x0][y0-1];
datas[x0][y0-1] = 0;
y0 = y0 - 1;
判断移动是否成功:
//定义成功数组
int[][] winDatas = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
//判断二维数组中的元素是否相同
public boolean isSuccess() {
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
if(datas[i][j] != winDatas[i][j]) {
return false;
}
}
}
return true;
}
五. 求助业务实现
datas = new int[][] { {1,2,3,4},{5,6,7,8},{9,10,11,12}, {13,14,15,16}};
shangButton.setEnabled(false);
zuoButton.setEnabled(false);
xiaButton.setEnabled(false);
youButton.setEnabled(false);
rePaintView();
六. 重置业务实现