亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Robocode 高手的秘訣:因數避墻法

2019-11-18 13:08:51
字體:
來源:轉載
供稿:網友

  設計出一種算法,使您的機器人不會被困在角落里或者過多的偏離想要的移動方向,而且不會靠近墻,這是件很困難的事。因數避墻法是一種簡單的解決辦法。在這篇小技巧中,David McCoy 將向您展示如何實現這項方便的技術。
  
  我們只要對在 Tracking your opponents' movement 中做的機器人加以補充,就能將因數避墻法添加到現有的或討厭的移動算法中。這種方法將預想的方向和根據機器人和墻之間距離遠近確定的安全方向作為因數試圖找到最可能的方向。
  
  添加做常見數學計算的輔助方法
  我們先要給機器人添加常見數學算法使用的一些輔助方法。
  
  calculateBearingToXYRadians() 方法使用 java.lang.Math 中的 atan2() 方法來計算從 sourceX,sourceY 到 targetX,targetY 的絕對方位,然后再把這個值轉化為相對于 sourceHeading 的相對方位。
  
  我們還需要 normalizeAbsoluteAngleRadians() 方法和 normalizeRelativeAngleRadians() 方法。
  
  清單 1. 數學輔助方法
  PRivate static final double DOUBLE_PI = (Math.PI * 2);
  private static final double HALF_PI = (Math.PI / 2);
  
  public double calculateBearingToXYRadians(double sourceX, double sourceY,
  double sourceHeading, double targetX, double targetY) {
  return normalizeRelativeAngleRadians(
  Math.atan2((targetX - sourceX), (targetY - sourceY)) -
  sourceHeading);
  }
  
  public double normalizeAbsoluteAngleRadians(double angle) {
  if (angle < 0) {
  return (DOUBLE_PI + (angle % DOUBLE_PI));
  } else {
  return (angle % DOUBLE_PI);
  }
  }
  
  public static double normalizeRelativeAngleRadians(double angle) {
  double trimmedAngle = (angle % DOUBLE_PI);
  if (trimmedAngle > Math.PI) {
  return -(Math.PI - (trimmedAngle % Math.PI));
  } else if (trimmedAngle < -Math.PI) {
  return (Math.PI + (trimmedAngle % Math.PI));
  } else {
  return trimmedAngle;
  }
  }
  
  使 AdvancedRobot 擴展到有倒行功能
  接著,為了以相反方向導航,我們需要用一些輔助方法把 AdvancedRobot 類的功能擴展到答應倒行操作:
  
  getRelativeHeading() 方法將應付正確計算相對于機器人當前的方向的相對方向產生的額外開銷。
  
  reverseDirection() 非常簡單。它負責 direction 實例變量的開關和使機器人掉頭。請注重,由于減速需要時間,依據機器人的速度,在掉過頭來之前最多會沿原來的方向再走 4 格。
  
  setAhead() 和 setBack() 方法將覆蓋 AdvancedRobot 類中的同名方法。這兩個方法會設置機器人對于目前方向的相對速度,必要的時候,還會調整 direction 實例變量。我們這么做的目的是要確保相對操作都與機器人當前的移動方向有關。
  
  setTurnLeftRadiansOptimal() 和 setTurnRightRadiansOptimal() 方法使機器人的方向轉過的角度超過 (Math.PI / 2)。您會希望這個方法和 adjustHeadingForWalls 方法(我們將在后面討論)一起使用。
  
  注:我沒有使用 getter 和 setter 方法,而是直接存取 direction 實例變量。盡管通常這并非良好的編程習慣,但為了加快數據存取,在我的機器人代碼中我一直都是直接存取的。
  
  清單 2. 機器人輔助方法
  public double getRelativeHeadingRadians() {
  double relativeHeading = getHeadingRadians();
  if (direction < 1) {
  relativeHeading =
  normalizeAbsoluteAngleRadians(relativeHeading + Math.PI);
  }
  return relativeHeading;
  }
  
  public void reverseDirection() {
  double distance = (getDistanceRemaining() * direction);
  direction *= -1;
  setAhead(distance);
  }
  
  public void setAhead(double distance) {
  double relativeDistance = (distance * direction);
  super.setAhead(relativeDistance);
  if (distance < 0) {
  direction *= -1;
  }
  }
  
  public void setBack(double distance) {
  double relativeDistance = (distance * direction);
  super.setBack(relativeDistance);
  if (distance > 0) {
  direction *= -1;
  }
  }
  
  public void setTurnLeftRadiansOptimal(double angle) {
  double turn = normalizeRelativeAngleRadians(angle);
  if (Math.abs(turn) > HALF_PI) {
  reverseDirection();
  if (turn < 0) {
  turn = (HALF_PI + (turn % HALF_PI));
  } else if (turn > 0) {
  turn = -(HALF_PI - (turn % HALF_PI));
  }
  }
  setTurnLeftRadians(turn);
  }
  
  public void setTurnRightRadiansOptimal(double angle) {
  double turn = normalizeRelativeAngleRadians(angle);
  if (Math.abs(turn) > HALF_PI) {
  reverseDirection();
  if (turn < 0) {
  turn = (HALF_PI + (turn % HALF_PI));
  } else if (turn > 0) {
  turn = -(HALF_PI - (turn % HALF_PI));
  }
  }
  setTurnRightRadians(turn);
  }
  
  添加因數避墻法
  我們需要添加的最后一個方法是 adjustHeadingForWalls() 方法。
  
  這個方法的前面一半根據機器人和墻的靠近程度選擇安全的 x 和 y 的位置(機器人當前的 x 或 y 位置,或者假如機器人靠近墻,則就是中心點)。方法的后面一半則計算距離“安全點”的方位,并把這個方位和依機器人離墻遠近得到的預想方向都作為因數考慮在內。
  
  可以使用 WALL_AVOID_INTERVAL 和 WALL_AVOID_FACTORS 常量來調整機器人對墻的擔憂程度。
  
  清單 3. 避墻法方法
  private static final double WALL_AVOID_INTERVAL = 10;
  private static final double WALL_AVOID_FACTORS = 20;
  private static final double WALL_AVOID_DISTANCE =
  (WALL_AVOID_INTERVAL * WALL_AVOID_FACTORS);
  
  private double adjustHeadingForWalls(double heading) {
  double fieldHeight = getBattleFieldHeight();
  double fieldWidth = getBattleFieldWidth();
  double centerX = (fieldWidth / 2);
  double centerY = (fieldHeight / 2);
  double currentHeading = getRelativeHeadingRadians();
  double x = getX();
  double y = getY();
  boolean nearWall = false;
  double desiredX;
  double desiredY;
  
  // If we are too close to a wall, calculate a course toward
  // the center of the battlefield.
  if ((y < WALL_AVOID_DISTANCE)
  ((fieldHeight - y) < WALL_AVOID_DISTANCE)) {
  desiredY = centerY;
  nearWall = true;
  } else {
  desiredY = y;
  }
  if ((x < WALL_AVOID_DISTANCE)
  ((fieldWidth - x) < WALL_AVOID_DISTANCE)) {
  desiredX = centerX;
  nearWall = true;
  } else {
  desiredX = x;
  }
  
  // Determine the safe heading and factor it in with the desired
  // heading if the bot is near a wall
  if (nearWall) {
  double desiredBearing =
  calculateBearingToXYRadians(x,
  y,
  currentHeading,
  desiredX,
  desiredY);
  double distanceToWall = Math.min(
  Math.min(x, (fieldWidth - x)),
  Math.min(y, (fieldHeight - y)));
  int wallFactor =
  (int)Math.min((distanceToWall / WALL_AVOID_INTERVAL),
  WALL_AVOID_FACTORS);
  return ((((WALL_AVOID_FACTORS - wallFactor) * desiredBearing) +
  (wallFactor * heading)) / WALL_AVOID_FACTORS);
  } else {
  return heading;
  }
  }
  
  匯總
  其余的工作很輕易。我們可以使用目前的導航算法,將得出的結果送入 adjustHeadingForWalls() 方法來避開墻。
  
  為了保持簡單,示例機器人(請參閱參考資料下載添加這一技術所需的源代碼)要求方向改變為零,從而試著沿直線移動。
  
  清單 4. 避墻法方法
  public void run() {
  while(true) {
  setTurnRightRadiansOptimal(adjustHeadingForWalls(0));
  setAhead(100);
  execute();
  }
  }
  
  關于它就是這樣了。簡單,但有效。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女搞久久| 久久久免费精品| 亚洲福利视频网| 亚洲国产欧美一区二区三区久久| 欧美激情xxxx性bbbb| 中文字幕免费国产精品| 久久精品欧美视频| 国产精品极品美女粉嫩高清在线| 91久久久久久国产精品| 一个人看的www欧美| 成人妇女淫片aaaa视频| 一二美女精品欧洲| 欧美极品少妇xxxxx| 久久精品中文字幕一区| 国产精品视频白浆免费视频| 欧美日韩精品国产| 欧美大尺度在线观看| 亚洲经典中文字幕| 羞羞色国产精品| 欧美美最猛性xxxxxx| 欧美在线一级va免费观看| 日韩av免费网站| 77777少妇光屁股久久一区| 亚洲第一视频网站| 色综合久久久久久中文网| 国产成人+综合亚洲+天堂| 国产日韩专区在线| 91久久精品视频| 亚州av一区二区| 77777少妇光屁股久久一区| 97在线观看视频| 亚洲欧美在线一区二区| 日韩免费在线看| 久久69精品久久久久久久电影好| 欧美乱大交xxxxx另类电影| 日韩小视频在线观看| 国产精品男人的天堂| 欧美极品美女视频网站在线观看免费| 91成人在线观看国产| 日韩av电影手机在线| 久久久久久久久国产精品| 国模精品一区二区三区色天香| 九九热在线精品视频| 精品国产依人香蕉在线精品| 国产日韩欧美夫妻视频在线观看| 欧美日韩国产va另类| 国模吧一区二区| 欧美有码在线观看| 亚洲人成电影网站色www| 一本一本久久a久久精品综合小说| 国产亚洲成精品久久| 亚洲欧洲国产一区| 亚洲国产成人精品久久久国产成人一区| 欧美老女人www| 欧美中文字幕第一页| 日韩成人高清在线| 久久久亚洲精品视频| 亚洲欧美日韩第一区| 国产精品成人一区二区| 中文字幕国产精品| 久久影视三级福利片| 欧美在线视频在线播放完整版免费观看| 欧美日韩在线影院| 久久精品色欧美aⅴ一区二区| 精品日本高清在线播放| 欧美精品国产精品日韩精品| 国产精品美乳一区二区免费| 不卡在线观看电视剧完整版| 成人激情免费在线| 欧洲日本亚洲国产区| 亚洲成在人线av| 亚洲最大成人在线| 欧美性猛交xxxx富婆弯腰| 97在线免费观看视频| 欧美自拍大量在线观看| 成人伊人精品色xxxx视频| 欧美日韩激情小视频| 久久免费视频这里只有精品| 亚洲精品永久免费精品| 国产精品女主播视频| 97在线视频免费播放| 日韩欧美在线观看视频| 综合网日日天干夜夜久久| 色诱女教师一区二区三区| 操日韩av在线电影| 国产精品人成电影在线观看| 欧美激情精品在线| 精品国内亚洲在观看18黄| 成人福利网站在线观看11| 欧美一区视频在线| 啪一啪鲁一鲁2019在线视频| 成人精品久久一区二区三区| 亚洲一区二区三区xxx视频| 国产一区二区三区精品久久久| 97成人超碰免| 国产美女高潮久久白浆| 亚洲国模精品私拍| 国产精品∨欧美精品v日韩精品| 中文字幕v亚洲ⅴv天堂| 精品一区二区三区电影| 亚洲午夜国产成人av电影男同| 精品久久久久久| 亚洲欧洲午夜一线一品| 欧美在线观看日本一区| 亚洲一区二区三区在线免费观看| 欧美疯狂xxxx大交乱88av| 在线视频免费一区二区| 久久综合久久美利坚合众国| 丝袜亚洲欧美日韩综合| 久久久之久亚州精品露出| 国产精品极品美女在线观看免费| 欧美性20hd另类| 国产精品自拍偷拍视频| 亚洲老司机av| 欧洲成人午夜免费大片| 丝袜美腿精品国产二区| 夜夜嗨av色一区二区不卡| 国产91在线播放精品91| 国产日韩欧美影视| 国产日产久久高清欧美一区| 日韩欧美在线观看| 久久久影视精品| 亚洲欧美变态国产另类| 日本韩国欧美精品大片卡二| 91国产视频在线播放| 日韩在线观看网址| 国内伊人久久久久久网站视频| 国产人妖伪娘一区91| 亚洲尤物视频网| 久久久久久噜噜噜久久久精品| 7m精品福利视频导航| 91国产精品91| 日韩人在线观看| 亚洲人av在线影院| 亚洲国产精品字幕| 亚洲成年网站在线观看| 中文字幕欧美国内| 国产精品激情av电影在线观看| 欧洲一区二区视频| 国产视频观看一区| 精品国产福利在线| 亚洲精品中文字幕有码专区| 精品视频在线播放色网色视频| 九九热r在线视频精品| 亚洲摸下面视频| 亚洲免费伊人电影在线观看av| 国产日韩精品综合网站| 欧美黄色免费网站| 久久久国产视频91| 成人午夜激情免费视频| 亚洲欧美国产va在线影院| 国模精品视频一区二区三区| 亚洲免费精彩视频| 中文字幕av一区二区三区谷原希美| 国产69精品久久久久9999| 国产精品视频永久免费播放| 久久影院免费观看| 欧美丝袜美女中出在线| 日本韩国在线不卡| 久久久久国产精品一区| 97视频国产在线| 欧美在线视频观看| 久久亚洲精品小早川怜子66| 国产视频精品久久久|