不解释,自行体会
package com.meilingluo.TXZ_1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class GameFrame extends JFrame {
private JPanel panel;
private JLabel box;//标签
private JLabel worker;
private JLabel goal;
private JLabel[] walls;
public GameFrame(String title) {
super(title);
super.setSize(22 * 48 + 12, 12 * 48 + 35);//12和35是标题和边框占的距离
super.setLocationRelativeTo(null);//让窗体居中
super.setResizable(false);//大小不可改
super.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭结束进程
initPanel();
box = initLable("box3.png", 3, 3);
goal = initLable("goal3.png", 7, 8);
worker = initLable("workerRight4.png", 10, 1);
initWalls();
addEvent();
}
void initPanel() {
panel = new JPanel();
panel.setBackground(Color.white);
panel.setLayout(null);
super.setContentPane(panel);//窗体和面板关联
}
JLabel initLable(String imgPath, int x, int y) {//向面板中添加标签,并返回添加的标签
JLabel label = null;
ImageIcon img = new ImageIcon("imgs/" + imgPath);
label = new JLabel(img);
panel.add(label);
label.setBounds(x * 48, y * 48, 48, 48);
return label;
}
void initWalls() {
ImageIcon wallImg = new ImageIcon("imgs/wall3.png");
walls = new JLabel[22 * 2 + 10 * 2 + 8 + 10];
for (int i = 0; i < walls.length; i++) {
walls[i] = new JLabel(wallImg);
}
int index = 0;//记录使用到数组中的那块瓷砖
//铺上下墙
for (int i = 0; i < 22; i++) {
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 0, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 11 * 48, 48, 48);
}
//铺左右墙
for (int i = 1; i <= 10; i++) {
panel.add(walls[index]);
walls[index++].setBounds(0, i * 48, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(21 * 48, i * 48, 48, 48);
}
for (int i = 0; i < 8; i++) {
panel.add(walls[index]);
walls[index++].setBounds((5 + i) * 48, 2 * 48, 48, 48);
}
for (int i = 0; i < 5; i++) {
panel.add(walls[index]);
walls[index++].setBounds((9 + i) * 48, (8 - i) * 48, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds((2 + i) * 48, (4 + i) * 48, 48, 48);
}
}
void addEvent() {
super.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int x = 0, y = 0;
String imgPath = "workerLeft4.png";
if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT) {
x = -48;
} else if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP) {
y = -48;
imgPath = "workerUp4.png";
} else if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN) {
y = 48;
imgPath = "workerDown4.png";
} else if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT) {
x = 48;
imgPath = "workerRight4.png";
}
worker.setBounds(worker.getBounds().x + x, worker.getBounds().y + y, 48, 48);
ImageIcon img = new ImageIcon("imgs/" + imgPath);
worker.setIcon(img);
//防止撞墙
for(int i=0;i<walls.length;i++){
//如果位置重合
if(worker.getBounds().contains(walls[i].getBounds())){
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
//柔柔推箱子
if(worker.getBounds().contains(box.getBounds())){
box.setBounds(box.getBounds().x+x,box.getBounds().y+y,48,48);
}
//防止箱子撞墙
for (int i = 0;i<walls.length;i++){
if(box.getBounds().contains(walls[i].getBounds())){
box.setBounds(box.getBounds().x-x,box.getBounds().y-y,48,48);
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
//输赢判断
if(box.getBounds().contains(goal.getBounds())){
JOptionPane.showMessageDialog(null,"赢了");
System.exit(0);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
}
package com.meilingluo.TXZ_1;
import javax.swing.*;
public class Run {
public static void main(String[] args) {
GameFrame gameFrame = new GameFrame("柔柔推箱子");
gameFrame.setVisible(true);
}
}