JavaME贪吃蛇工程

  • P3_459906
    了解作者
  • 13.6KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-15 10:47
    上传日期
JavaME贪吃蛇工程
JavaME贪吃蛇.rar
内容介绍
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*; import java.util.*; public class FormMain extends MIDlet { SnakeCanvas displayable = new SnakeCanvas(); public FormMain() { Display.getDisplay(this).setCurrent(displayable); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub } } /**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/ class SnakeCanvas extends Canvas implements Runnable{ int[][] snake = new int[200][2]; int snakeNum; //已经使用的节点数量 /* 运动方向,0代表向上,1代表向下,2代表向左,3代表向右 */ 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 width; //游戏区域宽度 int height; //游戏区域高度 private final byte SNAKEWIDTH = 4; //蛇身单元宽度 boolean isPaused = false; //是否处于暂停状态,true代表暂停 boolean isRun = true; //是否处于运行状态,true代表运行 private final int SLEEP_TIME = 300; //时间间隔 int foodX; //食物的X坐标 int foodY; //食物的Y坐标 boolean b = true; //食物的闪烁控制 Random random = new Random(); 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(0xffffff); //清屏 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); } } private 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_LEFT: snake[0][0] = snake[0][0] - SNAKEWIDTH; break; case DIRECTION_RIGHT: snake[0][0] = snake[0][0] + SNAKEWIDTH; break; } } /** * 吃掉食物,自身增长 */ private void eatFood(){ //判别蛇头是否和食物重叠 if(snake[0][0] == foodX && snake[0][1] == foodY){ snakeNum++; generateFood(); } } /** * 产生食物 * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合 */ private void generateFood(){ while(true){ foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH; foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH; boolean b = true; for(int i = 0;i < snakeNum;i++){ if(foodX == snake[i][0] && snake[i][1] == foodY){ b = false; break; } } if(b){ break; } } } /** * 判断游戏是否结束 * 结束条件: * 1、蛇头超出边界 * 2、蛇头碰到自身 */ private 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[0][0] == snake[i][0] && snake[0][1] == snake[i][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){} } }
评论
    相关推荐
    • javaME俄罗斯方块
      javaMe 俄罗斯方块,无任何素材,纯逻辑代码版
    • JavaME+API
      javame的唯一参考手册。因唯一,故而可贵。不信的话,先下下其它便宜的或免费的。 以下是JavaMe所设计的全部的包: MID Profile All Classes Packages java.io java.lang java.util javax.microedition.io ...
    • javame封装菜单
      刚刚开始学习javame 弄了好几天封装了个菜单,第一篇文章,谢谢大家捧场
    • JavaME开发实例
      javame开发的各种实例:寻找最短路径、画图、地图设置、Gps设置等等
    • javaMe 电话本
      实现javaMe应用于手机上的电话本功能,进行电话的插入、删除等功能。
    • javaME API
      javaME开发必备神器!
    • JavaMe示例演示
      JavaMe示例演示 javame源码 专门供学习参考
    • javaME教程
      java的ppt教程,主要是教导j2me开发,可进一步开发安卓
    • JavaME课件ppt
      JavaME上课所用的课件ppt,有兴趣的可以看看
    • SIM800C_MQTT.rar
      使用SIM800C模块,使用MQTT协议,连接中国移动onenet平台,能实现数据的订阅、发布、存储等