⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boxpanel.java

📁 java编写的一个推箱子游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:


package tuixiangzi;

/**
 *
 * @author Cheny
 */

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Stack;
import java.io.*;

class  BoxPanel extends JPanel implements KeyListener, MouseListener, MouseMotionListener
                                       //绘图的面板        
{
	int lastmap=10;//地图数
        static int[][] nowmap;
        int[][] bemap;
	int mapX,mapY;
	Image[] myImage;
        Map Nmap;
	Map Bmap;
	int len=30;
        public  static int level=1;
	Stack <Integer>mystack=new Stack<Integer>();
        Stack  Smaze=new Stack();
        Stack mouseclick=new Stack();
        public  static Stack  <Integer>Smovements=new Stack<Integer>();
        public static int movements=0;
        public static int score=0; 
        public static int backmovements=0; 
        
       
  BoxPanel(){	
		setBounds(0,0,410,380);
		setBackground(Color.white);
		addKeyListener(this);
                addMouseMotionListener(this);
                addMouseListener(this);
                myImage=new Image[7];  //7张图片
		for(int i=0; i<=6; i++){
		      myImage[i] = Toolkit.getDefaultToolkit().getImage("pic\\"+i+".gif");
		}
		setVisible(true);
	}
public void play(int i)  {   //游戏
        try {
    
            Nmap=new Map(i);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
          nowmap=Nmap.getmap();
          mapX=Nmap.getX();
	  mapY=Nmap.getY();
	 if(i==0)
                 
            try {
                Bmap=new Map(level);
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
          else  
            try {Bmap=new Map(i);
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
          bemap=Bmap.getmap();    
          
          if(i==0){
              movements=Nmap.getmovements();
              level=Nmap.getsavelevel();
              score=Nmap.getscore();
              backmovements=Nmap.getbackmovements();
         }
          Smovements.push( movements);
     
        repaint();
}
 public  int maxlevel()  {   return lastmap;   }

public void paint(Graphics page)//绘图
	{
		for(int i=0; i<16; i++)
		     for(int j=0; j<16; j++){
			     page.drawImage(myImage[nowmap[j][i]],i*len,j*len,this);
			 }		
		page.setColor( Color.blue);   
                page.setFont(new Font("楷体_2312",Font.BOLD,len));
                page.drawString("STAGE:",40,40);  
                page.drawString(String.valueOf(level),160,40);   
                page.drawString("SCORE:",220,40);  
                page.drawString(String.valueOf(score),340,40);   
 }

public void keyPressed(KeyEvent e) {    //键盘事件
	
		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();}
                if(e.getKeyCode()==KeyEvent.VK_F1 ){
                          play(level);  
                          requestFocus();
			  remove();
                     }
                if( e.getKeyCode()==KeyEvent.VK_A){ //上一关     
		        level--;
			if(level<1){
                              level++;
                              JOptionPane.showMessageDialog(this,"本关是第一关");
                              requestFocus();
                            }
			else {
			      play(level);    
                              requestFocus();   
                              Smovements.pop();   
                              Smovements.pop();   
                              movements=Smovements.peek();
                            }
			remove();
                    }
                if(e.getKeyCode()==KeyEvent.VK_S){ //下一关
		         level++;
			if(level>lastmap){
                            JOptionPane.showMessageDialog(this,"本关已是最后一关");
                            level=1;  
                            play(level); 
                            requestFocus();
                         }
			else {
				play(level);  
                                requestFocus();
			   }
			remove();
                    }
                if(e.getKeyCode()==KeyEvent.VK_D){   //选关
			String lel=JOptionPane.showInputDialog(this,"请输入您要转到的关卡号:(1~10)");
                        level=Integer.parseInt(lel);
                        remove();
			if(level<=1&&level<=10){
                               play(level);
			       requestFocus();
                           }
			else{
			       JOptionPane.showMessageDialog(this, "没有这一关!!!");
                               requestFocus();
			    }
                     } 
               if(e.getKeyCode()==KeyEvent.VK_F2) {    //悔一步
		       if(isMystackEmpty() && ismouseclickEmpty() )
                                JOptionPane.showMessageDialog(this, "您还未移动!!!");
		       else{
                            switch(back()){
                               case 10:  upback(10);           break;
                               case 11:  upback(11);           break;   
                               case 20:  downback(20);         break;
                               case 21:  downback(21);         break;
                               case 30:  leftback(30);         break;
                               case 31:  leftback(31);         break;
                               case 40:  rightback(40);        break;
                               case 41:  rightback(41);        break;
                               case 1 :  mouseclickback();    break;
                             }
                        }
                       backmovements++; 
                      requestFocus();
                      
                  }
               if(pass()){
                        if(level==lastmap){  JOptionPane.showMessageDialog(this, "恭喜您通过最后一关!!!");  }
			else{   
                                 score=score+1000*level/(movements*(backmovements+1));
                                 movements=0;
                                 backmovements=0;
                                 level++;  
                                 play(level);
                            }
			mystack.removeAllElements();
                        mouseclick.removeAllElements();
		}
          }  
 public void keyTyped(KeyEvent e){}
 public void keyReleased(KeyEvent e){}
boolean isMystackEmpty(){  
            return mystack.isEmpty(); 
      }//判断栈是否为空
boolean ismouseclickEmpty(){ 
            return mouseclick.isEmpty(); 
   }//判断鼠标点击栈是否为空
int back() {  
     return (Integer)mystack.pop(); 
    }         //返回栈顶

void remove(){ 
         mystack.removeAllElements();   
         mouseclick.removeAllElements();
 }//清空两个栈
	
void moveup(){  //上移
          if(nowmap[mapY-1][mapX]==2||nowmap[mapY-1][mapX]==4){ //判断有无障碍
	      if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
		   nowmap[mapY][mapX]=4;
	      else  
                  nowmap[mapY][mapX]=2;
	     nowmap[mapY-1][mapX]=5;
	     repaint();
             mapY--;  
             mystack.push(10);
	 }
	 else if(nowmap[mapY-1][mapX]==3) {  //判断前面是否箱子
		if(nowmap[mapY-2][mapX]==4) {
		      if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			   nowmap[mapY][mapX]=4;
		      else 
                           nowmap[mapY][mapX]=2;
		      nowmap[mapY-1][mapX]=5;
		      nowmap[mapY-2][mapX]=6;
		      repaint();
                      mapY--;  
                      movements++;
                      mystack.push(11);	
		 }
		else if(nowmap[mapY-2][mapX]==2){
		     if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			  nowmap[mapY][mapX]=4;
		     else 
                          nowmap[mapY][mapX]=2;
		    nowmap[mapY-1][mapX]=5;
		    nowmap[mapY-2][mapX]=3;
		    repaint();
                    mapY--;  
                    movements++;
                    mystack.push(11);
	        }
	       else {
                    nowmap[mapY][mapX]=5;
                    repaint();
                }
	}
	else if(nowmap[mapY-1][mapX]==6){  //是否在目的地的箱子
		if(nowmap[mapY-2][mapX]==4){
		     if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			  nowmap[mapY][mapX]=4;
		     else 
                          nowmap[mapY][mapX]=2;
		     nowmap[mapY-1][mapX]=5;
		     nowmap[mapY-2][mapX]=6;
		     repaint();
                     mapY--;  
                     movements++;
                     mystack.push(11);
		}
		else if(nowmap[mapY-2][mapX]==2){
		      if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			  nowmap[mapY][mapX]=4;
		      else 
                          nowmap[mapY][mapX]=2;
		      nowmap[mapY-1][mapX]=5;
		      nowmap[mapY-2][mapX]=3;
		      repaint();
                      mapY--;   
                      movements++;
                      mystack.push(11);
		}
		else{
                     nowmap[mapY][mapX]=5;
                     repaint();
                }
	}
	if(nowmap[mapY-1][mapX]==1){
	    nowmap[mapY][mapX]=5;
            repaint();
	}
}
	
void upback(int n){  //上方回退
         if(n==10){
	       if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
		      nowmap[mapY][mapX]=4;
	       else  nowmap[mapY][mapX]=2;
	    }
	 else if(n==11){
	      if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
		     nowmap[mapY][mapX]=6;
              else  nowmap[mapY][mapX]=3;
	      if(bemap[mapY-1][mapX]==4||bemap[mapY-1][mapX]==6)
		     nowmap[mapY-1][mapX]=4;
	      else  nowmap[mapY-1][mapX]=2;
              movements--;
           }  
	     nowmap[mapY+1][mapX]=5;
	     repaint();  mapY++;   
	}
    
void movedown(){
           if(nowmap[mapY+1][mapX]==2||nowmap[mapY+1][mapX]==4){
	        if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
		     nowmap[mapY][mapX]=4;
	        else 
                    nowmap[mapY][mapX]=2;
	       nowmap[mapY+1][mapX]=5;
	       repaint();
               mapY++;  
               mystack.push(20);
	   }
	  else if(nowmap[mapY+1][mapX]==3){
		if(nowmap[mapY+2][mapX]==4){
		   if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
		        nowmap[mapY][mapX]=4;
		   else 
                        nowmap[mapY][mapX]=2;
		   nowmap[mapY+1][mapX]=5;
		   nowmap[mapY+2][mapX]=6;
		   repaint();
                   mapY++;  
                   movements++;
                   mystack.push(21);
		}
		else if(nowmap[mapY+2][mapX]==2){
			if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			      nowmap[mapY][mapX]=4;
			else  
                              nowmap[mapY][mapX]=2;
			nowmap[mapY+1][mapX]=5;
			nowmap[mapY+2][mapX]=3;
			repaint();
                        mapY++;   
                        movements++;
                        mystack.push(21);
		}
		else {
                     nowmap[mapY][mapX]=5;
                     repaint();
                }
	  }
	else if(nowmap[mapY+1][mapX]==6){
		if(nowmap[mapY+2][mapX]==4){
		    if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			nowmap[mapY][mapX]=4;
		   else 
                        nowmap[mapY][mapX]=2;
		   nowmap[mapY+1][mapX]=5;
		   nowmap[mapY+2][mapX]=6;
		   repaint();
                   mapY++;    
                   movements++;
                   mystack.push(21);
	     }
	else if(nowmap[mapY+2][mapX]==2){
		if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
			nowmap[mapY][mapX]=4;
		else 
                       nowmap[mapY][mapX]=2;
		nowmap[mapY+1][mapX]=5;
		nowmap[mapY+2][mapX]=3;
		repaint();
                mapY++;    
                movements++;
                mystack.push(21);
	}
	else {
               nowmap[mapY][mapX]=5;
               repaint();
        }
       }	
	else if(nowmap[mapY+1][mapX]==1){
		nowmap[mapY][mapX]=5;
                repaint();
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -