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

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

用C#開發智能手機軟件:推箱子(四)

2019-11-18 16:27:20
字體:
來源:轉載
供稿:網友

在這篇文章中,介紹 Common/FindPath.cs 源程序文件。

以下是引用片段:
using System;
  using System.Drawing;
  using System.Collections.Generic;
  namespace Skyiv.Ben.PushBox.Common
  {
  /// 
  /// 尋找最短路線
  /// 
  static class FindPath
  {
  static Size[] offsets = { new Size(0, 1), new Size(1, 0), new Size(0, -1), new Size(-1, 0) };
  static Direction[] directions = { Direction.South, Direction.East, Direction.North, Direction.West };
  /// 
  /// 尋找最短路線
  /// 
  /// 地圖
  /// 出發點
  /// 目的地
  /// 最短路線
  public static Queue Seek(ushort[,] map, Point from, Point to)
  {
  Queue moveQueue = new Queue(); // 路線
  int value; // 離目的地距離
  if (Seek(map, to, out value)) // 找到了一條路線
  {
  Point here = from; // 出發點(即工人的位置)
  Point nbr = new Point(); // 四周的鄰居
  for (value--; value > 0; value--) // 逐步走向目的地
  {
  for (int i = 0; i < offsets.Length; i++)
  {
  nbr = Fcl.Add(here, offsets[i]); // 開始尋找四周的鄰居
  if (Block.Value(map[nbr.Y, nbr.X]) == value) // 就往這個方向走
  {
  moveQueue.Enqueue(directions[i]); // 路線向目的地延伸一步
  break;
  }
  }
  here = nbr; // 繼續前進
  }
  }
  Block.CleanAllMark(map); // 清除所有標志,恢復現場
  return moveQueue; // 所尋找的路線,如果無法到達目的地則為該路線的長度為零
  }
  /// 
  /// 尋找最短路線,使用廣度優先搜索
  /// 
  /// 地圖
  /// 目的地
  /// 輸出:路線的長度(加1)
  /// 是否成功
  static bool Seek(ushort[,] map, Point to, out int value)
  {
  Queue q = new Queue();
  Block.Mark(ref map[to.Y, to.X], 1); // 從目的地開始往回尋找出發點,目的地標記為1
  Point nbr = Point.Empty; // 四周的鄰居
  for (; ; )
  {
  value = Block.Value(map[to.Y, to.X]) + 1; // 離開目的地的距離(加1),用作標記
  for (int i = 0; i < offsets.Length; i++)
  {
  nbr = Fcl.Add(to, offsets[i]); // 開始尋找四周的鄰居
  if (Block.IsMan(map[nbr.Y, nbr.X])) break; // 到達出發點(即工人的位置)
  if (Block.IsBlank(map[nbr.Y, nbr.X])) // 可以走的路
  {
  Block.Mark(ref map[nbr.Y, nbr.X], value); // 標記,防止以后再走這條路
  q.Enqueue(nbr); // 加入隊列,等待以后繼續尋找
  }
  }
  if (Block.IsMan(map[nbr.Y, nbr.X])) break; // 到達出發點
  if (q.Count == 0) return false; // 無法到達出發點
  to = q.Dequeue(); // 出隊,繼續尋找,這是廣度優先搜索,因為前面已經把四周能夠走的路全部加入隊列中了.
  }
  return true; // 找到一條路線
  }
  }
  }

  靜態類 FindPath 是用來尋找工人移動到鼠標點擊的目的地的最短路線的。她采用一種廣度優先搜索算法,使用循環,沒有使用遞歸,而且地圖上已經搜索過的路線決不再走第二遍。該算法分兩個階段進行:首先是尋找并標記最短路線,由該類的第二個 Seek 方法實現,這個私有的方法返回一個布爾值表明是否成功。然后,如果在第一階段中找到了一條路線,則根據第一階段所做的標記生成最短路線并將該路線返回給調用者。我們來看幾個實例:

  c#開發手機游戲推箱子c#開發手機游戲推箱子

  在該算法中,是從要到達的目的地開始往回尋找出發點。首先,將目的地標記為1,然后查看周圍的四個鄰居(按南、東、北、西的順序)是否是“空白”(即“地”和“槽”,使用 Block.IsBlank 方法來判斷),如是,則表明這是可以走的路,將其作上標記(使用 Block.Mark 方法,標記的數值等于離開目的地的距離加一),然后加入隊列。這有兩個作用,首先,標記過的單元格將不再被認為是可以走的路,防止重復搜索。其次,在第二階段中要根據標記的值來生成最短路線。如果發現周圍的鄰居中有一個是工人(用 Block.IsMan 方法來判斷),說明到達出發點,則立即結束搜索,退出循環,返回成功。否則,就檢查隊列是否為空,如果為空,則說明無法到達出發點,返回失敗。如果不為空,則出隊,從這一點繼續開始搜索。如此一直循環。

  這個算法是廣度優先的,如上面的兩個圖所示,該算法是按標記的值從小到大進行遍歷的,而該標記的值表示的是離開目的地的距離加一。

  第二個階段,如果在第一階段返回失敗,則返回一條空的路線(長度為零)給調用者。否則,從出發點(即工人的位置)開始,查看周圍的四個鄰居(按南、東、北、西的順序),如果其標記的值(使用 Block.Value 方法來獲得)為到目的地的距離加一(至少可以找到一個,可能有多個,可以任取一個,程序中使用第一個),就往這個方向走。如此一直循環,直到到達目的地。然后返回這條路線給調用者。

  從這里可以看出,為什么地圖(即 ushort[,] map)要使用 ushort 而不使用 byte。因為在該算法需要在地圖中作標記,而且標記的值還必須是到目的地的距離加一(如果只須判斷目的地是否可達,而不要求給出到達目的地的具體路線,則在算法中標記的值可全部都為1,這樣用 byte 就足夠了)。地圖中總共有八種類型的單元格,需要用三個二進位表示。而 byte 只有八個二進位,那么,只剩下五個二進位,25=32,也就是說,目的地在工人32步以外該算法就無能為力了。而 ushort 有十六個二進位,減去三個,還有十三個二進位,213=8192,這應該足夠了。讓我們看看下圖吧:

c#開發手機游戲推箱子

  這是一個 9x9 的地圖,共有81個單元格,其中49個是空地,假設目的在地圖的右上角(標記為1的地方),則工人需要48步才能到達目的地。根據計算,如果是 NxN (這里N是奇數)的地圖,工人在最壞的情況下需要 (N2 - 1)/2 + N -1 步(走最短路線)才能到達目的地。這就是說,在 127x127 的地圖上,工人最多只需要 8190 步就可以到達目的地,這剛好在我們算法的范圍之內。如果地圖再大,我們的算法就可能(只是可能,因為在大地圖上一般情況下并不會出現超過 8192 步的最短路線)無能為力了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲二区| 欧美日韩国产成人在线观看| 欧美激情第99页| 国产日韩在线观看av| 亚洲一区二区黄| 波霸ol色综合久久| 欧美乱人伦中文字幕在线| 中文.日本.精品| 日韩欧美国产一区二区| 亚洲第一精品自拍| 欧美性极品少妇精品网站| 亚洲视频网站在线观看| 欧美激情性做爰免费视频| 日韩精品视频观看| 国产一区二区三区四区福利| 国产精品欧美风情| 欧美亚洲国产视频| 午夜精品久久17c| 久久久噜久噜久久综合| 国产精品黄色影片导航在线观看| 国产成人中文字幕| 欧美午夜精品久久久久久人妖| 91av在线播放| 91精品国产综合久久香蕉| 亚洲色在线视频| 欧美日韩国产页| 欧美激情免费在线| 欧美激情视频网站| 精品久久久精品| 不卡在线观看电视剧完整版| 国产成一区二区| 日本午夜精品理论片a级appf发布| 久操成人在线视频| 国产午夜精品一区理论片飘花| 91精品久久久久久久久久另类| 亚洲区bt下载| 国产在线精品成人一区二区三区| 91av在线网站| 国产97人人超碰caoprom| 欧美专区在线视频| 全亚洲最色的网站在线观看| 成人久久久久爱| 中文字幕亚洲综合久久筱田步美| 青青草99啪国产免费| 国产99久久精品一区二区| 日韩av毛片网| 另类专区欧美制服同性| 久久久999国产| 久久久久久久久久久免费精品| 亚洲丝袜一区在线| 欧美一级视频免费在线观看| 亚洲欧美成人精品| 国产深夜精品福利| 国产做受高潮69| 日韩激情av在线免费观看| 国产精品视频一区二区三区四| 欧美激情精品久久久久久黑人| 日韩精品高清视频| 国产精品一区二区久久久久| 精品无人区太爽高潮在线播放| 亚洲一区二区三区乱码aⅴ| 国产精品日韩精品| 性亚洲最疯狂xxxx高清| 成人精品福利视频| 亚洲欧美色婷婷| 国产欧美精品日韩精品| 日韩欧美中文免费| 在线精品视频视频中文字幕| 国产精品jvid在线观看蜜臀| 欧美专区在线播放| 午夜精品三级视频福利| 91高潮精品免费porn| 国产精品视频999| 国产精品久久国产精品99gif| 亚洲成人精品视频在线观看| 成人免费看吃奶视频网站| 亚洲天堂成人在线视频| 欧美成人激情图片网| 中文字幕精品—区二区| 欧美日产国产成人免费图片| 成人欧美一区二区三区在线湿哒哒| 亚洲女性裸体视频| 成人精品久久一区二区三区| 亚洲人成电影网站色www| 国产精品美女免费看| 久热精品在线视频| 91wwwcom在线观看| 日韩美女视频免费在线观看| 全亚洲最色的网站在线观看| 久久久久国产一区二区三区| 欧美电影电视剧在线观看| 久久99精品国产99久久6尤物| 欧美xxxx做受欧美.88| 欧美成人免费观看| 国产亚洲精品综合一区91| 日韩精品丝袜在线| 91欧美激情另类亚洲| 成人乱色短篇合集| 亚洲最大的成人网| 欧美人与性动交| 欧美黑人性生活视频| 久久免费国产视频| 在线视频亚洲欧美| 国产精品一区二区三区久久久| 欧美国产日韩一区| 日本国产欧美一区二区三区| 久久91精品国产91久久久| 国产精品第二页| 深夜成人在线观看| 亚洲一区二区三区xxx视频| 国产精品私拍pans大尺度在线| 宅男66日本亚洲欧美视频| 国产亚洲视频在线观看| 68精品国产免费久久久久久婷婷| 精品自在线视频| 一区二区三区天堂av| 色yeye香蕉凹凸一区二区av| 日韩精品极品毛片系列视频| 中文字幕9999| 亚洲97在线观看| 欧美视频专区一二在线观看| 日韩免费av片在线观看| 久热精品视频在线| 日韩精品高清在线| 欧美日韩不卡合集视频| 欧美情侣性视频| 亚洲精品v欧美精品v日韩精品| 日韩视频免费大全中文字幕| 国产精品九九久久久久久久| 在线精品高清中文字幕| 久久久www成人免费精品| 国内揄拍国内精品少妇国语| 久久久久久高潮国产精品视| 久久久精品国产网站| 国产午夜精品免费一区二区三区| 98精品国产自产在线观看| 国产精品久久久久久一区二区| 96精品久久久久中文字幕| 欧美怡春院一区二区三区| 日韩在线视频中文字幕| 亚洲日韩欧美视频| 日韩网站免费观看| 尤物tv国产一区| 久久97精品久久久久久久不卡| 黄色成人在线免费| 亚洲欧美日韩区| 国产精品入口福利| 国产有码一区二区| 欧美孕妇孕交黑巨大网站| 日韩精品免费视频| 国产伦精品一区二区三区精品视频| 日韩成人免费视频| 97免费在线视频| 国产精品久久久久久久久久小说| 亚洲欧洲一区二区三区久久| 亚洲国产成人av在线| 成人免费直播live| 亚洲视频欧洲视频| 中文国产亚洲喷潮| 国产精品91一区| 亚洲国产精品久久久久| 欧美极度另类性三渗透| 美女撒尿一区二区三区| www.日韩不卡电影av|