貪吃蛇的演算法分析(1) (轉)

worldblog發表於2008-01-31
貪吃蛇的演算法分析(1) (轉)[@more@]

貪吃蛇的演算法分析(1):namespace prefix = o ns = "urn:schemas--com::office" />

James @

貪吃蛇是一款非常經典的遊戲。它有很多演算法,這裡詳細分析一種比較優秀的演算法。
首先介紹下主要用到的七個類:

l  WormMain:最主要的類,控制所有其它類的執行和銷燬。

l  WormPit:處理鍵盤輸入事件並例項化Worm類和WormFood類的。

l  Worm:抽象了貪吃蛇的屬性和動作

l  WormFood:抽象了食物的屬性和動作

l  Wormre:用來紀錄分數的類

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 wo= 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;

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章