这几天做了个j2me小游戏----贪吃蛇,参考的网上的代码,进步中。。。
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SnakeMIDlet extends MIDlet {
SnakeCanvas displayable = new SnakeCanvas();
public SnakeMIDlet() {
Display.getDisplay(this).setCurrent(displayable);
}
public void startApp() {}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
import java.util.*;
import javax.microedition.lcdui.*;
/**
* 贪吃蛇游戏
*/
public class SnakeCanvas extends Canvas implements Runnable {
// 开辟一个二维数组,第一维存储贪吃蛇的节点序列,第二维下标0存储贪吃蛇的x坐标,1存储y坐标
int[][] snake = new int[200][2];
// 游戏区域尺寸
int width, height;
// 贪吃蛇节点总数
int snakeNUM;
// 贪吃蛇节点尺寸
private final byte snakewidth = 4;
// 朝向
int direction;
private final int DIRECTION_UP = 0;
private final int DIRECTION_DOWN = 1;
private final int DIRECTION_LEFT = 2;
private final int DIRECTION_RIGHT = 3;
// 食物坐标
int foodX;
int foodY;
// 判断食物是否存在
boolean b = true;
// 随机对象
Random random = new Random();
// 判断程序是否运行
boolean isRun = true;
// 判断
boolean isPaused = false;
private final int SLEEP_TIME = 100;
public SnakeCanvas() {
// 构造函数
init();
width = this.getWidth();
height = this.getHeight();
new Thread(this).start();
}
private void init() {
// 初始化节点数量
snakeNUM = 7;
// 初始化贪吃蛇节点坐标
for (int i = 0; i < snakeNUM; i++) {
snake[i][0] = 100 - snakewidth * i;
snake[i][1] = 40;
}
// 初始化蛇头朝向
direction = DIRECTION_RIGHT;
// 初始化食物坐标
foodX = 100;
foodY = 100;
}
protected void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, width, height);
g.setColor(0);
// 绘制蛇身
for (int i = 0; i < snakeNUM; i++) {
g.fillRect(snake[i][0], snake[i][1], snakewidth, snakewidth);
}
// 绘制食物
if (b) {
g.fillRect(foodX, foodY, snakewidth, snakewidth);
}
}
protected void move(int direction) {
// 贪吃蛇蛇身移动
for (int i = snakeNUM - 1; i > 0; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
// 贪吃蛇蛇头移动
switch (direction) {
// 后一个节点取代前一个节点的坐标位置
case DIRECTION_UP:
snake[0][1] = snake[0][1] - snakewidth;
break;
case DIRECTION_DOWN:
snake[0][1] = snake[0][1] + snakewidth;
break;
case DIRECTION_RIGHT:
snake[0][0] = snake[0][0] + snakewidth;
break;
case DIRECTION_LEFT:
snake[0][0] = snake[0][0] - snakewidth;
break;
}
}
protected void eatfood() {
// 判断蛇头是否和食物坐标重合
if (snake[0][0] == foodX && snake[0][1] == foodY) {
snakeNUM++;
// 增加食物
generatefood();
}
}
protected void generatefood() {
// 找到与蛇身不重合的食物坐标
while (true) {
foodX = Math.abs(random.nextInt() % (width - snakewidth + 1))
/ snakewidth * snakewidth;
foodY = Math.abs(random.nextInt() % (height - snakewidth + 1))
/ snakewidth * snakewidth;
b = true;
for (int i = 0; i < snakeNUM; i++) {
if (foodX == snake[i][0] && foodY == snake[i][1]) {
b = false;
break;
}
}
if (b) {
break;
}
}
}
// 判别游戏是否结束
protected boolean isGameover() {
// 超出边界
if (snake[0][0] < 0 || snake[0][0] > (width - snakewidth)
|| snake[0][1] < 0 || snake[0][1] > (height - snakewidth))
return true;
// 自身重合
for (int i = 4; i < snakeNUM; i++) {
if (snake[i][0] == snake[0][0] && snake[i][1] == snake[0][1])
return true;
}
return false;
}
public void keyPressed(int keyCode) {
int action = this.getGameAction(keyCode);
// 改变方向
switch (action) {
case UP:
if (direction != DIRECTION_DOWN) {
direction = DIRECTION_UP;
}
break;
case DOWN:
if (direction != DIRECTION_UP) {
direction = DIRECTION_DOWN;
}
break;
case LEFT:
if (direction != DIRECTION_RIGHT) {
direction = DIRECTION_LEFT;
}
break;
case RIGHT:
if (direction != DIRECTION_LEFT) {
direction = DIRECTION_RIGHT;
}
break;
case FIRE:
// 暂停和继续
isPaused = !isPaused;
break;
}
}
// 线程方法
public void run() {
try {
while (isRun) {
long start = System.currentTimeMillis();
if (!isPaused) {
// 吃食物
eatfood();
// 移动
move(direction);
if (isGameover()) {
break;
}
// 控制闪烁
b = !b;
}
repaint();
long end = System.currentTimeMillis();
// 延时,保持每秒相同速度
if (end - start < SLEEP_TIME) {
Thread.sleep(SLEEP_TIME - (end - start));
}
}
} catch (Exception e) {
}
}
}