精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品专区在线| 国产欧美日韩综合精品二区| 午夜时刻免费入口| 国产精品高清一区二区| 亚洲国产精品一区二区www在线| 精品日本一区二区| 亚洲天堂手机在线| 欧美午夜视频| 伊人久久久久久久久久久久久| 999这里有精品| 秋霞伦理一区| 亚洲视频网在线直播| 国产一区二区三区四区五区加勒比| 日韩电影在线观看一区二区| 综合久久十次| 亚洲性xxxx| 无码av免费精品一区二区三区| 欧美123区| 亚洲成人免费电影| 在线一区高清| 国产无套粉嫩白浆在线2022年| 国产一区二区三区高清播放| 日韩美女视频在线观看| 农村妇女精品一区二区| 精品美女久久| 亚洲国产美女久久久久| theporn国产精品| 另类专区亚洲| 亚洲福利一二三区| 在线观看17c| 午夜在线视频| 久久精品视频在线免费观看| 国产伦精品一区二区三| 国产男女裸体做爰爽爽| 青青草伊人久久| 26uuu另类亚洲欧美日本一| 日韩欧美中文字幕视频| 久久福利综合| 中文字幕亚洲欧美日韩2019| 黄色国产在线观看| 国产成人在线中文字幕| 91精品国产综合久久国产大片| 美女网站视频黄色| 欧美色网在线| 色吊一区二区三区| 国产午夜福利视频在线观看| 99热99re6国产在线播放| 亚洲精选在线视频| 潘金莲一级淫片aaaaa免费看| 在线观看完整版免费| 国产亚洲精久久久久久| 欧美一区二区三区精美影视| 同心难改在线观看| 国产盗摄女厕一区二区三区| 51国偷自产一区二区三区| 国产精品免费无遮挡| 狠狠色丁香婷婷综合久久片| 成人免费大片黄在线播放| 国产有码在线观看| 国产综合久久久久久鬼色| 91麻豆国产语对白在线观看| 国产又黄又粗又长| 国产精品亚洲第一区在线暖暖韩国| 91精品视频在线看| 国产精品一区二区三区在线免费观看 | 国产一级黄色av| 一区二区中文| 欧美丰满少妇xxxxx| 久久这里只有精品免费| 亚洲精选成人| 欧洲亚洲女同hd| 91麻豆精品在线| 久久丁香综合五月国产三级网站| 成人黄色网免费| 国产v片在线观看| 成人h动漫精品一区二区| 国产一区二区精品免费| 你懂的视频在线免费| 国产区在线观看成人精品| 午夜精品美女久久久久av福利 | 欧美激情精品久久久久久蜜臀| 久草视频免费在线| 亚洲在线黄色| 国产精品最新在线观看| 国产wwwxxx| 91网页版在线| 一区二区三区偷拍| 日本性爱视频在线观看| 精品久久久久久中文字幕| 日本成人中文字幕在线| 少妇高潮一区二区三区99| 日韩女优av电影在线观看| 女同毛片一区二区三区| 91亚洲一区| 久久久久久国产| 波多野结衣视频观看| 国产精品77777| 日韩久久不卡| gogo久久| 欧美裸体bbwbbwbbw| 久久久老熟女一区二区三区91| 国产精品一区二区av日韩在线| 久久久成人精品视频| 国产又黄又粗又爽| 韩国理伦片一区二区三区在线播放| 高清国产一区| 日本三级视频在线播放| 亚洲电影一级黄| 一级黄色录像在线观看| 男人的天堂久久| 久久精品久久精品亚洲人| 99热在线观看免费精品| 国产米奇在线777精品观看| 欧美日韩一区在线视频| 欧美人与牲禽动交com| 欧美日免费三级在线| 亚州av综合色区无码一区| 香蕉综合视频| 国产精品电影在线观看| 日韩专区第一页| 亚洲欧美激情插| 黄色三级视频在线| 欧美国产不卡| 欧美激情二区三区| 国产绳艺sm调教室论坛| 国产精品视频观看| 蜜臀久久99精品久久久酒店新书 | 国产黄色片视频| 激情另类小说区图片区视频区| 鲁丝片一区二区三区| 999福利在线视频| 日韩欧美123| 美女福利视频在线观看| 久久97超碰色| 正义之心1992免费观看全集完整版| 色豆豆成人网| 亚洲免费电影一区| 日韩精品一卡二卡| 成人性生交大片免费看中文网站| 超级碰在线观看| 国产一区二区三区视频在线| www.久久久久| 亚洲图片欧美在线| 国产精品午夜免费| 日本xxxx黄色| 99久久婷婷国产综合精品电影√| 国产极品精品在线观看| 水中色av综合| 欧美性猛交xxxx免费看| 少妇大叫太粗太大爽一区二区| a91a精品视频在线观看| 久久青青草原一区二区| 在线观看的黄色| 日韩成人黄色av| 天天干在线播放| 国产视频一区二区在线观看| 久久无码高潮喷水| 国产真实有声精品录音| 欧美一区二区色| 国产爆初菊在线观看免费视频网站| 在线视频一区二区三区| 欧美另类69xxxx| 精品一区二区三区日韩| 老汉色影院首页| 亚洲视频精选| 91成人天堂久久成人| 欧美孕妇孕交| 欧美四级电影在线观看| 中文字幕美女视频| 国产成人小视频| 少妇无码av无码专区在线观看| 亚洲婷婷丁香| 国产日韩精品在线观看| 在线视频观看国产| 日韩av网站导航| 欧美激情一区二区三区免费观看| 国产精品久久久久婷婷| 99国产精品免费视频| 99成人在线| 图片区小说区区亚洲五月| 国产精品毛片aⅴ一区二区三区| 久久99热这里只有精品国产| 亚洲av成人无码久久精品老人 | 国产精品久久久久久久久晋中| 伊人色在线视频| 亚洲欧洲一区| 亚洲精品一区二| 日韩一区二区三区高清在线观看| 亚洲91精品在线| caoporn国产精品免费视频| 欧美一区在线视频| 国产一级做a爱片久久毛片a| 国产精品婷婷午夜在线观看| 中文字幕1区2区| 久久精品免费| 中文字幕第50页| 亚洲自拍都市欧美小说| 91香蕉电影院| 欧美一区国产| 久久久久久久999| 97超碰人人在线| 亚洲成人精品久久| 91精品国产乱码久久| 午夜激情一区二区三区| 日本视频在线免费| 99精品视频在线观看| 天天摸天天舔天天操| 亚洲欧美bt| 日本wwwcom| 久久一区二区三区喷水| 久久天堂国产精品| 伊人久久噜噜噜躁狠狠躁| 国产精品久久久999| av中文资源在线资源免费观看| 日韩在线视频国产| 男人久久精品| 精品国产一区a| 国产精品视频第一页| 欧美性xxxxhd| 日本在线视频免费| 亚洲激情自拍视频| 又色又爽的视频| 国产日韩欧美在线一区| 99久久人妻精品免费二区| 韩国av一区二区三区| 三级在线视频观看| 免费亚洲婷婷| 亚洲色欲久久久综合网东京热| 97精品一区二区| 亚洲一区不卡在线| 国产一区二区在线| 日韩精品另类天天更新| 亚洲精品国模| 久久久影院一区二区三区| 欧美成a人免费观看久久| 国产精品一区二区你懂得| 日韩高清在线观看一区二区| 成人福利在线视频| 精品自拍视频| 国产精品一二区| 色天使综合视频| 国产精品久久网| 日韩av首页| 国产精品嫩草视频| 久久天堂影院| 国产精品久久久久久久美男 | 99porn视频在线| 精品久久久久久久久久岛国gif| 国产日韩在线看片| 91精品网站在线观看| 成人精品视频99在线观看免费 | 丝袜美腿一区二区三区| 午夜肉伦伦影院| 蜜臀精品一区二区三区在线观看| 九九热在线免费| 极品尤物av久久免费看| 午夜天堂在线视频| 国产精品一区二区三区网站| 蜜桃视频无码区在线观看| 成人h动漫精品一区二区| 国产精品一级黄片| 国产无人区一区二区三区| 阿v天堂2014| 综合av第一页| 国产精品变态另类虐交| 图片区小说区区亚洲影院| 国产在线观看黄色| 欧美视频一区二区三区在线观看 | 成人ar影院免费观看视频| 中文字幕 日本| 久久女同精品一区二区| 亚洲不卡的av| 亚洲在线一区二区三区| 日本一区二区三区免费视频| 色久综合一二码| 国产精品欧美激情在线| 欧美精品一区二区三区蜜臀 | 豆花视频一区二区| 欧美激情第一页在线观看| 成人久久综合| 欧美视频在线第一页| 欧美专区在线| 91欧美一区二区三区| 99精品国产91久久久久久| 女人黄色一级片| 一区二区欧美视频| 91在线视频免费播放| 欧美人动与zoxxxx乱| 免费观看a视频| 伊人久久免费视频| 不卡的av影片| 91精品国产综合久久香蕉| 都市激情亚洲| 综合操久久久| 老司机午夜精品视频| 欧美视频亚洲图片| 久久在线免费观看| 私库av在线播放| 欧美亚洲尤物久久| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 国产亚洲精品一区二555| 久久青青色综合| 国产精品综合网站| 天天躁日日躁狠狠躁欧美巨大小说| 在线亚洲美日韩| 日韩精品成人一区二区在线| 佐佐木明希电影| 国产精品美女久久久久久久| 亚洲精品视频在线观看免费视频| 欧美久久免费观看| 免费播放片a高清在线观看| 欧美黑人一级爽快片淫片高清| 视频二区不卡| 好吊色欧美一区二区三区| 亚洲国产精品久久久天堂| 国产区二区三区| 国产亚洲精品久| 日本中文字幕在线| 亚洲变态欧美另类捆绑| 18网站在线观看| 国产日韩av在线播放| 清纯唯美亚洲综合一区| 欧美一级在线看| 99热这里都是精品| 免费在线一区二区三区| 91精品国产日韩91久久久久久| 成年网站在线| 国产a∨精品一区二区三区不卡| 加勒比久久高清| 日本一本中文字幕| 高清不卡一区二区| 欧美激情一区二区视频| 欧美二区乱c少妇| 伦xxxx在线| 国产色综合天天综合网| 成人影院天天5g天天爽无毒影院| 成人在线观看黄| 久久久综合激的五月天| 日本午夜视频在线观看| 日韩精品免费电影| 欧美调教sm| 欧美日韩亚洲免费| 久久久久久久高潮| 中文字幕在线看高清电影| 欧美性xxxx18| 高清在线观看av| 国产在线精品自拍| 99视频精品全国免费| www.com久久久| 亚洲色图19p| 99精品在线看| 高清欧美性猛交xxxx黑人猛交| 懂色av一区二区| 少妇高潮喷水久久久久久久久久| 91玉足脚交白嫩脚丫在线播放| 久久青青草原亚洲av无码麻豆 | 狂野欧美一区| 国产又粗又硬视频| 欧美精品123区| 中文字幕在线三区| 国产精品一区二| 国产精品亚洲综合久久| av黄色在线免费观看| 欧美日韩国产片| 青青青国内视频在线观看软件| 国产在线一区二| 石原莉奈一区二区三区在线观看| 国产探花视频在线播放| 欧美二区三区的天堂| av福利导福航大全在线| 欧美一区二区三区在线播放 | 91在线视频一区| 亚洲国产一区二区精品专区| www.久久国产| 欧美日韩激情一区二区三区| av免费在线免费观看| 激情伦成人综合小说| 蜜臀国产一区二区三区在线播放| 91麻豆免费视频网站| 精品1区2区在线观看| 欧美free嫩15| 国产精品自拍合集| 久久久欧美精品sm网站| 国产毛片在线视频| 97国产在线观看| 久久中文亚洲字幕| 日本精品一二三| 在线观看国产91| 欧美日韩经典丝袜| 午夜精品美女久久久久av福利| 国产激情一区二区三区| 日韩三级一区二区| 欧美疯狂做受xxxx高潮| 精品国产成人| 日本精品一二三区| 欧美日韩国产免费一区二区 | xxx在线播放| 日韩欧美亚洲另类制服综合在线| 欧美第一视频| 久久手机在线视频|