Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 381|回复: 0

[J2ME学习]J2ME贪吃蛇源代码

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 03:00:05 | 显示全部楼层 |阅读模式
    //文件名:SnakeMIDlet .java package snake; 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) {} }  //文件名:SnakeCanvas.java package snake; 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 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;     /**是否处于暂停状态,true代表暂停*/
         boolean isPaused = false;
         /**是否处于运行状态,true代表运行*/
         boolean isRun = true;     /**时间间隔*/
         private final int SLEEP_TIME = 300;
         
         /**食物的X坐标*/
         int foodX;
         /**食物的Y坐标*/
         int foodY;
         /**食物的闪烁控制*/
         boolean b = true;
         
         /**Random对象*/
         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[0] = 100 - SNAKEWIDTH * i;
                     snake[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[0],snake[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[0] = snake[i - 1][0];
                 snake[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[0] && snake[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[0]
              && snake[0][1] == snake[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){}
         }
    } 效果图:   
      
       
       

         
       

         
       
      
      

    源码下载:http://203.93.208.26/kj/cwb/dir7/SnakeMIDlet.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-2 17:59 , Processed in 0.450191 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表