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

📄 boxman.java

📁 一个用JAVA编写的推箱子游戏
💻 JAVA
字号:
package boxman;
import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.awt.event.*;

public class BoxMan extends Applet implements Runnable, KeyListener, ActionListener {
  private boolean isComplete, keyEvent, missionAccomplished, flash;
  private Image[] showImages;
  private Image currentImage, human1, human2;
  private Label prompt = new Label("");
  private TextField input = new TextField(7);
  private int totalImages = 14,
              imageLength = 32,
              currentLevel = 1,
              mapWidth = 15,
              currentX, currentY, keyCode,
              manX,manY,tmp1ManX,tmp1ManY;
  private BasicUnit[][] block = new BasicUnit[mapWidth][mapWidth];
  private Thread thread;
  private int[][] map,tmp1Map;            //存储地图
  public void init() {
    isComplete = false; keyEvent = false; missionAccomplished = false; flash = false;
    keyCode = 0;
    prompt.setText("  BoxMan  Author:mhb  Level:");
    add(prompt);
    add(input);
    LevelMap basicMap = new LevelMap(0);
    map = basicMap.getLevelMap();
    manX = basicMap.getManX();
    manY = basicMap.getManY();
    boolean takeMap = false;
    LevelMap tmpMap = new LevelMap(currentLevel);
    tmp1Map = tmpMap.getLevelMap();
    tmp1ManX = tmpMap.getManX();
    tmp1ManY = tmpMap.getManY();
    manX = tmp1ManX;
    manY = tmp1ManY;
    for(int i=0; i<mapWidth; i++)
      for(int j=0; j<mapWidth; j++)
        map[i][j] = tmp1Map[i][j];
    takeMap = true;
    if(!takeMap){}
    showImages = new Image[totalImages];
    for(int i=0; i<totalImages; i++) {
      showImages[i] = getImage(getDocumentBase(),"bmp\\Bmp"+i+".bmp");
    }
    human1 = showImages[10];
    human2 = showImages[11];
    currentX = manX; currentY = manY;
    input.setText(""+currentLevel);
    this.addKeyListener(this);

    input.addActionListener(this);
  }

  public void start() {
    for(int i=0; i<mapWidth; i++)
      for(int j=0; j<mapWidth; j++) {
        currentImage = showImages[map[j][i]];
        block[i][j] = new BasicUnit(currentImage,i*imageLength,j*imageLength);
      }
    thread = new Thread(this, "human");
    thread.start();
  }

  public void paint(Graphics g) {
    for(int i=0; i<mapWidth; i++)
      for(int j=0; j<mapWidth; j++)
        block[i][j].drawSelf(g);
        //g.drawImage(currentImage,x,y,this);
    if(missionAccomplished&(!flash)) {
      g.drawImage(human1,currentX*32,currentY*32,this);
      victory();
    }
  }

  public void run() {
    int count = 0;
    Graphics g;
    g = getGraphics();
    while((!isComplete) && (!flash)) {
      isComplete = true;
      if(count<=5) {
        g.drawImage(human1,currentX*32,currentY*32,this);
        for(int i=0;i<mapWidth;i++)
          for(int j=0;j<mapWidth;j++) {
            if(map[j][i] == 4)
              g.drawImage(showImages[3],i*32,j*32,this);
            if(map[j][i] == 3)
              isComplete = false;
        }
      } else {
        g.drawImage(human2,currentX*32,currentY*32,this);
        for(int i=0;i<mapWidth;i++)
          for(int j=0;j<mapWidth;j++) {
            if(map[j][i] ==4)
              g.drawImage(showImages[4],i*32,j*32,this);
            if(map[j][i] == 3)
              isComplete = false;
          }
          if(count == 10)
            count = 0;
      }
      try{Thread.sleep(100);}catch(InterruptedException e){}
      count++;
      if(keyEvent) {
        switch(keyCode) {
          case 37 : moveLeft();  break;
          case 38 : moveUp();    break;
         case 39 : moveRight(); break;
         case 40 : moveDown();  break;
          default :
        }
      keyCode = 0; keyEvent = false;
      }
   }
    missionAccomplished = true;
    if(!flash)
      victory();
  }

  public void victory() {
    Graphics g;
    g = getGraphics();
    Color oldColor;
    Font  oldFont;
    g.setColor(new Color(192,192,192));
    g.fillRect(120,150,250,100);
    g.setColor(new Color(250,250,250));
    g.drawLine(120,150,370,150);
    g.drawLine(120,150,120,250);
    g.setColor(new Color(0,0,0));
    g.drawLine(370,250,120,250);
    g.drawLine(370,250,370,150);
    g.setColor(new Color(255,0,0));
    g.setFont(new Font("TimesRoman",Font.BOLD,12));
    g.drawString("Congratulate! Press 'Enter' to nextlevel.",170,200);
  }

  public void reLoad() {
    destroy();
    currentLevel++;
    init();
    start();
    repaint();
  }
  public void keyPressed(KeyEvent e) {
    keyCode = e.getKeyCode();
    keyEvent = true;
    if(missionAccomplished & keyCode == 10) reLoad();
  }

  public void keyReleased(KeyEvent e){}

  public void keyTyped(KeyEvent e){}

  public void actionPerformed(ActionEvent e) {
    currentLevel = Integer.parseInt(input.getText());
    currentLevel--;
    flash = true;
    while(missionAccomplished)
      try{Thread.sleep(100);}catch(InterruptedException ioe){}
    try{Thread.sleep(100);}catch(InterruptedException ioe){}
    reLoad();
  }

  public void paintBlock(int x, int y) {
    Graphics g;
    g = getGraphics();
    block[x][y].currentImage = showImages[map[y][x]];
    block[x][y].drawSelf(g);
  }

  public void moveLeft() {
    if(map[currentY][currentX-1] != 1) {
      if(map[currentY][currentX-1] == 2 | map[currentY][currentX-1] == 5) {
        paintBlock(currentX,currentY);
        currentX = currentX -1;
        human1 = showImages[6];
        human2 = showImages[7];
      } else {
        if((map[currentY][currentX-1] == 3 | map[currentY][currentX-1] == 4) & (map[currentY][currentX-2] == 2 | map[currentY][currentX-2] == 5)) {
          human1 = showImages[6];
          human2 = showImages[7];
          if(map[currentY][currentX-1] == 3) {
            if(map[currentY][currentX-2] == 2) map[currentY][currentX-2] = 3;
            else map[currentY][currentX-2] = 4;
            map[currentY][currentX-1] = 2;
            paintBlock(currentX,currentY);
            paintBlock(currentX-2,currentY);
            currentX = currentX -1;
          } else {
            if(map[currentY][currentX-2] == 2)
              map[currentY][currentX-2] = 3;
            else
              map[currentY][currentX-2] = 4;
            map[currentY][currentX-1] = 5;
            paintBlock(currentX,currentY);
            paintBlock(currentX-2,currentY);
            currentX = currentX -1;
          }
        }
      }
    }
   }
    public void moveUp()
    {
        if(map[currentY-1][currentX] != 1)
        {
            if(map[currentY-1][currentX] == 2 | map[currentY-1][currentX] == 5)
            {
                paintBlock(currentX,currentY);
                currentY = currentY -1;
                human1 = showImages[8];
                human2 = showImages[9];
            }
            else
            {
            if((map[currentY-1][currentX] == 3 | map[currentY-1][currentX] == 4) & (map[currentY-2][currentX] == 2 | map[currentY-2][currentX] == 5))
            {
                human1 = showImages[8];
                human2 = showImages[9];
                if(map[currentY-1][currentX] == 3)
                {
                    if(map[currentY-2][currentX] == 2)
                        map[currentY-2][currentX] = 3;
                    else
                        map[currentY-2][currentX] = 4;
                        map[currentY-1][currentX] = 2;
                        paintBlock(currentX,currentY);
                        paintBlock(currentX,currentY-2);
                        currentY = currentY -1;
                }
                else
                {
                    if(map[currentY-2][currentX] == 2)
                        map[currentY-2][currentX] = 3;
                    else
                        map[currentY-2][currentX] = 4;

                        map[currentY-1][currentX] = 5;
                        paintBlock(currentX,currentY);
                        paintBlock(currentX,currentY-2);
                        currentY = currentY -1;
                }
            }
            }
        }
    }
    public void moveRight()
    {
        if(map[currentY][currentX+1] != 1)
        {
            if(map[currentY][currentX+1] == 2 | map[currentY][currentX+1] == 5)
            {
                paintBlock(currentX,currentY);
                currentX = currentX +1;
                human1 = showImages[12];
                human2 = showImages[13];
            }
            else
            {
            if((map[currentY][currentX+1] == 3 | map[currentY][currentX+1] == 4) & (map[currentY][currentX+2] == 2 | map[currentY][currentX+2] == 5))
            {
                human1 = showImages[12];
                human2 = showImages[13];
                if(map[currentY][currentX+1] == 3)
                {
                    if(map[currentY][currentX+2] == 2)
                        map[currentY][currentX+2] = 3;
                    else
                        map[currentY][currentX+2] = 4;

                        map[currentY][currentX+1] = 2;
                        paintBlock(currentX,currentY);
                        paintBlock(currentX+2,currentY);
                        currentX = currentX +1;
                }
                else
                {
                    if(map[currentY][currentX+2] == 2)
                        map[currentY][currentX+2] = 3;
                    else
                        map[currentY][currentX+2] = 4;

                        map[currentY][currentX+1] = 5;
                        paintBlock(currentX,currentY);
                        paintBlock(currentX+2,currentY);
                        currentX = currentX +1;
                }
            }
            }
        }
    }

  public void moveDown() {
    //下一格不是墙
    if(map[currentY+1][currentX] != 1) {
      //下一格是空地或目的地
      if(map[currentY+1][currentX] == 2 || map[currentY+1][currentX] == 5) {
        paintBlock(currentX,currentY);
        currentY = currentY +1;
        human1 = showImages[10];
        human2 = showImages[11];
      } else {
        //下一格是箱子,而且再下一格是空地或目的地
        if((map[currentY+1][currentX] == 3 || map[currentY+1][currentX] == 4) && (map[currentY+2][currentX] == 2 || map[currentY+2][currentX] == 5)) {
          human1 = showImages[10];
          human2 = showImages[11];
          if(map[currentY+1][currentX] == 3) {
            if(map[currentY+2][currentX] == 2) map[currentY+2][currentX] = 3;
            else map[currentY+2][currentX] = 4;
            map[currentY+1][currentX] = 2;
            paintBlock(currentX,currentY);
            paintBlock(currentX,currentY+2);
            currentY = currentY +1;
          } else {
            if(map[currentY+2][currentX] == 2) map[currentY+2][currentX] = 3;
            else map[currentY+2][currentX] = 4;
            map[currentY+1][currentX] = 5;
            paintBlock(currentX,currentY);
            paintBlock(currentX,currentY+2);
            currentY = currentY +1;
          }
        }
      }
    }
  }
}

//****************************************************************************
class BasicUnit extends Applet {
  Image currentImage;
  int x, y;

  BasicUnit(Image tmpImage, int tmpX, int tmpY) {
    currentImage = tmpImage;
    x = tmpX;
    y = tmpY;
  }

  void drawSelf(Graphics g) {
    g.drawImage(currentImage,x,y,this);
  }
}

⌨️ 快捷键说明

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