一个简单的游戏--贪吃蛇

这几天做了个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) {

  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值