精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談A*算法的一個C#實現

開發 后端 算法
最近正在讀云風的《游戲之旅》,看著看著就讀到了A*尋路算法,雖然以前沒有接觸過,但總覺得好奇。于是從網上找了一些C#實現資料便開始研究。

當然,主要參考的算法文檔是“http://www.vckbase.com/document/viewdoc/?id=1422”不過這里并沒有給出實際的源代碼。而搜了一下A*算法的代碼,大都是ActionScript的源碼。畢竟用Flash做一個Demo會方便很多。不過既然都打開了VisualStudio,那么就用寫一個C#實現吧。

A*算法最主要的是對路徑的評分函數。而實際應用時,這個函數的設計會產生不同的結果。從上面的文檔中我們可以很容易地了解到評分F的公式:

         F = H + G

當然根據文中提到的簡便方法,我們可以對H和G的計算寫出下面的代碼。

1private int G(int parent)
2{
3    int d = 10;
4    return d + parent;
5}
6private int H(int x, int y, Point end)
7{
8    return (Math.Abs(x - end.X) + Math.Abs(y - end.Y)) * 10;
9}
為了進行尋路的計算,我們還需要一個類來保存針對地圖上某些點遍歷信息的記錄,比如這個點的F、G、H值各是多少,這個點的坐標以及到達這個點的上一個點的坐標。


 1class PathNode : IComparable
 2{
 3    public int G;
 4    public int H;
 5    public int F {
 6        get{
 7            return G + H;
 8        }
 9    }
10
11    public PathNode Parent;
12    public Point Position;
13
14    public PathNode(Point pos)
15    {
16        this.Position = pos;
17        this.Parent = null;
18        this.G = 0;
19        this.H = 0;
20    }
21
22    public override string ToString()
23    {
24        return Position.ToString();
25    }
26
27    IComparable Members#region IComparable Members
28    public int CompareTo(PathNode other)
29    {
30        return F - other.F;
31    }
32    #endregion
33}

PathNode這個類實現了IComparable接口,目的是為了對PathNode列表進行排序。還記得上面提到的文章中的一句話嗎“尋找開啟列表中F值最低的格子。我們稱它為當前格。”沒錯,這就是為這個條件做的準備。對于尋找F值最低的“格子”,把開啟列表一排序就OK了。

在實現實際的算法時,還需要準備3個容器對象:

private List unLockList = new List();
private Dictionary lockList = new Dictionary();
private List path = new List();


前兩個是算法中提到的“開啟列表”和“關閉列表”,最后一個是找到的最終路徑。
最后來實現A*算法:

 1public List FindPath()
 2{
 3    unLockList.Clear();
 4    lockList.Clear();
 5    path.Clear();
 6    doFindPath();
 7    path.Reverse();
 8    return path;
 9}
10
11private void doFindPath()
12{
13    PathNode start = new PathNode(Start);
14    PathNode cur = start;
15    while (true)
16    {
17        if(!lockList.ContainsKey(cur.ToString()))
18            lockList.Add(cur.ToString(), cur);
19        for (int i = 0; i < delta.Length; i++)
20        {
21            Point newp = new Point(cur.Position.X + delta[i][0],
22                cur.Position.Y + delta[i][1]);
23            if (!canWalkOnIt(newp))
24                continue;
25            if (lockList.ContainsKey(newp.ToString()))
26                continue;
27            if (isPointInUnlockList(newp))
28            {
29                PathNode ulnode = __pn;
30                int newg = G(cur.G);
31                if (newg < ulnode.G)
32                {
33                    ulnode.Parent = cur;
34                    ulnode.G = newg;
35                }
36                continue;
37            }
38            PathNode newpn = new PathNode(newp);
39            newpn.G = G(cur.G);
40            newpn.H = H(newp.X, newp.Y, End);
41            newpn.Parent = cur;
42            unLockList.Add(newpn);
43        }
44        if (unLockList.Count == 0)
45            break;
46        unLockList.Sort();
47        cur = unLockList[0];
48        unLockList.Remove(cur);
49       
50        if (cur.Position.Equals(End))
51        {
52            while (cur != null)
53            {
54                path.Add(cur);
55                cur = cur.Parent;
56            }
57            break;
58        }
59    }
60}
61
62private PathNode __pn;
63
64private bool isPointInUnlockList(Point src)
65{
66    __pn = null;
67    foreach (PathNode item in unLockList)
68    {
69        if (item.Position.Equals(src))
70        {
71            __pn = item;
72            return true;
73        }
74
75    }
76    return false;
77}
78
79private bool canWalkOnIt(Point node)
80{
81    if (node.X < 0 || node.Y < 0)
82        return false;
83    if (node.X > Width - 1 || node.Y > Height - 1)
84        return false;
85    return GetNodeValue(node.X, node.Y) >= 0;
86}

沒寫什么注釋,但思路就是上文中的“A*方法總結”。在此就不重新粘貼一遍了。在此需要多啰嗦兩句的是,關閉列表用了一個Dictionary,其實關閉列表的目的就是查找下一個點是否在關閉列表當中,用Dictionary的ContainsKey方法比較容易,畢竟在Hashtable中找個Key總比在List中找個元素要快。

為了簡化C#實現算法,這里只是遍歷了當前點的上下左右4個相鄰點。上文中介紹的是遍歷8個點的情況,不過這也不是很復雜,只不過麻煩點在于G這個方法,需要判斷一下是不是斜向走的。另外對4個相鄰點的遍歷,方法來源于之前看的一段AS代碼,它用了一個偏移量數組來保存8個偏移量。而這里只是保存了4個偏移量。在實際的算法中,循環一下偏移量數組就很方便了(之前見過一個代碼并沒有用這個方法,而是復制了8短類似的函數調用代碼,邏輯上就不如這個看的清晰)。delta數組如下:

private int[][] delta = new int[][]{
    new int[]{0,1},
    new int[]{0,-1},
    new int[]{1,0},
    new int[]{-1,0}
};

另一個C#實現過程中需要注意的地方是如果4個偏移后的新點包含在開啟列表中,那么應該是對開啟列表中對應的PathNode的G值進行更新。如果是重新new一個新的PathNode,然后再加入開啟列表,那么算法就會出現問題,有可能會陷入無限循環。

對于尋路的結果獲取無非就是對PathNode鏈表中每個PathNode進行遍歷,然后放到一個List中再Reverse一下。對于地圖來說,這里用的是一個int數組,元素小于0的時候代表不能通過。而A*算法計算出的結果可能并不是最優的結果,不過其效率還是比較高的,原因在于有了評分函數的幫助可以遍歷更少的節點。

最后,還是貼上整個Demo項目的文件吧,結構和代碼看起來可能并不優雅。

【編輯推薦】

  1. 為ASP.NET控件加入快捷菜單
  2. 為Asp.net控件寫單元測試(ViewState)
  3. ASP.NET開發程序過程中值得注意的兩個地方
  4. ASP.NET、JSP和PHP究竟哪個好
  5. ASP.NET頁面請求原理淺析
責任編輯:彭凡 來源: cnblogs
相關推薦

2009-08-31 13:53:03

C#創建一個文件

2009-06-16 10:20:05

多繼承C#

2009-08-17 17:16:19

C#實現在線升級

2024-06-05 08:17:37

C#算法數據科學

2009-07-30 18:18:27

C#時間計算

2009-08-18 17:19:33

C#事件模型

2011-03-29 09:14:49

Dispose模式C#

2011-09-21 10:56:31

C#結構

2009-08-20 18:30:33

C# ReaderWr

2009-08-19 14:15:42

C# 復合控件

2009-09-17 17:13:54

C#數組

2009-08-14 10:51:43

2009-08-31 14:01:50

C#創建一個文件

2009-08-25 01:46:00

C# WINDOWS服

2009-08-26 15:53:42

C#數據訪問XML

2009-09-11 12:17:59

C#控件屬性

2009-08-14 00:55:21

C#程序編譯

2009-08-31 09:37:09

C# Employee

2009-08-12 11:24:25

C# String對象

2009-08-19 17:12:18

C# Connecti
點贊
收藏

51CTO技術棧公眾號

久草免费新视频| 欧美日韩亚洲91| 日韩一级完整毛片| 另类欧美小说| 国产精品变态另类虐交| 亚洲资源在线| 99国产精品久久久久久久| 欧美日韩日日摸| 久久亚洲高清| 中文字幕欧美人妻精品一区蜜臀 | 欧美一区二区三区免费视| 99re6在线观看| 黄色大片在线免费观看| silk一区二区三区精品视频| 国产精品二三区| 欧美亚洲在线视频| 麻豆网址在线观看| 99久久伊人| 国产午夜精品久久久久久免费视| 久久免费视频这里只有精品| 美女伦理水蜜桃4| 2024最新电影在线免费观看| 国产原创一区二区三区| 日韩中文视频免费在线观看| 免费看黄色一级大片| 日本天堂在线| 亚洲中午字幕| 国产午夜精品久久久 | 成人在线手机视频| 精品3atv在线视频| 国产亚洲精品资源在线26u| 成人欧美一区二区三区在线观看| 男女免费视频网站| 第九色区aⅴ天堂久久香| 色婷婷精品久久二区二区蜜臂av | 亚洲第一第二区| 欧美a级在线| 日韩欧美国产一区二区在线播放| 国产精品无码电影在线观看| 亚洲精品国产一区二| 麻豆高清免费国产一区| 久久综合伊人77777蜜臀| 亚洲一二三av| 福利一区二区免费视频| 一本一道综合狠狠老| 日本中文字幕网址| 美丽的姑娘在线观看免费动漫| 噜噜爱69成人精品| 中文国产亚洲喷潮| 精品人妻一区二区三区免费| 欧美人与性动交α欧美精品济南到| 国产成人午夜视频| 97在线免费观看视频| a毛片毛片av永久免费| 日本一区二区三区视频在线| 亚洲丝袜精品丝袜在线| 动漫一区二区在线| www.黄色小说.com| 玖玖视频精品| 欧美成人性生活| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 户外露出一区二区三区| 色偷偷88欧美精品久久久| 亚洲午夜无码av毛片久久| 国模少妇一区二区三区| 老司机福利在线视频| 久久91成人| 欧美日韩精品欧美日韩精品| 亚洲免费一级视频| 欧美wwww| 午夜欧美视频在线观看| 亚洲一区二区高清视频| 国模人体一区二区| 美女一区二区三区在线观看| 国语自产精品视频在线看一大j8 | 精品久久久国产| 日韩免费av电影| 亚洲AV午夜精品| 成人精品gif动图一区| 国产精品美乳一区二区免费 | 潘金莲一级淫片aaaaa| 综合日韩av| 亚洲欧美日韩成人高清在线一区| 麻豆一区区三区四区产品精品蜜桃| 五月婷婷综合久久| 国产河南妇女毛片精品久久久| 不卡视频一区二区| 91麻豆国产在线| 丝袜亚洲另类欧美| 91精品久久久久久久久久| 国产免费av一区| 国模大胆一区二区三区| 精品国产欧美一区二区五十路| 成人网站免费观看| 极品一区美女高清| 日韩精品最新网址| 欧美做受喷浆在线观看| 久久美女视频| 亚洲色图18p| 毛茸茸多毛bbb毛多视频| 日本电影一区二区| 色在人av网站天堂精品| 日韩欧美123区| 久久一区二区三区喷水| 欧美第一页在线| 亚洲天堂一级片| 国产偷自视频区视频一区二区| 色综合久久精品亚洲国产| 欧美a∨亚洲欧美亚洲| 激情欧美一区二区三区| 欧美肥婆姓交大片| 无码人妻丰满熟妇奶水区码| 老鸭窝91久久精品色噜噜导演| 国产欧美在线视频| 天堂中文资源在线| www国产精品av| 免费久久久一本精品久久区| 九七久久人人| 在线视频一区二区三| 日本成人中文字幕在线| 日韩欧美一区二区三区在线观看| 欧美一区二区免费视频| 伦伦影院午夜理论片| 三级小说欧洲区亚洲区| 日韩精品在线播放| 欧美国产精品一二三| 欧美日韩少妇| 久久人人97超碰精品888 | 欧美高清激情brazzers| 亚洲一级片av| 精品久久久久久久久久久aⅴ| 尤物精品国产第一福利三区| 久久久久久成人网| 亚洲综合丁香| 精品无人区一区二区三区竹菊| 四虎影院在线播放| 亚洲国产精品麻豆| 久久9精品区-无套内射无码| 日本h片久久| 亚洲精品自拍视频| 受虐m奴xxx在线观看| 亚洲大片在线| 国产精品免费一区二区三区四区| 天堂av在线资源| 亚洲一区二区精品久久av| 日韩欧美国产综合在线| 在线视频亚洲欧美中文| 日韩精品小视频| 国产chinese中国hdxxxx| 深夜福利久久| 日本91av在线播放| 国产尤物在线观看| 国产精品日韩精品欧美在线| 日韩中文字幕亚洲精品欧美| 人狥杂交一区欧美二区| 欧美日韩精品一区二区三区蜜桃| 免费看91的网站| 国产一区日韩欧美| 99久久一区三区四区免费| 日韩伦理电影网站| 在线欧美小视频| 蜜桃传媒一区二区亚洲| 欧美日韩精品一本二本三本| 5566中文字幕一区二区| 国产综合在线观看| 在线观看日韩一区| 亚洲欧美卡通动漫| 国产精品入口66mio| 久久国产精品高清| sm国产在线调教视频| 色婷婷激情一区二区三区| av网在线播放| 久久精品国产网站| 无码人妻精品一区二区蜜桃百度| 一区二区三区亚洲变态调教大结局| 九九视频直播综合网| 人妻少妇精品无码专区| 亚洲欧洲国产专区| 国产精品wwwww| 成人另类视频| 欧美综合在线第二页| av网站在线免费观看| 岛国av一区二区在线在线观看| 瑟瑟视频在线观看| 精品一区二区国语对白| 97超碰在线人人| 秋霞一区二区三区| 久久精品国产一区二区电影| 91麻豆精品在线| 久久中文娱乐网| 日本中文字幕网址| 日韩欧美高清在线播放| 国产成人鲁鲁免费视频a| 午夜av免费在线观看| 欧美体内she精视频| 波多野结衣一本| 亚洲精品看片| 国产一区二区黄色| аⅴ资源天堂资源库在线| 欧美成人一区二区三区片免费 | 国产欧美短视频| 先锋影音一区二区三区| 小黄鸭精品aⅴ导航网站入口| 亚洲国产欧美一区二区三区同亚洲| 久久国产在线观看| 国产女同互慰高潮91漫画| 国产xxxxx视频| 欧美三级免费| 亚洲精品不卡| 日韩伦理一区二区| 搡老女人一区二区三区视频tv| 亚洲欧美黄色片| 欧美日韩国产美| 欧美 日韩 精品| 综合欧美亚洲日本| 日本xxxxxxxxx18| www.亚洲人| 播放灌醉水嫩大学生国内精品| 9999国产精品| 日韩啊v在线| 日本欧美韩国国产| 国产aaa精品| 99中文字幕一区| 精品爽片免费看久久| 高清国产mv在线观看| 欧美剧在线免费观看网站| 中文字幕在线播| 欧美日韩亚洲一区二区三区| 国产亚洲精品码| 99久久99久久精品免费观看| 日本xxxxxxx免费视频| 亚洲国产精品第一区二区三区| 色撸撸在线观看| 都市激情亚洲欧美| 日本高清不卡的在线| 77thz桃花论族在线观看| 亚洲欧美一区二区精品久久久| 亚洲精品久久久久久无码色欲四季| 欧美日韩成人综合| 怡红院男人的天堂| |精品福利一区二区三区| 国产aⅴ激情无码久久久无码| 91免费观看在线| 日本丰满少妇裸体自慰| 91一区二区三区在线观看| 在线天堂www在线国语对白| 国产99久久精品| 国产l精品国产亚洲区久久| 亚洲精品日韩久久| 欧美日本视频在线观看| 日韩中文字幕高清在线观看| 日韩片电影在线免费观看| 国产日产精品一区二区三区四区的观看方式 | 国产a级黄色大片| 精品96久久久久久中文字幕无| 国产精品一线二线三线| 国产一区二区三区久久| 人妻少妇被粗大爽9797pw| 玖玖精品视频| 中文字幕亚洲欧洲| 国产农村妇女毛片精品久久莱园子| aa视频在线播放| 青青草成人影院| 亚洲五月六月| 欧美精品自拍| 国产97在线 | 亚洲| 久久婷婷久久| 欧美wwwwwww| 噜噜噜91成人网| 性chinese极品按摩| 国产一区二区久久| 精品少妇人妻av一区二区三区| 麻豆91精品91久久久的内涵| 欧美美女性视频| 国产福利电影一区二区三区| 91丝袜在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 91成人在线观看喷潮蘑菇| 成人99免费视频| 性欧美一区二区| 亚洲色图一区二区| 在线观看 中文字幕| 亚洲精品视频一区二区| 国产一级在线观看视频| 色婷婷亚洲婷婷| 国产黄色小视频在线观看| 欧美日韩免费一区二区三区视频| 99久久精品免费看国产交换| 欧美日韩一区二区三区四区 | 美女黄色成人网| 中文字幕剧情在线观看| 久久国产精品一区二区| 国产精品人人妻人人爽人人牛| 国内久久精品视频| 性欧美丰满熟妇xxxx性仙踪林| 亚洲欧美怡红院| 日韩欧美成人一区二区三区| 69p69国产精品| 97人妻精品一区二区三区动漫| 欧美视频一区在线| 国模人体一区二区| 久久精品视频亚洲| 成人亚洲欧美| 青青a在线精品免费观看| 国产亚洲久久| 亚洲影院色无极综合| **国产精品| 久久这里精品国产99丫e6| 亚洲美女视频| 男女裸体影院高潮| 首页亚洲欧美制服丝腿| 怡红院一区二区| 自拍av一区二区三区| 无码人妻精品一区二区蜜桃色欲| 精品国产制服丝袜高跟| 91精品国产乱码久久久| 国产视频精品久久久| 天堂8中文在线| 国产日韩欧美日韩| 国产一区二区三区探花| www黄色日本| 成人aa视频在线观看| 欧美极品视频在线观看| 欧美久久久久免费| aaa日本高清在线播放免费观看| 国产91精品久久久| 福利在线一区| 日本wwwcom| 国产.欧美.日韩| 久久老司机精品视频| 欧美一区二区视频在线观看2022 | 亚洲盗摄视频| 欧美日韩精品免费观看| 日韩激情一区| 欧美伦理视频在线观看| 国产午夜精品在线观看| 黄色av一级片| 欧美日韩在线免费视频| 毛片在线播放网站| 国产91色在线播放| 久久av网址| 欧美亚洲日本在线观看| 久久亚洲精品国产精品紫薇| 久久久久久久久久影院| 日韩激情在线视频| 625成人欧美午夜电影| 蜜桃麻豆www久久国产精品| 一区二区三区国产在线| 人妻在线日韩免费视频| 欧美日在线观看| 136福利视频导航| 最近2019中文免费高清视频观看www99| 久久野战av| 亚洲自拍偷拍二区| 狠狠网亚洲精品| 强行糟蹋人妻hd中文| 日韩一级成人av| 日本不卡影院| 精品网站在线看| 日韩成人午夜电影| 精品伦一区二区三区| 亚洲不卡在线观看| 你懂的视频在线观看| 国产精品日韩欧美综合| 亚洲精品网址| 欧美婷婷精品激情| 亚洲视频在线一区| 亚洲精品国产片| 青青在线视频一区二区三区| 欧美综合一区| 色婷婷一区二区三区在线观看| 亚洲一区二区成人在线观看| 亚洲av片在线观看| 国产精品美女免费视频| 欧美国产免费| 国产精品无码一区二区三区免费| 在线亚洲高清视频| 99热国产在线| 欧美动漫一区二区| 激情综合色综合久久综合| 国产午夜福利精品| 在线观看亚洲区| 一本色道69色精品综合久久| 日韩视频第二页| 综合久久久久久| 色天堂在线视频| 成人欧美一区二区三区黑人孕妇| 欧美极品在线观看| 日本高清一区二区视频| 午夜精品久久久久久久久久| melody高清在线观看| 91精品国产91久久久久久不卡| 综合激情五月婷婷| 男女av免费观看| 亚洲男女一区二区三区| 欧美新色视频| 不卡一区二区三区视频| 免费在线观看成人| 亚洲免费在线观看av| 久久综合五月天|