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

amyz發表於2007-11-13
貪吃蛇的演算法分析(3) (轉)[@more@]

WormLink類:namespace prefix = o ns = "urn:schemas--com::office" />

貪吃蛇是由一節一節組成的。因為它經常有一些節連成一條直線形成段,所以這是一種相對有效的方法來儲存整個蛇。[X,Y]表示段頭部的座標,然後段的頭部開始按照方向向後畫若干節。(段的頭尾和蛇的頭尾不是一個概念)

下面程式碼段是WormLink中的段得屬性:

  // 段頭部座標

  private int x, y;

  // 段長度

   private int len;

  // 移動方向

  private byte dir;

下面重點介紹幾個重要:

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;  }

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())));

  }

public int getEndX()

得到這一段的尾部x座標(段方向指向的最後一格的座標),當這段是蛇的頭部段時,得到的是頭部最前面的座標。

  // 不同的方向判斷方法不一樣

if (dir == Worm.LEFT)

    return x-len;

  if (dir == Worm.RIGHT)

    return x+len;

  return x;

 

關於作者:

沈晨,高階員,SCJP

to:JinaShen@BenQ.com">JinaShen@BenQ.com

2003" Day="10" Month="8">August 10, 2003



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

相關文章