【Exce4】 i-world-i-dream

J2ME Mobile Wireless JINI

chance ID:exce4
62028次访问,排名1657好友0人,关注者0
exce4的文章
原创 28 篇
翻译 0 篇
转载 38 篇
评论 3 篇
Exce4的公告
【Exce4】 Copyright © 2007

我 的 日 历

月 [下月] [上月]
最近评论
psnccs:Wow gold
tobytobe:要是都会做,就好
王鼎:我正在做与移动平台开发相关的毕业设计,看了你的文章对我帮助很大 非常感谢。
文章分类
收藏
    相册
    Email

    J2me
    CSDN.NET
    IBM--DW
    J2ME开发专区--天极网
    J2ME开发网
    J2ME手机游戏开发
    JCP
    J道
    Matrix - 与 Java 共舞
    MicorJava
    Mobile Game Developer
    Mobile-Java
    Mobility Java Technology
    NEC技术网站
    Newlc
    Nokia官方论坛
    Samsung Developers Club
    SIEMENS开发者论坛
    SP论坛天堂鸟技术学院
    SUN官方Java论坛
    Symbian
    UML软件工程组织
    wap之家
    YY手机游戏之家
    中国手机游戏中心
    天极网--移动开发文章列表
    开发视界
    开源 in Java
    手机之家
    手机操作系统移动游戏开发
    手机游戏中心
    手机资源联合论坛
    摩托罗拉官方网站
    法国J2ME3D开源项目
    游戏开发资源网
    移动开发网
    移动开发者论坛
    索尼爱立信开发者论坛
    西客站
    高通开发者资源
    Mobile Game
    何苦做游戏
    Board Games
    Emu-zone
    Game Showcase
    Gamedaily
    GameDev
    Gameloft
    Games Online Center
    J2MEForums
    MacroSpace
    mpowerplayer-games
    pyrastak
    Quantum Legacy
    Video Games
    Wireless Gaming Review
    可乐圈
    在线游戏 On-line Games
    当乐网
    音乐手机游戏电影
    Mobile Telecom
    3G365
    CHINA通信网
    CNET
    CommsDesign
    SP 论坛
    Wireless-Mobile Sections
    中国SP联盟
    中国手机研发网
    中国移动在线
    亞太IT網絡雜志
    华为技术支持网
    我爱研发网
    手机设计
    无线资讯网
    无线通信-21IC中国电子网
    移动通信在线
    赛迪网
    通信系统的基本概念
    SNAP
    MODIS System Test Drive
    N-Gage
    Nokia SNAP
    octopi
    Programming the Imsys Technologies SNAP Board
    SNAP Mobile
    SNAP Platform and SNAPPIX
    Snapplatform
    Wireless-gaming-Nokia
    Wireless
    bluesoleil
    Bluetooth
    BlueToothSpec
    BlueZ
    BTGesigner
    CSR
    FAQ-常见问答
    IVT
    sonyericsson-tipscode
    Stonestreetone
    Wiconworld
    中国蓝牙网
    蓝牙中国
    手机娱乐
    黑匣子
    我的个人简历
    在线版本
    我的网上邻居
    C. Enrique Ortiz'
    dongfengsun
    Efei
    Hinkmond Wong's Weblog
    KJAVA游戏联盟--小涛
    Klings.NoWires
    Mailbomb的J2ME专栏
    mobilechannel的专栏
    Open Gardens
    悠悠布酪阁
    旁观者
    游戏人生
    透明思考
    我的资源搜索
    《程序设计训练》
    AdvJava
    CrackJ2EE
    CSDN文档-mobilechannel
    Google
    google logo fun
    G宝盘
    itpub.net
    JavaMagic
    Javamap
    Java开源大全
    JR--Java书籍下载
    NetYi电子书籍、电脑图书
    nj0y图库
    sourceforge
    symbian系统开发入门
    TechDocs.De
    The Java Language Specification
    UUID-gen
    WirelessToolS
    中国IT实验室学习下载
    中国站长下载
    像素森林
    免费声音资源库
    图书下载 2005年
    基础科学辅导
    端口协议检索
    管理百宝箱
    西安信息资源网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 贪吃蛇的算法分析(Java)收藏

    新一篇: 【原创】使用Java蓝牙无线通讯技术API | 旧一篇: 贪吃蛇Java源码分析

    贪吃蛇是一款非常经典的手机游戏。它有很多算法,这里详细分析一种比较优秀的算法。
    首先介绍下主要用到的七个类:

    l          WormMain:最主要的类,控制所有其它类的运行和销毁。

    l          WormPit:处理键盘输入事件并实例化Worm类和WormFood类的。

    l          Worm:抽象了贪吃蛇的属性和动作

    l          WormFood:抽象了食物的属性和动作

    l          WormScore:用来纪录分数的类

    l          WormLink:抽象了蛇身上的一段,保存了这段的坐标、方向和所有状态。

    l          WormException:处理异常类

    基本概念介绍

    节:一条蛇可以看成有许多正方形的小格子拼凑成,我把它称作节。节是蛇身上最小的单位。

    段:当许多节连成一条直线,我称它为段。上图的贪吃蛇只有一段,如果它拐弯就变成两段。

    链表:用来保存每一段的状态,链表的元素单位是段。且链表的最后一个元素表示蛇的头部段。

    坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。

    Worm

    一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个元素是蛇的尾巴段,最后一个元素是蛇的头部段。当蛇运动的时候,它头部段增加一节而尾段减少一节。如果它吃到了食物,尾部段就不减少一节。也就是说,蛇是从头部段开始长的。 

    下面的代码段显示了Worm类保存的各种属性:

        /* 贪吃蛇可能移动的方向 */

        public final static byte DOWN  = 2;

        public final static byte LEFT  = 4;

        public final static byte RIGHT = 6;

        public final static byte UP    = 8;

        // 贪吃蛇的当前方向

        private byte currentDirection;

        // 保存贪吃蛇每一段的列表

        private Vector worm = new Vector(5, 2);

             // 是否需要更新状态

        private boolean needUpdate;

        // 是否在运动中

        private boolean moveOnNextUpdate;

        // 是否吃到食物

        private boolean hasEaten;

             // 贪吃蛇的初始位置、长度和方向

        private final static int INIT_X = 3;

        private final static int INIT_Y = 8;

        private final static int INIT_LEN = 8;

        private final static byte INIT_DIR = RIGHT;

     下面重点介绍下Worm类中的几个方法:

    l          public void setDirection(byte direction)

    这个方法用来改变贪吃蛇运动的方向,只能90度。看下面的实现代码:

    if ((direction != currentDirection) && !needUpdate) {

                 // 取出列表中的最后一个元素(蛇的头部)

                       WormLink sl = (WormLink)worm.lastElement();

                       int x = sl.getEndX();

                       int y = sl.getEndY();

             // 不同的运动方向坐标的改变也不一样

                       switch (direction) {

                       case UP: // 当这段向上运动的时候

                           if (currentDirection != DOWN) {

                                y--; needUpdate = true;                  }

                           break;

                       case DOWN: // 当这段向下运动的时候

                           if (currentDirection != UP) {

                                y++; needUpdate = true;                }

                           break;

                       case LEFT: // 当这段向左运动的时候

                           if (currentDirection != RIGHT) {

                                x--; needUpdate = true;                  }

                           break;

                       case RIGHT: // 当这段向右运动的时候

                           if (currentDirection != LEFT)  {

                                x++; needUpdate = true;                }

                          break;                 }

                       // 当更改方向后需要更新

                       if (needUpdate == true) {

                           worm.addElement(new WormLink(x, y, 0, direction));

                           currentDirection = direction;                 }            }

     l          public void update(Graphics g)

    这个函数是更新贪吃蛇状态。每次更新都把头部增加一节,尾部减少一节。如果它吃到食物尾部段就不减少一节。看起来就像整只蛇长了一节。 

                       // 把贪吃蛇头部增加一格

                 head = (WormLink)worm.lastElement();

                 head.increaseLength();

                       // 如果没有吃到食物则尾部减少一格

                 if (!hasEaten) {

                          WormLink tail;

                          tail = (WormLink)worm.firstElement();

                          int tailX = tail.getX();

                          int tailY = tail.getY();

                         // 如果尾部块长度为0就删除

                          tail.decreaseLength();

                          if (tail.getLength() == 0) {

                              worm.removeElement(tail);              }

                          // 尾部减少一格

                          g.setColor(WormPit.ERASE_COLOUR);

                          drawLink(g, tailX, tailY, tailX, tailY, 1);

                    } else {       

                    // 如果吃到食物就不删除尾部

                          hasEaten = false;               }

                 needUpdate = false;

                 // 确认是否在边界中

                 if (!WormPit.isInBounds(head.getEndX(), head.getEndY())) {

                    // 如果不在,就死了

                          throw new WormException("over the edge");          }

                 headX = (byte)head.getEndX();

                 headY = (byte)head.getEndY();

                 //贪吃蛇的头部增加一格

                 g.setColor(WormPit.DRAW_COLOUR);

                 drawLink(g, headX, headY, headX, headY, 1);

                 // 判断是否吃到自己

                 for (int i = 0; i < worm.size()-1; i++) {

                       sl = (WormLink)worm.elementAt(i);

                       if (sl.contains(headX, headY)) {

                           throw new WormException("you ate yourself");          }            }

     l          void drawLink(Graphics g, int x1, int y1, int x2, int y2, int len)

    这个函数用来画蛇的一段,一只完整的蛇是一段一段组成的。

    // 把长度转换成像素长度

             len *= WormPit.CELL_SIZE;

             // (x1 == x2)说明这一段是垂直的

             if (x1 == x2) {

                       // x1转成像素长度

                 x1 *= WormPit.CELL_SIZE;

                 // (y2 < y1)说明是向上运动

                 if (y2 < y1) {

    // 就把头、尾左边交换并转成像素

                       y1 = y2 * WormPit.CELL_SIZE;

                 } else {          

                 // y1转成像素

                       y1 *= WormPit.CELL_SIZE;           }

                 g.fillRect(x1, y1, WormPit.CELL_SIZE, len);

             } else {

                       // 这是水平的一段

                 y1 *= WormPit.CELL_SIZE;

                 if (x2 < x1) {

                 // 就把头、尾左边交换并转成像素

                       x1 = x2 * WormPit.CELL_SIZE;

                 } else {

                       x1 *= WormPit.CELL_SIZE;           }

                 g.fillRect(x1, y1, len, WormPit.CELL_SIZE);        }

     l          public void paint(Graphics g)

    画出一只完整的贪吃蛇

    WormLink sl;

             int x1, x2, y1, y2;

             int len;

             for (int i = 0; i < worm.size(); i++) {

                       // 取出每一段,然后画出这一段,连起来就是一只完整的蛇

                 sl = (WormLink)worm.elementAt(i);

                 x1 = sl.getX();    x2 = sl.getEndX();

                 y1 = sl.getY();    y2 = sl.getEndY();

                 len = sl.getLength();

                 drawLink(g, x1, y1, x2, y2, len);   }

     WormLink

    贪吃蛇是由一节一节组成的。因为它经常有一些节连成一条直线形成段,所以这是一种相对有效的方法来保存整个蛇。[X,Y]表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)

    下面代码段是WormLink中的段得属性:

             // 段头部坐标

        private int x, y;

        // 段长度

        private int len;

        // 移动方向

        private byte dir;

     下面重点介绍几个重要函数:

    l          public void decreaseLength()

    这是从段的头部减少一格

    // 首先段的总长度减少1

    len--;

             switch (dir) { // 不同的方向左边的改变也不一样

             case Worm.LEFT:

                 x--;         break;

             case Worm.RIGHT:

                 x++;       break;

             case Worm.UP:

                 y--;         break;

             case Worm.DOWN:

                 y++;       break;        }

    l          public void paint(Graphics g)

    画出一只完整的贪吃蛇

    WormLink sl;

             int x1, x2, y1, y2;

             int len;

             for (int i = 0; i < worm.size(); i++) {

                       // 取出每一段,然后画出这一段,连起来就是一只完整的蛇

                 sl = (WormLink)worm.elementAt(i);

                 x1 = sl.getX();    x2 = sl.getEndX();

                 y1 = sl.getY();    y2 = sl.getEndY();

                 len = sl.getLength();

                 drawLink(g, x1, y1, x2, y2, len);   }

     WormLink

    贪吃蛇是由一节一节组成的。因为它经常有一些节连成一条直线形成段,所以这是一种相对有效的方法来保存整个蛇。[X,Y]表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)

    下面代码段是WormLink中的段得属性:

             // 段头部坐标

        private int x, y;

        // 段长度

        private int len;

        // 移动方向

        private byte dir;

     下面重点介绍几个重要函数:

    l          public void decreaseLength()

    这是从段的头部减少一格

    // 首先段的总长度减少1

    len--;

             switch (dir) { // 不同的方向左边的改变也不一样

             case Worm.LEFT:

                 x--;         break;

             case Worm.RIGHT:

                 x++;       break;

             case Worm.UP:

                 y--;         break;

             case Worm.DOWN:

                 y++;       break;        }

     l          public boolean contains(int x, int y)

    判断所给的坐标[x,y]是否包含在段中

    switch (dir) { // 不同的方向判断的方法也不一样

             case Worm.LEFT:

                 return ((y == this.y) && ((x <= this.x) && (x >= getEndX())));

             case Worm.RIGHT:

                 return ((y == this.y) && ((x >= this.x) && (x <= getEndX())));

             case Worm.UP:

                 return ((x == this.x) && ((y <= this.y) && (y >= getEndY())));

             case Worm.DOWN:

                 return ((x == this.x) && ((y >= this.y) && (y <= getEndY())));

             }

     l          public int getEndX()

    得到这一段的尾部x坐标(段方向指向的最后一格的坐标)当这段是蛇的头部段时,得到的是头部最前面的坐标

             // 不同的方向判断方法不一样

    if (dir == Worm.LEFT)

                 return x-len;

             if (dir == Worm.RIGHT)

                 return x+len;

             return x;

     WormPit

    WormPit类中包括了Wo