程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> SLG中搜索某個角色可移動區域的算法

SLG中搜索某個角色可移動區域的算法

編輯:J2ME

可根據地形的不同,以及角色能力的不同來判斷可移動區域。例如騎士在平地上可以移動更大的范圍。

代碼如下:

 /**
  * 搜索可走區域
  * @param map 當前地圖表
  * @param row 行
  * @param col 列
  * @param locomotivity 該角色的默認移動力
  * @param direction 方向
  */
 public void scanMovableArea(byte map[][], int row, int col, int locomotivity, int direction){
  if(locomotivity > map[row][col])
   map[row][col] = (byte)locomotivity;
  else
   return;
  
  /** 向上判斷 **/
  if(direction != 1){
   int loco1 = locomotivity - mapExpendLocomotivity(row, col - 1);
   if(loco1 >=0)
    scanMovableArea(map, row, col - 1, loco1, 2);
  }
  
  /** 向下判斷 **/
  if(direction != 2){
   int loco2 = locomotivity - mapExpendLocomotivity(row, col + 1);
   if(loco2 >= 0)
    scanMovableArea(map, row, col + 1, loco2, 1);
  }
  
  /** 向左判斷 **/
  if(direction != 4){
   int loco3 = locomotivity - mapExpendLocomotivity(row - 1, col);
   if(loco3 >= 0)
    scanMovableArea(map, row - 1, col, loco3, 8);
  }
  
  /** 向右判斷 **/
  if(direction != 8){
   int loco4 = locomotivity - mapExpendLocomotivity(row + 1, col);
   if(loco4 >= 0)
    scanMovableArea(map, row + 1, col, loco4, 4);
  }
 }

----------------------------------------------

 /**
  * 地形對移動力的消耗
  * @param row 行
  * @param col 列
  * @return 移動力消耗值
  */

public int mapExpendLocomotivity(int row, int col){

   //這裡我就不一一實現了,有興趣的朋友可以自己擴展這個方法。

   //下面給個偽代碼

   //如果是草地

  if(gameMap[row][col] == GAME_MAP_GRASS){

    //如果是士兵


   if(type == SOLIDER){
    return 1;
    }
  }

   //超出邊界

  if(row < 0 || col < 0 || row > gameWidth || col > gameHeight)

  {

      return 1000;

  }

  //具體的情況各位朋友可以根據自己的游戲來設計。

}

找到可以移動的區域後,就可以確定要移動的具體位置。這時候又要涉及到找路算法了。對於與A*算法(以前有一位同事寫過)。不過下次我會用遞歸算法來實現,速度更快,更簡單。

差點忘記說明了以上得到的map數組怎麼使用。這時一個記錄了剩余移動力的數組。在顯示可移動的區域的時候只要判斷map裡面的值是否為空,不為空就畫出一個矩形,代表該區域可走。

/**
  * 走路
  * @param curX 當前位置 (x方向)
  * @param curY 當前位置 (y方向)
  * @param destX 目標位置(x方向)
  * @param destY 目標位置 (y方向)
  * @return 路徑矢量
  */
 public Vector scanPath(int curX, int curY, int destX, int destY){
  Vector vector = null;
  short dest[] = {
    (short)destX, (short)destY
  };
  if(curX == destX && curY == destY){
   vector = new Vector();
   vector.addElement((Object)dest);
   return vector;
  }
  byte byte0 = 0;
  byte byte1 = 0;
  byte byte2 = 0;
  byte byte3 = 0;
  if(destY > 0)
   byte0 = _mapped_terrains[destX][destY - 1];
  if(destY < _map_height - 1)
   byte1 = _mapped_terrains[destX][destY + 1];
  if(destX > 0)
   byte2 = _mapped_terrains[destX - 1][destY];
  if(destX < _map_width - 1)
   byte3 = _mapped_terrains[destX + 1][destY];

  int max = Math.max(Math.max((int)byte0, (int)byte1), Math.max((int)byte2, (int)byte3));
  if(max == byte0)
   vector = scanPath(curX, curY, destX, destY - 1);
  else
  if(max == byte1)
   vector = scanPath(curX, curY, destX, destY + 1);
  else
  if(max == byte2)
   vector = scanPath(curX, curY, destX - 1, destY);
  else
  if(max == byte3)
   vector = scanPath(curX, curY, destX + 1, destY);

  vector.addElement((Object)dest);
  return vector;
 }

還記得上個帖子上函數中傳入的map參數嗎,實際上通過那個函數就可以得到一個map,然後應用於現在的找路算法中,也就是上面代碼段看到的_mapped_terrains

還有兩個陌生的變量就是 _map_height和_map_width ,這個很簡單了,就是SLG地圖中的長度和寬度。

呵呵,希望這些代碼段對SLG的朋友有些幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved