java版本实现双人推箱子小游戏

预览效果

双人推箱子

游戏简介:玩家1由 ↑,↓,←,→键来控制方向,玩家2由W(上)、S(下)、A(左)、D(右)来控制方向,点击空格键表示重玩当前关卡,所有箱子归位自动跳入下一关。

游戏灵感来源:自己尝试玩了几关发现这个游戏如果是两个人一起玩可能也会比较有意思,同时也降低了这个游戏的难度,不用一个人绕一大圈去推箱子,直接让你的队友在需要堆箱子的位置提前站好就可以啦(啊哈哈哈,程序还是有一些可见的bug的,比如现在人和箱子可以被推到一起去,这个bug感觉挺好玩的我就没有修复了,如果想要追求完美的小伙伴可以把这个bug修复一下,【修复原理:当一个小人要推箱子先预先判断该方向上下下一步是否有另一个小人,如果有则箱子不能移动,如果没有小人阻挡则箱子可以正常移动】)

*更新提醒*还有这次关卡已经给大家扒到30关来了,太费眼睛了,o(╥﹏╥)o
 

完整代码部分

package demo01;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class Pushbox006 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}};
    int [][] ditu11={{0,1,1,1,1,0,0,1,1,1,1,1},{1,1,2,2,1,0,0,1,2,2,2,1},{1,2,4,2,1,1,1,1,4,2,2,1},{1,2,2,4,3,3,3,3,2,4,2,1},{1,1,2,2,2,2,1,2,5,2,1,1},{0,1,1,1,1,1,1,1,1,1,1,0}};
    int [][] ditu12={{0,0,1,1,1,1,1,0},{1,1,1,2,2,5,1,0},{1,2,2,4,3,2,1,1},{1,2,2,3,4,3,2,1},{1,1,1,2,6,4,2,1},{0,0,1,2,2,2,1,1},{0,0,1,1,1,1,1,0}};
    int [][] ditu13={{0,0,1,1,1,1,0,0},{0,0,1,3,3,1,0,0},{0,1,1,2,3,1,1,0},{0,1,2,2,4,3,1,0},{1,1,2,4,2,2,1,1},{1,2,2,1,4,4,2,1},{1,2,2,5,2,2,2,1},{1,1,1,1,1,1,1,1}};
    int [][] ditu14={{1,1,1,1,1,1,1,1},{1,2,2,1,2,2,2,1},{1,2,4,3,3,4,2,1},{1,5,4,3,6,2,1,1},{1,2,4,3,3,4,2,1},{1,2,2,1,2,2,2,1},{1,1,1,1,1,1,1,1}};
    int [][] ditu15={{0,1,1,1,1,1,1,0},{1,1,2,2,2,2,1,1},{1,2,4,2,4,4,2,1},{1,3,3,3,3,3,3,1},{1,2,4,4,2,4,2,1},{1,1,1,2,5,1,1,1},{0,0,1,1,1,1,0,0}};
    int [][] ditu16={{0,0,1,1,1,1,1,1,0,0},{0,0,1,2,2,2,2,1,1,1},{0,0,1,2,4,2,2,2,2,1},{1,1,1,2,4,2,1,1,2,1},{1,3,3,3,2,4,2,2,2,1},{1,3,3,3,4,1,4,2,1,1},{1,1,1,1,2,1,2,4,2,1},{0,0,0,1,2,2,5,2,2,1},{0,0,0,1,1,1,1,1,1,1}};
    int [][] ditu17={{1,1,1,1,1,1,0,0,0},{1,2,2,2,2,1,0,0,0},{1,2,4,4,4,1,1,0,0},{1,2,2,1,3,3,1,1,1},{1,1,2,2,3,3,4,2,1},{0,1,2,5,2,2,2,2,1},{0,1,1,1,1,1,1,1,1}};
    int [][] ditu18={{0,0,1,1,1,1,1,1,1,1},{0,0,1,2,2,2,1,3,2,1},{0,1,1,2,2,4,3,3,3,1},{0,1,2,2,4,2,1,6,3,1},{1,1,2,1,1,4,1,2,1,1},{1,2,2,2,4,2,2,4,2,1},{1,2,2,2,1,2,2,2,2,1},{1,1,1,1,1,1,1,5,2,1},{0,0,0,0,0,0,1,1,1,1}};
    int [][] ditu19={{0,1,1,1,1,1,1,1,0,0},{0,1,3,3,3,3,2,1,0,0},{1,1,1,3,3,3,4,1,1,1},{1,2,2,4,1,4,2,4,2,1},{1,2,4,4,2,2,1,4,2,1},{1,2,2,2,2,1,2,2,2,1},{1,1,1,1,2,5,2,1,1,1},{0,0,0,1,1,1,1,1,0,0}};
    int [][] ditu20={{1,1,1,1,1,1,1},{1,3,3,4,3,3,1},{1,3,3,1,3,3,1},{1,2,4,4,4,2,1},{1,2,2,4,2,2,1},{1,2,4,4,4,2,1},{1,2,2,1,5,2,1},{1,1,1,1,1,1,1}};
    int [][] ditu21={{0,0,0,1,1,1,1,1,1,0,0},{0,0,0,1,2,3,3,3,1,0,0},{1,1,1,1,3,3,3,3,1,0,0},{1,2,2,1,1,1,4,2,1,1,1},{1,2,4,2,4,2,2,4,4,2,1},{1,5,2,4,2,4,2,2,2,2,1},{1,2,2,2,1,1,1,2,2,2,1},{1,1,1,1,1,2,1,1,1,1,1}};
    int [][] ditu22={{1,1,1,1,1,1,1,1,0},{1,2,2,2,2,2,2,1,0},{1,2,1,4,4,2,2,1,0},{1,2,3,3,3,1,2,1,0},{1,1,3,3,3,4,2,1,1},{0,1,2,1,1,2,4,2,1},{0,1,4,2,2,4,2,2,1},{0,1,2,2,1,2,2,5,1},{0,1,1,1,1,1,1,1,1}};
    int [][] ditu23={{0,0,1,1,1,1,1,1,0,0},{1,1,1,2,2,2,1,1,1,1},{1,2,2,2,4,2,4,2,2,1},{1,2,4,2,2,2,4,2,5,1},{1,1,1,4,4,1,1,1,1,1},{0,0,1,2,2,3,3,1,0,0},{0,0,1,3,3,3,3,1,0,0},{0,0,1,1,1,1,1,1,0,0}};
    int [][] ditu24={{1,1,1,1,1,1,0,0,0,1,1,1,1,1},{1,2,2,2,2,1,1,1,0,1,2,2,3,1},{1,2,2,4,2,4,2,1,0,1,3,3,3,1},{1,2,1,2,2,4,2,1,1,1,2,2,3,1},{1,2,2,4,4,4,2,2,2,4,2,5,3,1},{1,1,1,2,2,4,2,2,4,1,2,2,3,1},{0,0,1,2,2,4,1,4,2,1,3,3,3,1},{0,0,1,1,2,2,2,2,2,1,2,2,3,1},{0,0,0,1,1,1,1,1,1,1,1,1,1,1}};
    int [][] ditu25={{0,0,0,0,0,1,1,1,1,1,1},{0,1,1,1,1,1,3,2,2,2,1},{0,1,2,2,1,3,3,1,1,2,1},{0,1,2,2,4,3,3,2,2,2,1},{0,1,2,2,1,2,3,1,2,1,1},{1,1,1,2,1,1,4,1,2,2,1},{1,2,4,2,2,2,2,4,4,2,1},{1,2,1,4,1,2,2,1,2,2,1},{1,5,2,2,1,1,1,1,1,1,1},{1,1,1,1,1,0,0,0,0,0,0}};
    int [][] ditu26={{0,1,1,1,1,1,1,1,1,1,0,0,0},{0,1,2,2,2,1,1,2,2,1,1,1,1},{0,1,2,4,2,2,2,2,2,2,2,2,1},{0,1,1,4,1,1,1,2,1,1,2,2,1},{0,1,2,2,1,1,2,6,2,1,2,1,1},{0,1,2,4,3,3,3,3,3,3,2,1,0},{1,1,2,1,1,1,2,3,2,1,2,1,0},{1,2,2,2,2,2,4,1,1,1,4,1,0},{1,2,2,2,1,2,2,2,2,4,5,1,0},{1,1,1,1,1,4,1,2,1,1,1,1,0},{0,0,0,0,1,2,2,2,1,0,0,0,0},{0,0,0,0,1,1,1,1,1,0,0,0,0}};
    int [][] ditu27={{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1},{0,0,0,0,0,0,1,2,2,2,2,2,2,2,1},{0,0,0,0,0,0,1,2,1,2,1,2,1,2,1},{0,0,0,0,0,0,1,2,2,4,2,4,1,2,1},{1,1,1,1,1,1,1,2,2,2,4,2,2,2,1},{1,3,3,1,2,2,1,1,2,4,2,4,1,2,1},{1,3,3,2,2,2,1,1,2,4,2,4,2,2,1},{1,3,3,1,2,2,1,1,2,1,1,1,1,1,1},{1,3,3,1,2,1,2,4,2,4,2,1,0,0,0},{1,3,3,2,2,2,2,2,4,2,2,1,0,0,0},{1,2,2,1,1,1,2,5,2,1,1,1,0,0,0},{1,1,1,1,0,1,1,1,1,1,0,0,0,0,0}};
    int [][] ditu28={{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{1,1,1,1,1,2,2,1,0,0,0,0,0,0,0,0},{1,2,2,4,2,4,2,1,0,1,1,1,1,1,1,1},{1,2,2,2,4,2,2,1,0,1,6,3,6,3,6,1},{1,1,2,4,2,4,2,1,1,1,3,6,3,6,3,1},{0,1,4,2,4,2,2,1,2,2,6,3,6,3,6,1},{0,1,5,4,2,4,2,2,2,2,3,6,3,6,1,1},{0,1,4,2,4,2,2,1,2,2,6,3,6,3,6,1},{1,1,2,4,2,4,2,1,1,1,3,6,3,6,3,1},{1,2,2,2,4,2,2,1,0,1,6,3,6,3,6,1},{1,2,2,4,2,4,2,1,0,1,1,1,1,1,1,1},{1,1,1,1,1,2,2,1,0,0,0,0,0,0,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}};
    int [][] ditu29={{1,1,1,1,1,1,1,1,0},{1,3,3,3,3,3,3,1,0},{1,2,2,4,2,1,2,1,1},{1,2,4,2,1,2,4,2,1},{1,1,4,2,4,2,4,2,1},{0,1,2,2,5,2,2,2,1},{0,1,1,1,1,1,1,1,1}};
    int [][] ditu30={{0,0,1,1,1,1,1,1,1,1,1,1},{1,1,1,2,2,2,3,2,2,2,2,1},{1,2,2,2,1,1,4,1,1,2,2,1},{1,2,5,4,3,2,3,2,3,4,1,1},{1,1,2,4,1,1,4,1,1,2,1,0},{0,1,2,2,2,2,3,2,2,2,1,0},{0,1,1,1,1,1,1,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),new Ditu(ditu11),new Ditu(ditu12),new Ditu(ditu13),new Ditu(ditu14),new Ditu(ditu15),new Ditu(ditu16),new Ditu(ditu17),new Ditu(ditu18),new Ditu(ditu19),new Ditu(ditu20),new Ditu(ditu21),new Ditu(ditu22),new Ditu(ditu23),new Ditu(ditu24),new Ditu(ditu25),new Ditu(ditu26),new Ditu(ditu27),new Ditu(ditu28),new Ditu(ditu29),new Ditu(ditu30)};

//    定义一个当前关卡
    int guan=1;

//    定义一个最大关卡
    int maxguan=30;

//   定义一个变量判断是否通关
    boolean tongguan=false;

//    创建一个推箱子的小人
    Point man=new Point(4,4);
//    创建一个小人的影子
    Point man2= 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);

//        绘制空地
//        for (int i = 0; i < kongdi.length; i++) {
//            gf.setColor(Color.GRAY);
//            gf.fill3DRect(kongdi[i].x*size,kongdi[i].y*size+title,size,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.gray);
        gf.fillOval(man2.x*size,man2.y*size+title,size,size);

//        绘制推箱子的小人
        gf.setColor(Color.green);
        gf.fillOval(man.x*size,man.y*size+title,size,size);

//        当影子和小人重合是话两个半圆
            if (man.x==man2.x&&man.y==man2.y){
                gf.setColor(Color.gray);
                gf.fillArc(man.x*size,man.y*size+title,size,size,0,180);

            }

//        绘制当前关卡信息
        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_W) {
//            y-1是空地
            if(iscunzai(kongdi,new Point(man2.x,man2.y-1))==true){
//                y-1是空地,且空地上没有箱子
                if(iscunzai(box,new Point(man2.x,man2.y-1))==false){
                    man2.y--;
                }else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)
                    if ((iscunzai(kongdi,new Point(man2.x,man2.y-2))==true)&&(iscunzai(box,new Point(man2.x,man2.y-2))==false)){
//                      这种情况下是人和箱子都向上移动一格
                        for (int i = 0; i < box.length; i++) {
                            if(box[i].x==man2.x&&box[i].y==man2.y-1){
                                box[i].y--;
                                break;
                            }
                        }
                        man2.y--;
                        //判断所有箱子是否归位
                        if(iswin()==true){

                            if(guan<maxguan){//不是最后一关

                                guan++;
//                            加载新一关的地图
                                jiazaiditu(guan);
                            }else{//是最后一关
                                tongguan=true;
                            }

                        }

                    }
                }
            }

//        下
        }else if (key == KeyEvent.VK_S) {
            //            y-1是空地
            if(iscunzai(kongdi,new Point(man2.x,man2.y+1))==true){
//                y-1是空地,且空地上没有箱子
                if(iscunzai(box,new Point(man2.x,man2.y+1))==false){
                    man2.y++;
                }else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)
                    if ((iscunzai(kongdi,new Point(man2.x,man2.y+2))==true)&&(iscunzai(box,new Point(man2.x,man2.y+2))==false)){
//                      这种情况下是人和箱子都向上移动一格
                        for (int i = 0; i < box.length; i++) {
                            if(box[i].x==man2.x&&box[i].y==man2.y+1){
                                box[i].y++;
                                break;
                            }
                        }
                        man2.y++;
                        //判断所有箱子是否归位
                        if(iswin()==true){
                            if(guan<maxguan){
                                guan++;
//                            加载新一关的地图
                                jiazaiditu(guan);
                            }else{
                                tongguan=true;
                            }

                        }

                    }
                }
            }
//            左
        }else if(key == KeyEvent.VK_A){
            if(iscunzai(kongdi,new Point(man2.x-1,man2.y))==true){
//                y-1是空地,且空地上没有箱子
                if(iscunzai(box,new Point(man2.x-1,man2.y))==false){
                    man2.x--;
                }else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)
                    if ((iscunzai(kongdi,new Point(man2.x-2,man2.y))==true)&&(iscunzai(box,new Point(man2.x-2,man2.y))==false)){
//                      这种情况下是人和箱子都向上移动一格
                        for (int i = 0; i < box.length; i++) {
                            if(box[i].x==man2.x-1&&box[i].y==man2.y){
                                box[i].x--;
                                break;
                            }
                        }
                        man2.x--;
                        //判断所有箱子是否归位
                        if(iswin()==true){
                            if(guan<maxguan){
                                guan++;
//                            加载新一关的地图
                                jiazaiditu(guan);
                            }else{
                                tongguan=true;
                            }

                        }

                    }
                }
            }

//            右
        }else if (key == KeyEvent.VK_D) {
            if(iscunzai(kongdi,new Point(man2.x+1,man2.y))==true){
//                y-1是空地,且空地上没有箱子
                if(iscunzai(box,new Point(man2.x+1,man2.y))==false){
                    man2.x++;
                }else{//y-2是一个空地,且没有箱子
//                    y-2是一个没有箱子的空地(这种就是上边已经有了一个箱子,箱子的上边再没有箱子且是空地)
                    if ((iscunzai(kongdi,new Point(man2.x+2,man2.y))==true)&&(iscunzai(box,new Point(man2.x+2,man2.y))==false)){
//                      这种情况下是人和箱子都向上移动一格
                        for (int i = 0; i < box.length; i++) {
                            if(box[i].x==man2.x+1&&box[i].y==man2.y){
                                box[i].x++;
                                break;
                            }
                        }
                        man2.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;
//                    影子小人
                    man2.x=j;
                    man2.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;
//                    影子小人
                    man2.x=j;
                    man2.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) {
        Pushbox006 pushbox=new Pushbox006();
            pushbox.Tian();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值