ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java推箱子

2020-12-22 11:04:04  阅读:184  来源: 互联网

标签:箱子 java midi int awt import public


 

 

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+"关!!!\n是否要进入下一关?";
            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,midi,int,awt,import,public
来源: https://www.cnblogs.com/kekexxr/p/12292135.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有