本文实例为大家分享了Java实现推箱子游戏的具体代码,供大家参考,具体内容如下
package Test1; //用于调用Test2包 import Test2.*; import java.awt.*; import javax.swing.*; public class APP extends JFrame{ public static void mAIn(String[] args) { // TODO Auto-generated method stub APP a = new APP(); } public APP() { new Members(); } }
package Test2; import java.awt.Event; import java.awt.Font; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class Members extends JFrame implements KeyListener{ //定义一个JLabel数组,用来存放羊的位置 JLabel [][]sheep = new JLabel[12][16]; //0表示的是空地,1表示的是树木 int[][] datas = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; //狼的位置 int wx,wy; /* * num值变化的情况 * 1.当羊进入笼子的时候,num+1 * 2.当羊离开笼子的时候,num-1 * 3.当羊从一个笼子离开进入另外一个笼子的时候,num不变 */ //开始的时候羊进入箱子的总数量 int num = 0; //笼子的总数量 int total = 3; //构造函数 public Members() { /* * 如果先放大的图片再放下的会把小的给覆盖,不能看到 * 图片有大小。把小的图片放在大的图片上面 * 所以添加图片组件的时候有顺序,要注意把小的放在大的上面 */ //小图片 //障碍的设计 treeInit(); //做笼子 targetInit(); //推箱子人物的初始化 WolfInit(); //羊的初始化 sheepInit(); //背景图片,大的 //添加背景图片到窗体中 backGroundInit(); //设置整个窗体 setForm(); //注册监听 this.addKeyListener(this); } //设置整个窗体 private void setForm() { // TODO Auto-generated method stub this.setTitle("推箱子游戏"); this.setSize(825,645); //禁止用户改变窗体大小 this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口居中显示 this.setLocationRelativeTo(null); this.setVisible(true); } //背景图片初始化 private void backGroundInit() { // TODO Auto-generated method stub Icon i = new ImageIcon("floor.png"); //使用JLabel制作背景 JLabel lab_bg = new JLabel(i); //设置要添加的组件的位置与大小 lab_bg.setBounds(0, 0, 800, 600); //将这个东西添加到窗体里面 this.add(lab_bg); } //羊所在的位置初始化 private void sheepInit() { // TODO Auto-generated method stub //三只羊 Icon i = new ImageIcon("7.png"); JLabel jb1 = new JLabel(i); jb1.setBounds(6 * 50, 4 * 50, 50, 50); this.add(jb1); //羊所在位置的值设置为4 datas[4][6] = 4; sheep[4][6] = jb1; JLabel jb2 = new JLabel(i); jb2.setBounds(6 * 50, 6 * 50, 50, 50); this.add(jb2); datas[6][6] = 4; sheep[6][6] = jb2; JLabel jb3 = new JLabel(i); jb3.setBounds(6 * 50, 10 * 50, 50, 50); this.add(jb3); datas[10][6] = 4; sheep[10][6] = jb3; } JLabel jb = null; private void WolfInit() { // TODO Auto-generated method stub //人物最初位置在哪里? wx = 4 ; wy = 5 ; //使用一张图片来模拟人物 //1.创建一张图片,人物图片 Icon i = new ImageIcon("3.png"); //2.使用JLabel组件模拟人物 jb = new JLabel(i); //3.设置人物在屏幕上的显示位置 //人物的显示位置放置在何处较为合理?---------------- jb.setBounds(wx*50, wy*50, 50, 50); //4.把这个人物放到窗体里面 this.add(jb); } //笼子的位置初始化 private void targetInit() { // TODO Auto-generated method stub Icon i = new ImageIcon("target.png"); JLabel jb1 = new JLabel(i); jb1.setBounds(14 * 50, 10 * 50,50,50); this.add(jb1); datas[10][14] = 8; JLabel jb2 = new JLabel(i); jb2.setBounds(13 * 50, 10 * 50, 50, 50); this.add(jb2); datas[10][13] = 8; JLabel jb3 = new JLabel(i); jb3.setBounds(14 * 50, 9 * 50, 50, 50); this.add(jb3); datas[9][14] = 8; } //树木的初始化 private void treeInit() { // TODO Auto-generated method stub Icon k = new ImageIcon("tree.png"); JLabel t = null; for(int i = 0;i < datas.length;i ++){ for(int j = 0;j < datas[i].length;j ++){ if(datas[i][j] == 1){ t = new JLabel(k); t.setBounds(j*50, i*50, 50, 50); this.add(t); } } } } //判断是否胜利 private void victory() { if(num == total){ //设计一个弹框,提示游戏完成 Icon i = new ImageIcon("6.png"); JOptionPane.showMessageDialog(null, "游戏结束","推箱子",2,i); /* * 如果要设置关卡,则要在这里添加信息 * 注意修改num的值 * 根据自己关卡的数量,把datas数组设计成三维的额 */ } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub /* * datas数值的情况 * 0 空地 * 1 树木 * 4 羊 * 8 空笼子 * 12 放羊的笼子 * 结合这些数值去看下面的代码 */ /* * W 向上 * D 向右 * S 向下 * A 向左 * 注意一个盲区,这个问题考虑了好久,在Java坐标体系中,坐标轴是水平方向为x轴,竖直方向为y轴 * 而在数组中先水平方向,后竖直方向,所以在datas数组中填写数值为先y后x */ if(e.getKeyCode() == KeyEvent.VK_ENTER){ /* * 每一次按键都要讨论下面这些情况 * 1.浪 树木 * 2.狼 羊 树木 * 3.狼 羊 羊 * 4.狼 羊 放羊的笼子 * 5.狼 放羊的笼子 树 * 6.狼 放羊的笼子 羊 * 7.狼 放羊的笼子 放羊的笼子 * 上面的这些情况都不做处理,因为不能移动 * 8.狼 空地 * 9.狼 空笼子 * 10.狼 羊 空地 * 11.狼 羊 空笼子 * 12.狼 放羊的笼子 空地 * 13.狼 放羊的笼子 空笼子 * 这些情况需要有相应的变化,见代码 */ if(datas[wy-1][wx] == 1){ return; } if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 1){ return; } if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 4){ return; } if(datas[wy-1][wx] == 4 && datas[wy-1][wx] == 12){ return; } if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 1){ return; } if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 4){ return; } if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 12){ return; } if(datas[wy-1][wx] == 0){ wy -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y - 50); Icon i = new ImageIcon("1.png"); jb.setIcon(i); return; } if(datas[wy-1][wx] == 8){ wy -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y - 50); Icon i = new ImageIcon("1.png"); jb.setIcon(i); return; } if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 0){ datas[wy-1][wx] = 0; datas[wy-2][wx] = 4; } if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 8){ datas[wy-1][wx] = 0; datas[wy-2][wx] = 12; num ++; } if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 0){ datas[wy-1][wx] = 8; datas[wy-2][wx] = 4; num --; } if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 8){ datas[wy-1][wx] = 8; datas[wy-2][wx] = 12; } sheep[wy-1][wx].setLocation(wx*50, wy*50-100); sheep[wy-2][wx] = sheep[wy-1][wx]; sheep[wy-1][wx] = null; wy -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y - 50); Icon i = new ImageIcon("1.png"); jb.setIcon(i); victory(); return; } else if(e.getKeyCode() == KeyEvent.VK_D){ if(datas[wy][wx+1] == 1){ return; } if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 1){ return; } if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 4){ return; } if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 12){ return; } if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 1){ return; } if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 4){ return; } if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 12){ return; } if(datas[wy][wx+1] == 0){ wx += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x + 50, y); Icon i = new ImageIcon("2.png"); jb.setIcon(i); return; } if(datas[wy][wx+1] == 8){ wx += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x + 50, y); Icon i = new ImageIcon("2.png"); jb.setIcon(i); return; } if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 0){ datas[wy][wx+1] = 0; datas[wy][wx+2] = 4; } if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 8){ datas[wy][wx+1] = 0; datas[wy][wx+2] = 12; num ++; } if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 0){ datas[wy][wx+1] = 8; datas[wy][wx+2] = 4; num --; } if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 8){ datas[wy][wx+1] = 8; datas[wy][wx+2] = 12; } sheep[wy][wx+1].setLocation(wx*50+100, wy*50); sheep[wy][wx+2] = sheep[wy][wx+1]; sheep[wy][wx+1] = null; wx += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x + 50, y); Icon i = new ImageIcon("2.png"); jb.setIcon(i); victory(); return; } else if(e.getKeyCode() == KeyEvent.VK_S){ if(datas[wy+1][wx] == 1){ return; } if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 1){ return; } if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 4){ return; } if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 12){ return; } if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 1){ return; } if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 4){ return; } if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 12){ return; } if(datas[wy+1][wx] == 0){ wy += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y + 50); Icon i = new ImageIcon("3.png"); jb.setIcon(i); return; } if(datas[wy+1][wx] == 8){ wy += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y + 50); Icon i = new ImageIcon("3.png"); jb.setIcon(i); return; } if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 0){ datas[wy+1][wx] = 0; datas[wy+2][wx] = 4; } if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 8){ datas[wy+1][wx] = 0; datas[wy+2][wx] = 12; num ++; } if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 0){ datas[wy+1][wx] = 8; datas[wy+2][wx] = 4; num --; } if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 8){ datas[wy+1][wx] = 8; datas[wy+2][wx] = 12; } sheep[wy+1][wx].setLocation(wx*50, wy*50+100); sheep[wy+2][wx] = sheep[wy+1][wx]; sheep[wy+1][wx] = null; wy += 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x, y + 50); Icon i = new ImageIcon("3.png"); jb.setIcon(i); victory(); return; } else if(e.getKeyCode() == KeyEvent.VK_A){ if(datas[wy][wx-1] == 1){ return; } if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 1){ return; } if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 4){ return; } if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 12){ return; } if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 1){ return; } if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 4){ return; } if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 12){ return; } if(datas[wy][wx-1] == 0){ wx -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x - 50, y); Icon i = new ImageIcon("4.png"); jb.setIcon(i); return; } if(datas[wy][wx-1] == 8){ wx -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x - 50, y); Icon i = new ImageIcon("4.png"); jb.setIcon(i); return; } if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 0){ datas[wy][wx-1] = 0; datas[wy][wx-2] = 4; } if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 8){ datas[wy][wx-1] = 0; datas[wy][wx-2] = 12; num ++; } if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 0){ datas[wy][wx-1] = 8; datas[wy][wx-2] = 4; num --; } if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 8){ datas[wy][wx-1] = 8; datas[wy][wx-2] = 12; } sheep[wy][wx-1].setLocation(wx*50-100, wy*50); sheep[wy][wx-2] = sheep[wy][wx-1]; sheep[wy][wx-1] = null; wx -= 1; //坐标得到的不是int类型。注意强制类型转化 int x = (int)jb.getLocation().getX(); int y = (int)jb.getLocation().getY(); jb.setLocation(x - 50, y); Icon i = new ImageIcon("4.png"); jb.setIcon(i); victory(); return; } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } }