📄 snake.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 + -