Java实现推箱子游戏

本文实例为大家分享了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

 }
}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现推箱子小游戏

    本文实例为大家分享了java实现推箱子游戏的具体代码,供大家参考,具体内容如下 运行示例: 图形界面由swing组件构成 生成地图的算法如下 创建地图算法(produceMap):先将二维数组全置为1,代表初始状态全为墙.先随机产生两个不重合的点,一个作为人的起点,另一个作为箱子的起点.从起点开始,随机朝四个方向走一定的步数,若走到的点不是空地,即对应数组元素不为0,则将该点设为空地,即数组元素设为0.将地图分为左上.左下.右上和右下四个区域,并设置四个变量记录四个区域已开辟空地的数量.每开辟一

  • Java实现推箱子游戏

    本文实例为大家分享了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(

  • Java实现简单推箱子游戏

    本文实例为大家分享了Java实现简单推箱子游戏的具体代码,供大家参考,具体内容如下 *编写一个简易的推箱子游戏,使用10*8的二维字符数据表示游戏画面,H表示墙壁; &表示玩家角色: o表示箱子,表示目的地.玩家可以通过输入a.d.w. s字符控制角色 移动,当箱子推到目的地时显示游戏结束,运行结果如图所示. package test; import java.util.Random; import java.util.Scanner; public class test3 { public s

  • C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include<stdio.h> #include<stdlib.h> //#include<Windows.h> #include<conio.h> #include<graphics.h> #include<stdbool.h> //播放音乐需要的头文件 #include <mmsystem.h> #pragma comment(

  • JavaScript编写推箱子游戏

    推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用了zepto的touch模块, 通过手指滑动屏幕就可以控制乌龟走不同的方向: 因为推箱子这个游戏比较简单, 直接用了过程式的方式写代码, 模块也就是两个View 和 Model, 剩下就是用户的事件Controller, 用户每一次按下键盘的方向键都会改变数据模型的数据,然后重新生成游戏的静态html, 然后用innerHTML方式插

  • Python使用tkinter模块实现推箱子游戏

    前段时间用C语言做了个字符版的推箱子,着实是比较简陋.正好最近用到了Python,然后想着用Python做一个图形界面的推箱子.这回可没有C那么简单,首先Python的图形界面我是没怎么用过,在网上找了一大堆教材,最后选择了tkinter,没什么特别的原因,只是因为网上说的多. 接下来就来和大家分享一下,主要分享两点,第一就是这个程序的实现过程,第二点就是我在编写过程中的一些思考. 一.介绍 开发语言:Python 3.7 开发工具:PyCharm 2019.2.4 日期:2019年10月2日

  • python实现推箱子游戏

    本文实例为大家分享了python实现推箱子游戏的具体代码,供大家参考,具体内容如下 题目描述: 最短路径为: uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL u表示向上,d表示向下,l表示向左,r表示向右. 大写表示人推着箱子一起动,小写表示人自己走. 代码用BFS实现.状态要分推着箱子一起走和人单独走,这两种状态转移是不同的. 由于代码中注释较详细,这里不过多解释. 代码: # -*- coding: utf-8 -*- # @Time : 2017

  • 用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> //行和列 #define ROW 10 #define COL 11 /* run this program using the console pauser or add your own getch, system(&quo

  • C语言推箱子游戏实现代码

    推箱子游戏的运行规则:在街道上上小人推动箱子移动,直到把箱子移动到目的地. 思路分析: 小人及箱子的移动就是小人或者箱子和路的交换: 1 定义二维字符数组,存储地图 2 显示地图,提示游戏玩法 3 记录小人及箱子位置,并定义字符变量接收用户输入方向 4 循环判断语句 1).小人的下一步是否为路,如果为路,则移动并记录小人新位置信息 2).小人的下一步如果不是路,在判断是否为箱子,如果是箱子,在判断箱子的下一个位置是否是路,如果是路,则移动箱子和小人 3). 刷新地图 4) .判断箱子的位置,如果

  • C语言实现简单推箱子游戏

    使用C语言实现超简单的推箱子游戏,供大家参考,具体内容如下/p> 感谢您打开了这篇文章,下面我将讲述一下推箱子是如何实现的. 另外附赠适配该程序简单好用 专属推箱子地图编辑器 让您在16 * 16大地图的条件下也能轻松编辑地图. 链接:地图编辑器 本程序在没有检测到地图文件的情况下也能独自运行!代码中储存了推箱子游戏第一关的标准地图,让您在没有地图文件的情况下也能熟悉整个程序的流程! 当然,拥有地图文件会也会获得更好的游戏体验,请自行编辑. 废话不多说! 下面进入技术环节: C语言版 多功能推箱

随机推荐