package com.wangwang1; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class TXZ1 { public static void main(String[] args) { //类名 对象名; JFrame gameFrame = new JFrame(); //设置标题 gameFrame.setTitle("推箱子1.0"); gameFrame.setSize(22 * 48 + 10, 12 * 48 + 38); //让窗体具体 //gameFrame.setLocation((1920 - 800) / 2, (1080 - 600) / 2); //gameFrame.setBounds((1920 - 800) / 2, (1080 - 600) / 2, 800, 600); gameFrame.setLocationRelativeTo(null); //当窗体关闭时终止程序 gameFrame.setDefaultCloseOperation(3); gameFrame.setResizable(false); //创建面板 JPanel panel = new JPanel(); //对象名.属性名 普通属性 //类名.属性名 静态属性 //设置背景颜色 panel.setBackground(Color.GRAY); //设置布局为自定义布局 panel.setLayout(null); //内容面板 设置面板与窗体关联 gameFrame.setContentPane(panel); //设置围墙 JLabel[] walls = new JLabel[22 * 2 + (12 - 2) * 2 + 6 + 5 + 5]; ImageIcon wallImg = new ImageIcon("imgs/wall3.png"); 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 < 5; i++) { panel.add(walls[index]); walls[index++].setBounds((6 + i) * 48, 3 * 48, 48, 48); } //竖着加 for (int i = 0; i <= 5; i++) { panel.add(walls[index]); walls[index++].setBounds(14 * 48, (4 + i) * 48, 48, 48); } //正斜着加 for (int i = 0; i < 5; i++) { panel.add(walls[index]); walls[index++].setBounds((3 + i) * 48, (4 + i) * 48, 48, 48); } ImageIcon workerImg = new ImageIcon("imgs/workerRight3.png"); JLabel worker = new JLabel(workerImg); panel.add(worker); worker.setBounds(3 * 48, 3 * 48, 48, 48); ImageIcon boxImg = new ImageIcon("imgs/box3.png"); JLabel box = new JLabel(boxImg); panel.add(box); box.setBounds(8 * 48, 9 * 48, 48, 48); ImageIcon goalImg = new ImageIcon("imgs/goal3.png"); JLabel goal = new JLabel(goalImg); panel.add(goal); goal.setBounds(17 * 48, 6 * 48, 48, 48); //事件处理 匿名内部类(委托事件模型,代理事件模型 设计模式:观察者模式) gameFrame.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { //System.out.println("键盘每按一次,此方法被调用一次"); //工人移动与图片改变 int keyCode = e.getKeyCode(); //System.out.println(keyCode); String workerImgPath = "workerRight3.png"; int x = 0, y = 0; if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT) { x = -48; workerImgPath = "workerLeft3.png"; } else if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP) { y = -48; workerImgPath = "workerUp3.png"; } else if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT) { x = 48; } else if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN) { y = 48; workerImgPath = "workerDown3.png"; } worker.setBounds(worker.getBounds().x + x, worker.getBounds().y + y, 48, 48); ImageIcon img = new ImageIcon("imgs/" + workerImgPath); worker.setIcon(img); //工人不能穿墙 for (int i = 0; i < walls.length; i++) { //如果工人的边界与某块围墙的边界有交集 if (worker.getBounds().intersects(walls[i].getBounds())) { worker.setBounds(worker.getBounds().x - x, worker.getBounds().y - y, 48, 48); break; } } //如果工人的边界与箱子的边界有交集 if (worker.getBounds().intersects(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().intersects(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().intersects(goal.getBounds())) { JOptionPane.showMessageDialog(null, "恭喜您成功通关!"); System.exit(0); //退出系统结束进程 } } @Override public void keyReleased(KeyEvent e) { } }); gameFrame.setVisible(true); } }