郑州游戏学院—陈跃峰老师的博客

人生难得几回博,来,让我们博一把

陈跃峰ID:Mailbomb
749014次访问,排名46好友103人,关注者342
努力学习,努力工作
Mailbomb的文章
原创 284 篇
翻译 12 篇
转载 11 篇
评论 1312 篇
陈跃峰的公告
陈跃峰 个人简历
cqucyf@gmail.com

本BLOG中文章,未经允许严禁用于商业目的!

本人编写的J2ME基础入门书籍: 《新编J2ME就业培训教程》,购买
dearbook
华储网
当当网
Chinapub
最近评论
bijat:太高兴了,今天的第一个j2me编译好了,向陈老师致敬!
bijat:太感谢陈老师了,写的太详细了,我终于编译好了我的第一个java,致敬!
onemonth:楼主,求你不要写了吧。如果非要写,换个名字。明朝那些事是很好的文章,你就不要糟蹋了这样的名字。
lunarfan:杨辉的算法不错。
panzhiqian11:kankan xuexi.
文章分类
收藏
    相册
    J2ME技术
    J2ME开发网
    无线空间
    Java网站
    Eclipse官方网站
    Java世纪网
    Sun中国
    Sun官方网站
    常用网站
    Chinabyte
    Google搜索引擎
    华军软件园
    新浪新闻
    网上书店
    ITbook
    互动出版网
    当当书店
    第二书店
    我工作过的地方
    上海托普信息技术学院
    游戏学院南京校区
    游戏学院郑州校区
    电脑报
    友情链接
    acqy的专栏
    eiyaa的专栏
    上海求职客栈
    刀剑啸的专栏
    刘军的BLOG
    王新钢的BLOG
    贝壳鱼(k7sem)专栏
    骄傲的猫
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 J2ME贪吃蛇源代码——200行左右,包含详细注释收藏

    新一篇: J2ME技术回顾 | 旧一篇: 一个简单的游戏源代码

    //文件名: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[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){}
        }
    }

     

    广告:如果觉得文章对你有帮助,请在MVB评选中投我一票,谢谢!投票地址:

    发表于 @ 2006年11月07日 22:18:00|评论(loading...)|编辑

    新一篇: J2ME技术回顾 | 旧一篇: 一个简单的游戏源代码

    评论

    #goodegg5519 发表于2006-12-05 12:37:46  IP: 58.213.223.*
    老师啊~~你那个学校网站上的照片是不是该换换啊~~模糊的很,呵呵~~~
    #c30gcrk 发表于2007-04-27 15:47:16  IP: 122.48.119.*
    ~谢谢老师的代码~
    #qqwzw 发表于2008-03-09 11:43:27  IP: 222.85.176.*
    看了,还可以,支持
    #lu226210 发表于2008-04-24 14:19:12  IP: 125.93.127.*
    哈哈,终于找到党组织了....谢谢老师~..
    #yinandyi 发表于2008-04-24 20:41:55  IP: 59.174.171.*
    大师级人物啊。。。偶学
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 陈跃峰