zoukankan      html  css  js  c++  java
  • java推箱子

    package pushbox;
    
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class gameframe extends JFrame implements ActionListener,MouseListener ,KeyListener{
        //主面板类
        final int WALL=1,BOX=2,BOXONEND=3,END=4,MANDOWN=5,MANLEFT=6,MANRIGHT=7,MANUP=8,GRASS=9,MANDOWNONEND=10,MANLEFTONEND=11,MANRIGHTONEND=12,
                MANUPONEND=13;
        private Image ibuffer;
        private Graphics gbuffer;        
        private int grade=0;
        
        private int row=7,column=7,leftX=0,leftY=0;
                   //记载人的行号列号      地图左上角的行列号
        private int mapRow=0,mapColumn=0;
        private int width=0,height=0;//记载屏幕的大小!!
        private boolean acceptKey=true;
        //程序用到的图片
        private Image pic[]=null;
        private int[][]mymap=null;
        private ArrayList list=new ArrayList();
        Sound sound;
        //在构造方法中初始化游戏地图,清空悔棋信息列表,同时播放MIDI背景音乐。
        public gameframe() {
            super("推箱子");
            setSize(600,600);
            setResizable(false);
            setLocation(300,20);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container cont=getContentPane();
            cont.setLayout(null);
            cont.setBackground(Color.black);
            //最初的13张图片
            getPic();
            width=this.getWidth();
            height=this.getHeight();
            initMap();//初始化grade地图,清空悔棋列表信息
            this.addKeyListener( this);
            this.addMouseListener(this);
            this.setFocusable(true);
            setVisible(true);
            sound=new Sound();
            sound.loadSound();
            
        
        }
        public void initMap() {
            mymap=getMap(grade);
            list.clear();
            getMapSizeAndPosition();
            getManPosition();
        }
        public void getManPosition() {
            for(int i=0;i<mymap.length;i++) {
                for(int j=0;j<mymap[0].length;j++)
                    if(mymap[i][j]==MANDOWN||mymap[i][j]==MANDOWNONEND
                    ||mymap[i][j]==MANUP||mymap[i][j]==MANUPONEND
                    ||mymap[i][j]==MANLEFT||mymap[i][j]==MANLEFTONEND
                    ||mymap[i][j]==MANRIGHT||mymap[i][j]==MANRIGHTONEND) {
                        row=i;
                        column=j;
                        break;
                    }
                
            }
        }
        private void getMapSizeAndPosition() {//获取游戏区域大小及显示游戏的左上角坐标位置
            mapRow=mymap.length;
            mapColumn=mymap[0].length;
            leftX=(width-mymap[0].length*30)/2;
            leftY=(height-mymap.length*30)/2;
            
        }
        public void getPic() {
            pic=new Image[14];
            for(int i=0;i<13;i++) {
                pic[i]=Toolkit.getDefaultToolkit().getImage("D://test//photo//"+i+".jpg");
            }
        }
        public int grassOrEnd(int man) {//判断人所在的位置是目的地还是通道
            int result=GRASS;
            if(man==MANDOWNONEND||man==MANLEFTONEND||man==MANRIGHTONEND||man==MANUPONEND) {
                result=END;
                
            }
            return result;
        }
        private void moveUp() {//向上
            //上一位是墙
            if(mymap[row-1][column]==WALL)
                return;
            //上一位是box或boxonend,则需考虑上上一位
            if(mymap[row-1][column]==BOX||mymap[row-1][column]==BOXONEND) {
                //上上一位是目的地或通道
                if(mymap[row-2][column]==END||mymap[row-2][column]==GRASS) {
                    map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                    list.add(currMap);
                    int boxTemp=mymap[row-2][column]==END?BOXONEND:BOX;
                    int manTemp=mymap[row-1][column]==BOX?MANUP:MANUPONEND;
                    mymap[row-2][column]=boxTemp;
                    mymap[row-1][column]=manTemp;
                    mymap[row][column]=grassOrEnd(mymap[row][column]);
                    //修改人离开后人的坐标
                    row--;
                }
                
                
            }
            if(mymap[row-1][column]==GRASS) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row-1][column]=MANUP;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                row--;
            }
            if(mymap[row-1][column]==END) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row-1][column]=MANUPONEND;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                row--;}
    
            
        }private void moveDown() {//向下
            //下一位是墙
            if(mymap[row+1][column]==WALL)
                return;
            //下一位是box或boxonend,则需考虑下下一位
            if(mymap[row+1][column]==BOX||mymap[row+1][column]==BOXONEND) {
                //下下一位是目的地或通道
                if(mymap[row+2][column]==END||mymap[row+2][column]==GRASS) {
                    map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                    list.add(currMap);
                    int boxTemp=mymap[row+2][column]==END?BOXONEND:BOX;
                    int manTemp=mymap[row+1][column]==BOX?MANUP:MANUPONEND;
                    mymap[row+2][column]=boxTemp;
                    mymap[row+1][column]=manTemp;
                    mymap[row][column]=grassOrEnd(mymap[row][column]);
                    //修改人离开后人的坐标
                    row++;
                }
                
                
            }if(mymap[row+1][column]==GRASS) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row+1][column]=MANUP;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                row++;
            }
            if(mymap[row+1][column]==END) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row+1][column]=MANUPONEND;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                row++;}
            
            
        }private void moveLeft() {//向左
            //上一位是墙
            if(mymap[row][column-1]==WALL)
                return;
            //上一位是box或boxonend,则需考虑上上一位
            if(mymap[row][column-1]==BOX||mymap[row][column-1]==BOXONEND) {
                //上上一位是目的地或通道
                if(mymap[row][column-2]==END||mymap[row][column-2]==GRASS) {
                    map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                    list.add(currMap);
                    int boxTemp=mymap[row][column-2]==END?BOXONEND:BOX;
                    int manTemp=mymap[row][column-1]==BOX?MANUP:MANUPONEND;
                    mymap[row][column-2]=boxTemp;
                    mymap[row][column-1]=manTemp;
                    mymap[row][column]=grassOrEnd(mymap[row][column]);
                    //修改人离开后人的坐标
                    column--;
                }
                
                
            }if(mymap[row][column-1]==GRASS) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row][column-1]=MANUP;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                column--;
            }
            if(mymap[row][column-1]==END) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row][column-1]=MANUPONEND;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                column--;}
            
            
        }private void moveRight() {//向右
            //上一位是墙
            if(mymap[row][column+1]==WALL)
                return;
            //上一位是box或boxonend,则需考虑上上一位
            if(mymap[row][column+1]==BOX||mymap[row][column+1]==BOXONEND) {
                //上上一位是目的地或通道
                if(mymap[row][column+2]==END||mymap[row][column+2]==GRASS) {
                    map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                    list.add(currMap);
                    int boxTemp=mymap[row][column+2]==END?BOXONEND:BOX;
                    int manTemp=mymap[row][column+1]==BOX?MANUP:MANUPONEND;
                    mymap[row][column+2]=boxTemp;
                    mymap[row][column+1]=manTemp;
                    mymap[row][column]=grassOrEnd(mymap[row][column]);
                    //修改人离开后人的坐标
                    column++;
                }
                
                
            }if(mymap[row][column+1]==GRASS) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row][column+1]=MANUP;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                column++;
            }
            if(mymap[row][column+1]==END) {
                map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
                list.add(currMap);
                mymap[row][column+1]=MANUPONEND;
                mymap[row][column]=grassOrEnd(mymap[row][column]);
                //修改人离开后人的坐标
                column++;}
            
            
        }
        public boolean isFinished() {
            for(int i=0;i<mapRow;i++)
                for(int j=0;j<mapColumn;j++)
                    if(mymap[i][j]==END||mymap[i][j]==MANDOWNONEND||mymap[i][j]==MANUPONEND||mymap[i][j]==MANLEFTONEND||mymap[i][j]==MANRIGHTONEND) {
                        return  false;
                        
                    }
            return true;
        }
        public void paint(Graphics g) {//绘制地图
            for(int i=0;i<mapRow;i++)
                for(int j=0;j<mapColumn;j++) {
                    if(mymap[i][j]!=0)
                        g.drawImage(pic[mymap[i][j]],leftX+j*30,leftY+i*30,this);
                    g.setColor(Color.RED);
                    g.setFont(new Font("楷体_2312",Font.BOLD,30));
                    g.drawString("现在是第", 150, 140);
                    g.drawString(String.valueOf(grade+1), 310, 140);
                    g.drawString("关", 360, 140);
                }}
            
            
            
        
        /*public void paint1(Graphics g) {
            if(ibuffer==null) {
                ibuffer=createImage(this.getSize().width,this.getSize().height);
                gbuffer=ibuffer.getGraphics();
            }gbuffer.setColor(getBackground());
            gbuffer.fillRect(0, 0, this.getSize().width, this.getSize().height);
            for(int i=0;i<mapRow;i++)
                for(int j=0;j<mapColumn;j++) {
                    if(mymap[i][j]!=0) 
                      gbuffer.drawImage(pic[mymap[i][j]],leftX+j*30,leftY+i*30,this);
            gbuffer.setColor(Color.RED);
            gbuffer.setFont(new Font("楷体_2312",Font.BOLD,30));
            gbuffer.drawString("现在是第", 150, 140);
            gbuffer.drawString(String.valueOf(grade+1), 310, 140);
            gbuffer.drawString("关", 360, 140);
            g.drawImage(ibuffer, 0, 0, this);
            
        }}*/
        public void update(Graphics g) {
            paint(g);
        }
        public int getManX() {
            return row;
        }
        public int getManY() {
            return column;
        }
        public int getGrade() {
            return grade;
        }
        public int[][] getMap(int grade){
            return map.getMap(grade)
    ;    }
        //显示提示信息对话框!!
        public void DisplayToast(String str ) {
            JOptionPane.showMessageDialog(null, str,"提示",JOptionPane.ERROR_MESSAGE);
        }
        //撤销移动操作
        public void undo() {
            if(list.size()>0) {
                map1 priorMap=(map1)list.get(list.size()-1);
                mymap=priorMap.getMap();
                row=priorMap.getManX();
                column=priorMap.getManY();
                repaint();
                list.remove(list.size()-1);
            }
            else {
                DisplayToast("无法在撤退了!");
            }
        }
        //实现下一关的初始化,
        public void nextGrade() {
            if(grade>=map.getCount()-1) {
                DisplayToast("恭喜你完成了所有关卡!!!!");
                sound.mystop();
                acceptKey=false;
            }else {
                grade++;
                initMap();
                repaint();
                acceptKey=true;
            }
        }
        //实现上一关初始化
        public void priorGrade() {
            grade--;
            acceptKey=true;
            if(grade<0)
                grade=0;
            initMap();
            repaint();
            
        }
        //键盘相关事件
        
        @Override
        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        
        
        
        public void mouseClicked(MouseEvent e) {
            if(e.getButton()==MouseEvent.BUTTON3)
                undo();
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }
    
    
    
    
    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        if(e.getKeyCode()==KeyEvent.VK_UP) {
            moveUp();
            
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN) {
            moveDown();
            
        }if(e.getKeyCode()==KeyEvent.VK_LEFT) {
            moveLeft();
            
        }if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
            moveRight();
            
        }
        repaint();
         this.setFocusable(true);
        if(isFinished()) {
            //禁用按键
            acceptKey=false;
            if(grade==map.getCount())
                JOptionPane.showMessageDialog(this,"恭喜通过最后一关");
            else {
                String msg="恭喜您通过第"+grade+"关!!!
    是否要进入下一关?";
                int type=JOptionPane.YES_NO_OPTION;
                String title="pass";
                int choice=0;
                choice=JOptionPane.showConfirmDialog(null, msg,title,type);
                if(choice==1)
                    System.exit(0);
                else if(choice==0) {
                    //进入下一关
                    acceptKey=true;
                    nextGrade();
                }
            }
            
        }
        
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        
    }public static void main(String args[]) {
        new gameframe();
    }
    }
    package pushbox;
    import java.io.InputStream;
    public class map {
        static int mymap[][][]= {
                {
        
                {0,0,1,1,1,0,0,0},
                {0,0,1,9,4,0,0,0},
                {0,0,1,9,2,1,1,1},
                {1,4,9,2,5,9,1,1},
                {1,1,1,9,2,1,0,0},
                {0,0,0,1,4,1,0,0},
                {0,0,0,1,1,1,0,0}
                },
                {
            {1,1,1,1,1,1,0,0,0},
            {1,9,9,5,1,1,0,0,0},
            {1,9,2,2,1,1,1,1,1},
            {1,9,2,9,1,1,1,4,1},
            {1,1,1,9,1,1,1,4,1},
            {0,1,1,9,9,9,9,4,1},
            {0,1,9,9,9,1,9,9,1},
            {0,1,9,9,9,1,1,1,1},
            {0,1,1,1,1,1,0,0,0}
                }
                };
           static int count=mymap.length;
           public static int[][] getMap(int grade){
               int temp[][];
               if(grade>=0&&grade<count)
                   temp=mymap[grade];
               else
                   temp=mymap[0];
               int row=temp.length;
               int column=temp[0].length;
               int[][] result=new int[row][column];
               for(int i=0;i<row;i++) {
                   for(int j=0;j<column;j++) {
                       result[i][j]=temp[i][j];
                       
                   }
               }
               return result;
               
               
           }
           public static int getCount() {
               return count;
           }
    
    
    }
    package pushbox;
    
    public class map1 {
        int manX=0;int manY=0; int mymap[][];
        int grade;
        //此方法用于撤销,撤销只需要人的位置和地图的当前状态!!!
        public map1(int manX,int manY,int[][]mymap) {
            this.manX=manX;
            this.manY=manY;
            int row=mymap.length;
            int column=mymap[0].length;
            int temp[][]=new int[row][column];
            for(int i=0;i<row;i++)
                for(int j=0;j<column;j++) {
                    temp[i][j]=mymap[i][j];
                    
                }
            this.mymap=temp;
        }//次构造方法用于保存操作!!
        //回复地图是需要人的位置,地图的当前状态,和关卡数!!
        public map1(int manX,int manY,int[][]mymap,int grade) {
            this(manX,manY,mymap);
            this.grade=grade;
            
            
        }
        public int getManX() {
            return manX;
        }
        public int getManY() {
            return manY;
        }
        public int[][] getMap(){
            return mymap;
        }
        public int getGrade() {
            return grade;
        }
        
    
    }
    package pushbox;//播放背景音乐
    
    import java.io.File;
    import java.io.IOException;
    
    import javax.sound.midi.InvalidMidiDataException;
    import javax.sound.midi.MidiSystem;
    import javax.sound.midi.Sequence;
    import javax.sound.midi.Sequencer;
    
    public class Sound {
        String path=new String("D://test//music//");
        String file=new String("starwars.mid");
        Sequence seq;
        boolean sign;
        Sequencer midi;
        void loadSound() {
            try {
                seq=MidiSystem.getSequence(new File(path+file));
                midi=MidiSystem.getSequencer();
                midi.open();
                midi.setSequence(seq);
                midi.start();
                midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
            } catch (Exception e) {
                
                
            
                e.printStackTrace();
                sign=true;}
            
            
        }
            void mystop() {
                midi.stop();
                midi.close();
                sign=false;
            }
            boolean isplay() {
                return sign;
            }
            void setMusic(String e) {
                file=e;
            }
            
    }
  • 相关阅读:
    Java常用类库(二):Iterator迭代器和子范围视图
    Java常用类库(一) : Object 和日期类的简单使用
    MyBatis的逆向工程
    AdminLTE介绍和zTree的简单使用
    MyBatis分页组件--PageHelper
    SpringAop--系统日志简例
    Shiro
    Mysql(三):多表查询和存储程序
    MySql(二):常见的那些个约束
    正则表达式一些用法
  • 原文地址:https://www.cnblogs.com/kekexxr/p/12292135.html
Copyright © 2011-2022 走看看