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

📄 snake.java

📁 j2me源代码
💻 JAVA
字号:
package snake;

import java.util.*;
import javax.microedition.lcdui.*;

public class Snake {
  //定义方向常量
  public final static byte UP = 1;
  public final static byte DOWN = 2;
  public final static byte LEFT = 3;
  public final static byte RIGHT = 4;

  private byte dirCur;  //蛇头的当前前进方向
  private int x;  //蛇头的x坐标
  private int y;  //蛇头的y坐标
  private int nLen;  //蛇的总长度
  private boolean bHasEaten;  //是否吃到食物
  private SnakeCanvas canvas;  //主绘界面实例

  private Vector snakeparts = new Vector();  //snakepart数组

  public Snake(SnakeCanvas sc) {
    canvas = sc;
    x = 5;
    y = 3;
    nLen = 5;
    bHasEaten = false;
    dirCur = RIGHT;
    Init();
  }

  /**
   *初始化
   */
  private void Init() {
    synchronized (snakeparts){
      snakeparts.removeAllElements();
      snakeparts.addElement(new SnakePart(x, y, dirCur, nLen));
    }
  }

  /**
   * 蛇的转向操作的处理过程
   * @param direction byte
   */
  public void setDirection(byte direction){
    boolean bUpdate = false;
    synchronized (snakeparts) {
      if (direction != dirCur) {
        SnakePart sp = (SnakePart) snakeparts.lastElement();
        int x = sp.getStartX();
        int y = sp.getStartY();
        switch (direction) {
          case UP:
            if (dirCur != DOWN) {
              bUpdate = true;
            }
            break;
          case DOWN:
            if (dirCur != UP) {
              bUpdate = true;
            }
            break;
          case LEFT:
            if (dirCur != RIGHT) {
              bUpdate = true;
            }
            break;
          case RIGHT:
            if (dirCur != LEFT) {
              bUpdate = true;
            }
            break;
        }
        if (bUpdate == true) {
          snakeparts.addElement(new SnakePart(x, y, direction, 0));
          dirCur = direction;
        }
      }
    }
  }

  /**
   * 蛇的步进更新函数,使得蛇向前移动一步
   * @param g Graphics
   */
  public void update(Graphics g){
    SnakePart head, sp;
    int xHead, yHead, xTail, yTail;

    synchronized (snakeparts) {
      head = (SnakePart) snakeparts.lastElement(); //获取头部所在的SnakePart
      head.increase();
      xHead = head.getStartX();
      yHead = head.getStartY();
      //绘制头部(向前一格)
      g.setColor(SnakeCanvas.SNAKE_COLOR);
      drawPart(g, xHead, yHead, xHead, yHead, 1);

      //测试蛇是否与游戏区域的边缘相碰
      if(!canvas.isPtInBound(xHead, yHead))
        canvas.setGameOver();

      if (!bHasEaten) {  //没有吃到食物,需要擦除最后一个方块
        SnakePart tail;
        tail = (SnakePart) snakeparts.firstElement(); //获取尾部所在的SnakePart
        while(tail.getLength() <= 0){
          snakeparts.removeElement(tail);
          tail = (SnakePart) snakeparts.firstElement();
        }

        xTail = tail.getEndX();
        yTail = tail.getEndY();
        tail.decrease();
        //擦除最后一块
        g.setColor(SnakeCanvas.BACK_COLOR);
        g.fillRect(xTail * SnakeCanvas.CELL_SIZE,
                   yTail * SnakeCanvas.CELL_SIZE,
                   SnakeCanvas.CELL_SIZE,
                   SnakeCanvas.CELL_SIZE);
      }
      else {
        bHasEaten = false;
      }

    //测试蛇是否咬到了自己
     for (int i = 0; i < snakeparts.size() - 1; i++) {
        sp = (SnakePart) snakeparts.elementAt(i);
        if (sp.isPtInPart(xHead, yHead)) {
          canvas.setGameOver();
        }
      }
    }
  }

  /**
   * 绘制SnakePart
   *
   * @param g Graphics
   * @param xTail int
   * @param yTail int
   * @param xTail1 int
   * @param yTail1 int
   * @param len int
   */
  public void drawPart(Graphics g, int xHead, int yHead, int xTail,
                         int yTail, int len) {
     if (xHead == xTail) {
       for(int i=0; i<len; i++){
         int x = xHead * SnakeCanvas.CELL_SIZE;
         int y = (yHead<yTail) ?((yHead + i)*SnakeCanvas.CELL_SIZE)
             : ((yTail + i) * SnakeCanvas.CELL_SIZE);
         drawSnakeBox(g, x, y);
       }
     }
     else if(yHead == yTail){
       for (int i = 0; i < len; i++) {
         int y = yHead * SnakeCanvas.CELL_SIZE;
         int x = (xHead < xTail) ? ( (xHead + i) * SnakeCanvas.CELL_SIZE)
             : ( (xTail + i) * SnakeCanvas.CELL_SIZE);
         drawSnakeBox(g, x, y);
       }
     }else
       return;
  }

  /**
   * 绘制蛇身上的一个小方格
   *
   * @param g Graphics
   * @param x int
   * @param y int
   */
  private void drawSnakeBox(Graphics g, int x, int y) {
    g.setColor(SnakeCanvas.SNAKE_COLOR);
    g.fillRect(x, y, SnakeCanvas.CELL_SIZE, SnakeCanvas.CELL_SIZE);
    g.setColor(SnakeCanvas.BACK_COLOR);
    g.drawRect(x, y, SnakeCanvas.CELL_SIZE, SnakeCanvas.CELL_SIZE);
  }

  /**
   * 重新绘制整个蛇身
   * @param g Graphics
   */
  public void paint(Graphics g){
    SnakePart sp;
    int x1, y1, x2, y2;

    for(int i = 0; i< snakeparts.size(); i++){
      sp = (SnakePart) snakeparts.elementAt(i);
      if (sp.getLength() > 0) {
        x1 = sp.getStartX();
        y1 = sp.getStartY();
        x2 = sp.getEndX();
        y2 = sp.getEndY();
        drawPart(g, x1, y1, x2, y2, sp.getLength());
      }
    }
  }

  /**
   * 吃到食物
   */
  public void eat(){
    bHasEaten = true;
  }

  /**
   * 测试某点是否在蛇身上
   * @param xHead int
   * @param yHead int
   * @return boolean
   */
  public boolean isPtInSnake(int xPos, int yPos){
    SnakePart sp;
    synchronized (snakeparts) {
      for (int i = 0; i < snakeparts.size(); i++) {
        sp = (SnakePart) snakeparts.elementAt(i);
        if (sp.isPtInPart(xPos, yPos))
          return true;
      }
    }
    return false;
  }

  /**
   * 返回蛇头的x坐标
   * @return int
   */
  public int getXHead(){
    synchronized(snakeparts){
      return ((SnakePart) snakeparts.lastElement()).getStartX();
    }
  }

  /**
   * 返回蛇头的y坐标
   * @return int
   */
  public int getYHead(){
    synchronized (snakeparts) {
      return ( (SnakePart) snakeparts.lastElement()).getStartY();
    }
  }
}

⌨️ 快捷键说明

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