效果预览

推方块

游戏简介:由 ↑,↓,←,→键来控制方向,点击空格键表示重玩当前关卡。

核心代码部分:就是如何处理人的移动和人和箱子一起时的移动,这里需要对人要走的下一步和人推着箱子一起走的下一步进行判断分析,如果没有被阻挡就可以继续走下一步。(有兴趣的小伙伴可以参考我写的完整代码,上面都有备注解析)

完整代码部分

package demo01;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;public class Pushbox005 extends JFrame implements KeyListener, ActionListener, MouseListener {//    定义一个内部类用来创建坐标class Point{public int x;public int y;public Point (int x,int y){this.x=x;this.y=y;}}//    行数(高)int height=8;//    列数(宽)int width=8;//    格子的大小int size=50;//    标题栏的高度int title=100;//    记录窗口大小是否发生改变boolean window=false;//    关卡地图信息class Ditu{public int [][] ditu;Ditu(int[][] _ditu){this.ditu=_ditu;}}//    创建一个二维数组用来存放关卡
//    1-10关地图int [][] ditu1={{0,0,1,1,1,0,0,0},{0,0,1,3,1,0,0,0},{0,0,1,2,1,1,1,1},{1,1,1,4,2,4,3,1},{1,3,2,4,5,1,1,1},{1,1,1,1,4,1,0,0},{0,0,0,1,3,1,0,0},{0,0,0,1,1,1,0,0}};int [][] ditu2= {{1,1,1,1,1,0,0,0,0},{1,2,2,5,1,0,0,0,0},{1,2,4,4,1,0,1,1,1},{1,2,4,2,1,0,1,3,1},{1,1,1,2,1,1,1,3,1},{0,1,1,2,2,2,2,3,1},{0,1,2,2,2,1,2,2,1},{0,1,2,2,2,1,1,1,1},{0,1,1,1,1,1,0,0,0}};int [][] ditu3={{0,1,1,1,1,1,1,1,0,0},{0,1,2,2,2,2,2,1,1,1},{1,1,4,1,1,1,2,2,2,1},{1,2,5,2,4,2,2,4,2,1},{1,2,3,3,1,2,4,2,1,1},{1,1,3,3,1,2,2,2,1,0},{0,1,1,1,1,1,1,1,1,0}};int [][] ditu4={{0,1,1,1,1,0},{1,1,2,2,1,0},{1,5,4,2,1,0},{1,1,4,2,1,1},{1,1,2,4,2,1},{1,3,4,2,2,1},{1,3,3,6,3,1},{1,1,1,1,1,1}};int [][] ditu5={{0,1,1,1,1,1,0,0},{0,1,2,2,1,1,1,0},{0,1,5,4,2,2,1,0},{1,1,1,2,1,2,1,1},{1,3,1,2,1,2,2,1},{1,3,4,2,2,1,2,1},{1,3,2,2,2,4,2,1},{1,1,1,1,1,1,1,1}};int [][] ditu6={{0,0,0,1,1,1,1,1,1,1,0,0,0},{1,1,1,1,2,2,2,2,2,1,0,0,0},{1,2,2,2,3,1,1,1,2,1,0,0,0},{1,2,1,2,1,2,2,2,2,1,1,0,0},{1,2,1,2,4,2,4,1,3,2,1,0,0},{1,2,1,2,2,6,2,2,1,2,1,0,0},{1,2,3,1,4,2,4,2,1,2,1,0,0},{1,1,2,2,2,2,1,2,1,2,1,1,1},{0,1,2,1,1,1,3,2,2,2,2,5,1},{0,1,2,2,2,2,2,1,1,2,2,2,1},{0,1,1,1,1,1,1,1,1,1,1,1,1}};int [][] ditu7={{0,0,0,1,1,1,1,1,1,1},{0,0,1,1,2,2,1,2,5,1},{0,0,1,2,2,2,1,2,2,1},{0,0,1,4,2,4,2,4,2,1},{0,0,1,2,4,1,1,2,2,1},{1,1,1,2,4,2,1,2,1,1},{1,3,3,3,3,3,2,2,1,0},{1,1,1,1,1,1,1,1,1,0}};int [][] ditu8={{0,0,0,1,1,1,1,1,1,0},{0,1,1,1,2,2,2,2,1,0},{1,1,3,2,4,1,1,2,1,1},{1,3,3,4,2,4,2,2,5,1},{1,3,3,2,4,2,4,2,1,1},{1,1,1,1,1,1,2,2,1,0},{0,0,0,0,0,1,1,1,1,0}};int [][] ditu9={{0,1,1,1,1,1,1,1,1,1,0},{0,1,2,2,1,1,2,2,2,1,0},{0,1,2,2,2,4,2,2,2,1,0},{0,1,4,2,1,1,1,2,4,1,0},{0,1,2,1,3,3,3,1,2,1,0},{1,1,2,1,3,3,3,1,2,1,1},{1,2,4,2,2,4,2,2,4,2,1},{1,2,2,2,2,2,1,2,5,2,1},{1,1,1,1,1,1,1,1,1,1,1}};int [][] ditu10={{0,0,1,1,1,1,1,1},{0,0,1,2,2,2,2,1},{1,1,1,4,4,4,2,1},{1,5,2,4,3,3,2,1},{1,2,4,3,3,3,1,1},{1,1,1,1,2,2,1,0},{0,0,0,1,1,1,1,0}};
//    创建一个总地图Ditu ditu[]={new Ditu(ditu1),new Ditu(ditu2),new Ditu(ditu3),new Ditu(ditu4),new Ditu(ditu5),new Ditu(ditu6),new Ditu(ditu7),new Ditu(ditu8),new Ditu(ditu9),new Ditu(ditu10)};//    定义一个当前关卡int guan=1;//    定义一个最大关卡int maxguan=10;//   定义一个变量判断是否通关boolean tongguan=false;//    创建一个推箱子的小人Point man=new Point(4,4);//    创建箱子Point [] box= {new Point(3,3),new Point(3,4),new Point(5,3),new Point(4,5)};//    创建箱子最终要到达的位置Point [] home={new Point(1,4),new Point(3,1),new Point(6,3),new Point(4,6)};//    创建一个墙壁数组Point [] qiangbi= {new Point(2,0),new Point(3,0),new Point(4,0),new Point(2,1),new Point(4,1),new Point(2,2),new Point(4,2),new Point(5,2),new Point(6,2),new Point(7,2),new Point(0,3),new Point(1,3),new Point(2,3),new Point(7,3),new Point(0,4), new Point(5,4), new Point(6,4), new Point(7,4),new Point(0,5),new Point(1,5),new Point(2,5),new Point(3,5),new Point(5,5),new Point(3,6),new Point(5,6),new Point(3,7),new Point(4,7),new Point(5,7)};//    创建一个空地数组Point [] kongdi={new Point(3,1),new Point(3,2),new Point(3,3),new Point(4,3),new Point(5,3),new Point(6,3),new Point(1,4),new Point(2,4),new Point(3,4),new Point(4,4),new Point(4,5),new Point(4,6)};//    设置图片private Image image=null;Graphics gf=null;//    设置计时器Timer timer=new Timer(500,this);public void Tian(){
//      加载地图jiazaiditu(guan);//设置窗口的宽高this.setSize(width*size ,height*size+title);
//        设置标题this.setTitle("推箱子");//设置窗口能看见this.setVisible(true);
//        设置窗口顶点坐标的位置this.setLocation(100,100);//设置键盘监听事件(也就是当键盘有什么反应都会调用此函数)this.addKeyListener(this);}public void paint(Graphics g){// 窗口大小改变后,重新创建缓存图片if(window == true) {window = false;image=this.createImage(width*size,height*size+title);this.gf =image.getGraphics();}//初始化临时图片//解决闪烁问题if(image==null){image=this.createImage(width*size,height*size+title);}if(this.gf ==null){this.gf =image.getGraphics();}//        擦除背景gf.setColor(Color.white);gf.fill3DRect(0,0,width*size,title+height*size,true);//        绘制网格gf.setColor(Color.GRAY);
//        画行(画横线)
//        for (int i = 0; i <= height; i++) {
//            gf.drawLine(0,size*i+title,width*size,size*i+title);
//        }画列(画竖线)
//        for (int i = 0; i <= width; i++) {
//            gf.drawLine(i*size,title,i*size,height*size+title);
//        }//       绘制墙for (int i = 0; i <qiangbi.length ; i++) {gf.setColor(Color.pink);gf.fill3DRect(qiangbi[i].x*size,qiangbi[i].y*size+title,size,size,true);}//       绘制箱子最终要到达的位置for (int i = 0; i <home.length ; i++) {gf.setColor(Color.black);gf.drawOval(home[i].x*size,home[i].y*size+title,size,size);gf.drawLine(home[i].x*size,home[i].y*size+title,home[i].x*size+size,home[i].y*size+title+size);}
//        绘制真实的箱子for (int i = 0; i <box.length ; i++) {gf.setColor(Color.ORANGE);gf.fill3DRect(box[i].x*size,box[i].y*size+title,size,size,true);if(isguiwei(i)){gf.setColor(Color.red);gf.fill3DRect(box[i].x*size,box[i].y*size+title,size,size,true);}}
//        绘制推箱子的小人gf.setColor(Color.green);gf.fillOval(man.x*size,man.y*size+title,size,size);//        绘制当前关卡信息if(iswin()==true&&tongguan==true){gf.setColor(Color.darkGray);gf.fill3DRect(0,0,width*size,title,true);gf.setFont(new Font("华文新魏", 10, 55)); //设置字体gf.setColor(Color.white);gf.drawString("恭喜通关",width*size/2-110,title/2+40);}else {gf.setColor(Color.darkGray);gf.fill3DRect(0,0,width*size,title,true);gf.setFont(new Font("华文新魏", 10, 55)); //设置字体gf.setColor(Color.white);gf.drawString("弟"+guan+"关",width*size/2-82,title/2+40);}g.drawImage(image,0,0,null);}//    按下键盘--控制游戏的开始以及方块的移动方向public void keyPressed(KeyEvent e) {// 获取从键盘输入的键int key = e.getKeyCode();//       上if (key == KeyEvent.VK_UP) {
//            y-1是空地if(iscunzai(kongdi,new Point(man.x,man.y-1))==true){
//                y-1是空地,且空地上没有箱子if(iscunzai(box,new Point(man.x,man.y-1))==false){man.y--;}else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)if ((iscunzai(kongdi,new Point(man.x,man.y-2))==true)&&(iscunzai(box,new Point(man.x,man.y-2))==false)){
//                      这种情况下是人和箱子都向上移动一格for (int i = 0; i < box.length; i++) {if(box[i].x==man.x&&box[i].y==man.y-1){box[i].y--;break;}}man.y--;//判断所有箱子是否归位if(iswin()==true){if(guan<maxguan){//不是最后一关guan++;
//                            加载新一关的地图jiazaiditu(guan);}else{//是最后一关tongguan=true;}}}}}//        下}else if (key == KeyEvent.VK_DOWN) {//            y-1是空地if(iscunzai(kongdi,new Point(man.x,man.y+1))==true){
//                y-1是空地,且空地上没有箱子if(iscunzai(box,new Point(man.x,man.y+1))==false){man.y++;}else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)if ((iscunzai(kongdi,new Point(man.x,man.y+2))==true)&&(iscunzai(box,new Point(man.x,man.y+2))==false)){
//                      这种情况下是人和箱子都向上移动一格for (int i = 0; i < box.length; i++) {if(box[i].x==man.x&&box[i].y==man.y+1){box[i].y++;break;}}man.y++;//判断所有箱子是否归位if(iswin()==true){if(guan<maxguan){guan++;
//                            加载新一关的地图jiazaiditu(guan);}else{tongguan=true;}}}}}
//            左}else if(key == KeyEvent.VK_LEFT){if(iscunzai(kongdi,new Point(man.x-1,man.y))==true){
//                y-1是空地,且空地上没有箱子if(iscunzai(box,new Point(man.x-1,man.y))==false){man.x--;}else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)if ((iscunzai(kongdi,new Point(man.x-2,man.y))==true)&&(iscunzai(box,new Point(man.x-2,man.y))==false)){
//                      这种情况下是人和箱子都向上移动一格for (int i = 0; i < box.length; i++) {if(box[i].x==man.x-1&&box[i].y==man.y){box[i].x--;break;}}man.x--;//判断所有箱子是否归位if(iswin()==true){if(guan<maxguan){guan++;
//                            加载新一关的地图jiazaiditu(guan);}else{tongguan=true;}}}}}//            右}else if (key == KeyEvent.VK_RIGHT) {if(iscunzai(kongdi,new Point(man.x+1,man.y))==true){
//                y-1是空地,且空地上没有箱子if(iscunzai(box,new Point(man.x+1,man.y))==false){man.x++;}else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)if ((iscunzai(kongdi,new Point(man.x+2,man.y))==true)&&(iscunzai(box,new Point(man.x+2,man.y))==false)){
//                      这种情况下是人和箱子都向上移动一格for (int i = 0; i < box.length; i++) {if(box[i].x==man.x+1&&box[i].y==man.y){box[i].x++;break;}}man.x++;//判断所有箱子是否归位if(iswin()==true){if(guan<maxguan){guan++;
//                            加载新一关的地图jiazaiditu(guan);}else{tongguan=true;}}}}}}
//        点击空格键重玩当前关卡if(key == KeyEvent.VK_SPACE) {//空格键
//            重置当前关卡jiazaiditu(guan);}repaint();}public void keyReleased(KeyEvent e) {}public void mouseClicked(MouseEvent e) {}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}
//   判断某个数组中是否存在某个点
//    判断point这个点是否在points这个数组中public boolean iscunzai(Point [] points,Point point){for (int i = 0; i < points.length; i++) {if(points[i].x==point.x&&points[i].y==point.y){return true;}}return false;}//    加载地图public void jiazaiditu(int index){// 清空当前数据//ArrayList<Point> boxlist = new ArrayList<Point>();ArrayList<Point> homelist = new ArrayList<Point>();ArrayList<Point> qiangbilist = new ArrayList<Point>();ArrayList<Point> kongdilist = new ArrayList<Point>();Ditu d = ditu[index-1];for(int i= 0;i<d.ditu.length;i++){for(int j=0;j<d.ditu[i].length;j++){// 1是墙壁if(d.ditu[i][j] == 1){qiangbilist.add(new Point(j,i));}// 2是空地else if(d.ditu[i][j] == 2){kongdilist.add(new Point(j,i));}// 3是黑店else if(d.ditu[i][j] == 3){homelist.add(new Point(j,i));kongdilist.add(new Point(j,i));}// 4箱子else if(d.ditu[i][j] == 4){boxlist.add(new Point(j,i));kongdilist.add(new Point(j,i));}// 5人else if(d.ditu[i][j] == 5){man.x = j;man.y = i;kongdilist.add(new Point(j,i));}// 6(箱子在黑点上)else if(d.ditu[i][j] ==6){boxlist.add(new Point(j,i));kongdilist.add(new Point(j,i));homelist.add(new Point(j,i));}// 7(人在黑点上)else if(d.ditu[i][j] == 7){man.x = j;man.y = i;kongdilist.add(new Point(j,i));homelist.add(new Point(j,i));}}}int i=0;qiangbi = new Point[qiangbilist.size()];for (Point p:qiangbilist){qiangbi[i] = new Point(p.x,p.y);i++;}i=0;kongdi = new Point[kongdilist.size()];for (Point p:kongdilist){kongdi[i]=new Point(p.x,p.y);i++;}i=0;box = new Point[boxlist.size()];for (Point p:boxlist){box[i]=new Point(p.x,p.y);i++;}i=0;home = new Point[homelist.size()];for (Point p:homelist){home[i]=new Point(p.x,p.y);i++;}height=d.ditu.length;width=d.ditu[0].length;this.setSize(width*size,height*size+title);window=true;}//    判断单个方块是否归位//用于改变颜色public boolean isguiwei(int i){for (int i1 = 0; i1 < home.length; i1++) {if(box[i].x==home[i1].x&&box[i].y==home[i1].y){return true;}}return false;}public void actionPerformed(ActionEvent e) {}public void keyTyped(KeyEvent e) {}//    判断游戏是否胜利(判断方块是否全部归位)public boolean iswin(){int j=0;for (int i = 0; i < box.length; i++) {for (int i1 = 0; i1 < home.length; i1++) {if(box[i].x==home[i1].x&&box[i].y==home[i1].y){j++;if(j==home.length){return true;}}}}return false;}public static void main(String[] args) {Pushbox005 pushbox=new Pushbox005();pushbox.Tian();}}

java版本实现推箱子小游戏相关推荐

  1. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  2. 【Java】推箱子小游戏(带背景音乐)完整代码

    Java实现推箱子小游戏 一.整体框架 二.游戏效果图 三.推箱子四大类 1. GameFrame类 2. Map类 3. MapFactory类 4. Sound类 四.游戏分析 1.游戏操作 2. ...

  3. 基于Java Swing JFream 组件的趣味推箱子小游戏

    一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...

  4. [源码和文档分享]基于Java Swing JFream 组件的趣味推箱子小游戏

    一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...

  5. java实现二维数组推箱子小游戏

    推箱子小游戏 import java.util.Scanner;public class 推箱子 {public static void main(String[] args) {int x =3, ...

  6. 怀念童年,推箱子小游戏(vue版本)

    前言 最近都没有怎么写过文章,都断更很久了吧.学习前端一年多,快两年了,学习的热情相比一开始,自我感觉没有变化多少,但是 学习的动力却好像时有时无.就好像是没了目标一样,不知道自己现在应该学些什么,从 ...

  7. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  8. [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)

    完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...

  9. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

最新文章

  1. 美团大脑:知识图谱的建模方法及其应用 | 公开课笔记
  2. 一句话懂什么是JS闭包
  3. tp5.0计划任务删除日志方法
  4. SuperMemo UX 添加笔记 Ctrl+H
  5. 仿手机端京东商城html源码_我用手机写了一个Python爬虫,爬下了凡人修仙传……...
  6. java定义静态常量_如何在Java中定义常量
  7. 前端 html 文字在 div 中怎么实现自动换行
  8. Hash 表详解(哈希表)
  9. 含有js的英文单词_js-组成-dom-常见单词
  10. android官网m魅族15,魅族15亮相安卓官网 圆形Home键设计
  11. 最近莆田鞋在闲鱼不愧是流量王,他们是怎么引流的?
  12. mwt是什么意思网络用语_1,2,3,4,5,6,7,8,9,0的网络语言代表什么意思啊?
  13. 解决Vue打包部署到Nginx时,css样式不生效问题
  14. 一分钟教你如何识别图片文字
  15. 【新版】系统架构设计师 - 软件可靠性分析与设计
  16. RabbitMQ Centos7 安装以及使用
  17. 鸡尾酒排序算法(java)
  18. 2021年JavaScript实用手册
  19. 可用性设计,选你所爱,爱你所选
  20. 完整版 html代码简洁说明,html简单网页代码模板

热门文章

  1. 在Vue-cli脚手架中引入图片最常用的两种方法
  2. RLC串并联谐振回路特性、如何判断容性感性
  3. fastjson远程代码执行漏洞问题分析
  4. java在线客服系统源码 springboot客服聊天源码 网页客服源码 netty通信技术,java源码
  5. css中盒子模型的布局
  6. 【CVPR2022】用于域适应语义分割的域无关先验
  7. 高德地图放大Marker icon
  8. 蓝桥杯嵌入式【G4】教程汇总【2022】
  9. 简述如何编写java程序_1-4 简述 Eclipse 编写 Java 程序的流程。_学小易找答案
  10. 2022医院三基相关专业每日一练模拟题及答案