青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

[zz] A*尋路算法

英文原版: http://www.gamedev.net/reference/articles/article2003.asp
中文翻譯版: http://m.shnenglu.com/christanxw/archive/2006/04/07/5126.html

中文翻譯版轉(zhuǎn)載如下(非常感謝原作者以及翻譯作者):

概述

雖然掌握了 A* 算法的人認(rèn)為它容易,但是對于初學(xué)者來說, A* 算法還是很復(fù)雜的。

搜索區(qū)域(The Search Area)

我們假設(shè)某人要從 A 點移動到 B 點,但是這兩點之間被一堵墻隔開。如圖 1 ,綠色是 A ,紅色是 B ,中間藍色是墻。

image001.jpg

 1

你應(yīng)該注意到了,我們把要搜尋的區(qū)域劃分成了正方形的格子。這是尋路的第一步,簡化搜索區(qū)域,就像我們這里做的一樣。這個特殊的方法把我們的搜索區(qū)域簡化為了 2 維數(shù)組。數(shù)組的每一項代表一個格子,它的狀態(tài)就是可走 (walkalbe) 和不可走 (unwalkable) 。通過計算出從 A  B 需要走過哪些方格,就找到了路徑。一旦路徑找到了,人物便從一個方格的中心移動到另一個方格的中心,直至到達目的地。

方格的中心點我們成為“節(jié)點 (nodes) ”。如果你讀過其他關(guān)于 A* 尋路算法的文章,你會發(fā)現(xiàn)人們常常都在討論節(jié)點。為什么不直接描述為方格呢?因為我們有可能把搜索區(qū)域劃為為其他多變形而不是正方形,例如可以是六邊形,矩形,甚至可以是任意多變形。而節(jié)點可以放在任意多邊形里面,可以放在多變形的中心,也可以放在多邊形的邊上。我們使用這個系統(tǒng),因為它最簡單。

開始搜索(Starting the Search)

一旦我們把搜尋區(qū)域簡化為一組可以量化的節(jié)點后,就像上面做的一樣,我們下一步要做的便是查找最短路徑。在 A* 中,我們從起點開始,檢查其相鄰的方格,然后向四周擴展,直至找到目標(biāo)。

我們這樣開始我們的尋路旅途:

1.       從起點 A 開始,并把它就加入到一個由方格組成的 open list( 開放列表 ) 中。這個 open list 有點像是一個購物單。當(dāng)然現(xiàn)在 open list 里只有一項,它就是起點 A ,后面會慢慢加入更多的項。 Open list 里的格子是路徑可能會是沿途經(jīng)過的,也有可能不經(jīng)過。基本上 open list 是一個待檢查的方格列表。

2.       查看與起點 A 相鄰的方格 ( 忽略其中墻壁所占領(lǐng)的方格,河流所占領(lǐng)的方格及其他非法地形占領(lǐng)的方格 ) ,把其中可走的 (walkable) 或可到達的(reachable) 方格也加入到 open list 中。把起點 A 設(shè)置為這些方格的父親 (parent node  parent square) 。當(dāng)我們在追蹤路徑時,這些父節(jié)點的內(nèi)容是很重要的。稍后解釋。

3.        A  open list 中移除,加入到 close list( 封閉列表 ) 中, close list 中的每個方格都是現(xiàn)在不需要再關(guān)注的。

如下圖所示,深綠色的方格為起點,它的外框是亮藍色,表示該方格被加入到了 close list 。與它相鄰的黑色方格是需要被檢查的,他們的外框是亮綠色。每個黑方格都有一個灰色的指針指向他們的父節(jié)點,這里是起點 A 

image002.jpg

 2 

下一步,我們需要從 open list 中選一個與起點 A 相鄰的方格,按下面描述的一樣或多或少的重復(fù)前面的步驟。但是到底選擇哪個方格好呢?具有最小F 值的那個。

 

路徑排序(Path Sorting)

計算出組成路徑的方格的關(guān)鍵是下面這個等式:

F = G + H

這里,

G = 從起點 A 移動到指定方格的移動代價,沿著到達該方格而生成的路徑。

H = 從指定的方格移動到終點 B 的估算成本。這個通常被稱為試探法,有點讓人混淆。為什么這么叫呢,因為這是個猜測。直到我們找到了路徑我們才會知道真正的距離,因為途中有各種各樣的東西 ( 比如墻壁,水等 ) 。本教程將教你一種計算 H 的方法,你也可以在網(wǎng)上找到其他方法。

我們的路徑是這么產(chǎn)生的:反復(fù)遍歷 open list ,選擇 F 值最小的方格。這個過程稍后詳細(xì)描述。我們還是先看看怎么去計算上面的等式。

如上所述, G 是從起點A移動到指定方格的移動代價。在本例中,橫向和縱向的移動代價為 10 ,對角線的移動代價為 14 。之所以使用這些數(shù)據(jù),是因為實際的對角移動距離是 2 的平方根,或者是近似的 1.414 倍的橫向或縱向移動代價。使用 10  14 就是為了簡單起見。比例是對的,我們避免了開放和小數(shù)的計算。這并不是我們沒有這個能力或是不喜歡數(shù)學(xué)。使用這些數(shù)字也可以使計算機更快。稍后你便會發(fā)現(xiàn),如果不使用這些技巧,尋路算法將很慢。

 

既然我們是沿著到達指定方格的路徑來計算 G 值,那么計算出該方格的 G 值的方法就是找出其父親的 G 值,然后按父親是直線方向還是斜線方向加上10  14 。隨著我們離開起點而得到更多的方格,這個方法會變得更加明朗。

 

有很多方法可以估算 H 值。這里我們使用 Manhattan 方法,計算從當(dāng)前方格橫向或縱向移動到達目標(biāo)所經(jīng)過的方格數(shù),忽略對角移動,然后把總數(shù)乘以 10 。之所以叫做 Manhattan 方法,是因為這很像統(tǒng)計從一個地點到另一個地點所穿過的街區(qū)數(shù),而你不能斜向穿過街區(qū)。重要的是,計算 H 是,要忽略路徑中的障礙物。這是對剩余距離的估算值,而不是實際值,因此才稱為試探法。

 

  相加便得到 F 。我們第一步的結(jié)果如下圖所示。每個方格都標(biāo)上了 F  G  H 的值,就像起點右邊的方格那樣,左上角是 F ,左下角是 G,右下角是 H 

image003.jpg

 3

好,現(xiàn)在讓我們看看其中的一些方格。在標(biāo)有字母的方格, G = 10 。這是因為水平方向從起點到那里只有一個方格的距離。與起點直接相鄰的上方,下方,左方的方格的 G 值都是 10 ,對角線的方格 G 值都是 14 

 

H 值通過估算起點于終點 ( 紅色方格 )  Manhattan 距離得到,僅作橫向和縱向移動,并且忽略沿途的墻壁。使用這種方式,起點右邊的方格到終點有 3 個方格的距離,因此 H = 30 。這個方格上方的方格到終點有 4 個方格的距離 ( 注意只計算橫向和縱向距離 ) ,因此 H = 40 。對于其他的方格,你可以用同樣的方法知道 H 值是如何得來的。

 

每個方格的 F 值,再說一次,直接把 G 值和 H 值相加就可以了。

 

繼續(xù)搜索(Continuing the Search)

為了繼續(xù)搜索,我們從 open list 中選擇 F 值最小的 ( 方格 ) 節(jié)點,然后對所選擇的方格作如下操作:

4.       把它從 open list 里取出,放到 close list 中。

5.       檢查所有與它相鄰的方格,忽略其中在 close list 中或是不可走 (unwalkable) 的方格 ( 比如墻,水,或是其他非法地形 ) ,如果方格不在 open lsit 中,則把它們加入到 open list 中。

把我們選定的方格設(shè)置為這些新加入的方格的父親。

6.       如果某個相鄰的方格已經(jīng)在 open list 中,則檢查這條路徑是否更優(yōu),也就是說經(jīng)由當(dāng)前方格 ( 我們選中的方格 ) 到達那個方格是否具有更小的 G值。如果沒有,不做任何操作。

相反,如果 G 值更小,則把那個方格的父親設(shè)為當(dāng)前方格 ( 我們選中的方格 ) ,然后重新計算那個方格的 F 值和 G 值。如果你還是很混淆,請參考下圖。

image004.jpg

 4

Ok ,讓我們看看它是怎么工作的。在我們最初的 9 個方格中,還有 8 個在 open list 中,起點被放入了 close list 中。在這些方格中,起點右邊的格子的 F  40 最小,因此我們選擇這個方格作為下一個要處理的方格。它的外框用藍線打亮。

 

首先,我們把它從 open list 移到 close list  ( 這就是為什么用藍線打亮的原因了 ) 。然后我們檢查與它相鄰的方格。它右邊的方格是墻壁,我們忽略。它左邊的方格是起點,在 close list 中,我們也忽略。其他 4 個相鄰的方格均在 open list 中,我們需要檢查經(jīng)由這個方格到達那里的路徑是否更好,使用 G 值來判定。讓我們看看上面的方格。它現(xiàn)在的 G 值為 14 。如果我們經(jīng)由當(dāng)前方格到達那里, G 值將會為 20( 其中 10 為到達當(dāng)前方格的 G 值,此外還要加上從當(dāng)前方格縱向移動到上面方格的 G  10) 。顯然 20  14 大,因此這不是最優(yōu)的路徑。如果你看圖你就會明白。直接從起點沿對角線移動到那個方格比先橫向移動再縱向移動要好。

 

當(dāng)把 4 個已經(jīng)在 open list 中的相鄰方格都檢查后,沒有發(fā)現(xiàn)經(jīng)由當(dāng)前方格的更好路徑,因此我們不做任何改變。現(xiàn)在我們已經(jīng)檢查了當(dāng)前方格的所有相鄰的方格,并也對他們作了處理,是時候選擇下一個待處理的方格了。

 

因此再次遍歷我們的 open list ,現(xiàn)在它只有 7 個方格了,我們需要選擇 F 值最小的那個。有趣的是,這次有兩個方格的 F 值都 54 ,選哪個呢?沒什么關(guān)系。從速度上考慮,選擇最后加入 open list 的方格更快。這導(dǎo)致了在尋路過程中,當(dāng)靠近目標(biāo)時,優(yōu)先使用新找到的方格的偏好。但是這并不重要。 ( 對相同數(shù)據(jù)的不同對待,導(dǎo)致兩中版本的 A* 找到等長的不同路徑 ) 

 

我們選擇起點右下方的方格,如下圖所示。

image005.jpg

 5

 

這次,當(dāng)我們檢查相鄰的方格時,我們發(fā)現(xiàn)它右邊的方格是墻,忽略之。上面的也一樣。

我們把墻下面的一格也忽略掉。為什么?因為如果不穿越墻角的話,你不能直接從當(dāng)前方格移動到那個方格。你需要先往下走,然后再移動到那個方格,這樣來繞過墻角。 ( 注意:穿越墻角的規(guī)則是可選的,依賴于你的節(jié)點是怎么放置的 )

 

這樣還剩下 5 個相鄰的方格。當(dāng)前方格下面的 2 個方格還沒有加入 open list ,所以把它們加入,同時把當(dāng)前方格設(shè)為他們的父親。在剩下的 3 個方格中,有 2 個已經(jīng)在 close list  ( 一個是起點,一個是當(dāng)前方格上面的方格,外框被加亮的 ) ,我們忽略它們。最后一個方格,也就是當(dāng)前方格左邊的方格,我們檢查經(jīng)由當(dāng)前方格到達那里是否具有更小的 G 值。沒有。因此我們準(zhǔn)備從 open list 中選擇下一個待處理的方格。

 

不斷重復(fù)這個過程,直到把終點也加入到了 open list 中,此時如下圖所示。

image006.jpg

 6

 

注意,在起點下面 2 格的方格的父親已經(jīng)與前面不同了。之前它的 G 值是 28 并且指向它右上方的方格。現(xiàn)在它的 G 值為 20 ,并且指向它正上方的方格。這在尋路過程中的某處發(fā)生,使用新路徑時 G 值經(jīng)過檢查并且變得更低,因此父節(jié)點被重新設(shè)置, G  F 值被重新計算。盡管這一變化在本例中并不重要,但是在很多場合中,這種變化會導(dǎo)致尋路結(jié)果的巨大變化。

 

那么我們怎么樣去確定實際路徑呢?很簡單,從終點開始,按著箭頭向父節(jié)點移動,這樣你就被帶回到了起點,這就是你的路徑。如下圖所示。從起點 A 移動到終點 B 就是簡單從路徑上的一個方格的中心移動到另一個方格的中心,直至目標(biāo)。就是這么簡單!

image007.jpg

 7

 

A*算法總結(jié)(Summary of the A* Method)

Ok ,現(xiàn)在你已經(jīng)看完了整個的介紹,現(xiàn)在我們把所有步驟放在一起:

1.         把起點加入 open list 

2.         重復(fù)如下過程:

a.         遍歷 open list ,查找 F 值最小的節(jié)點,把它作為當(dāng)前要處理的節(jié)點。

b.         把這個節(jié)點移到 close list 

c.         對當(dāng)前方格的 8 個相鄰方格的每一個方格?

     如果它是不可抵達的或者它在 close list 中,忽略它。否則,做如下操作。

     如果它不在 open list 中,把它加入 open list ,并且把當(dāng)前方格設(shè)置為它的父親,記錄該方格的 F  G  H 值。

     如果它已經(jīng)在 open list 中,檢查這條路徑 ( 即經(jīng)由當(dāng)前方格到達它那里 ) 是否更好,用 G 值作參考。更小的 G 值表示這是更好的路徑。如果是這樣,把它的父親設(shè)置為當(dāng)前方格,并重新計算它的 G  F 值。如果你的 open list 是按 F 值排序的話,改變后你可能需要重新排序。

d.         停止,當(dāng)你

     把終點加入到了 open list 中,此時路徑已經(jīng)找到了,或者

     查找終點失敗,并且 open list 是空的,此時沒有路徑。

3.         保存路徑。從終點開始,每個方格沿著父節(jié)點移動直至起點,這就是你的路徑。

 

 

題外話(Small Rant)

請原諒我的離題,當(dāng)你在網(wǎng)上或論壇上看到各種關(guān)于 A* 算法的討論時,你偶爾會發(fā)現(xiàn)一些 A* 的代碼,實際上他們不是。要使用 A* ,你必須包含上面討論的所有元素 ---- 尤其是 open list  close list 和路徑代價 G  H  F 。也有很多其他的尋路算法,這些算法并不是 A* 算法, A* 被認(rèn)為是最好的。在本文末尾引用的一些文章中 Bryan Stout 討論了他們的一部分,包括他們的優(yōu)缺點。在某些時候你可以二中擇一,但你必須明白自己在做什么。Ok ,不廢話了。回到文章。

 

實現(xiàn)的注解(Notes on Implemetation)

現(xiàn)在你已經(jīng)明白了基本方法,這里是你在寫自己的程序是需要考慮的一些額外的東西。下面的材料引用了一些我用 C++  Basic 寫的程序,但是對其他語言同樣有效。

 

1.    維護 Open List :這是 A* 中最重要的部分。每次你訪問 Open list ,你都要找出具有最小    F 值的方格。有幾種做法可以做到這個。你可以隨意保存路徑元素,當(dāng)你需要找到具     有最小 F 值的方格時,遍歷整個 open list 。這個很簡單,但對于很長的路徑會很慢。這個方法可以通過維護一個排好序的表來改進,每次當(dāng)你需要找到具有最小 F 值的方格時,僅取出表的第一項即可。我寫程序時,這是我用的第一個方法。

      

       對于小地圖,這可以很好的工作,但這不是最快的方案。追求速度的 A* 程序員使用了叫做二叉堆的東西,我的程序里也用了這個。以我的經(jīng)驗,這種方法在多數(shù)場合下會快 2—3 倍,對于更長的路徑速度成幾何級數(shù)增長 (10 倍甚至更快 ) 。如果你想更多的了解二叉堆,請閱讀 Using Binary Heaps in A* Pathfinding 

2.       其他單位:如果你碰巧很仔細(xì)的看了我的程序,你會注意到我完全忽略了其他單位。我的尋路者實際上可以互相穿越。這取決于游戲,也許可以,也許不可以。如果你想考慮其他單位,并想使他們移動時繞過彼此,我建議你的尋路程序忽略它們,再寫一些新的程序來判斷兩個單位是否會發(fā)生碰撞。如果發(fā)生碰撞,你可以產(chǎn)生一個新的路徑,或者是使用一些標(biāo)準(zhǔn)的運動法則(比如永遠向右移動,等等)直至障礙物不在途中,然后產(chǎn)生一個新的路徑。為什么在計算初始路徑是不包括其他單位呢?因為其他單位是可以動的,當(dāng)你到達的時候它們可能不在自己的位置上。這可以產(chǎn)生一些怪異的結(jié)果,一個單位突然轉(zhuǎn)向來避免和一個已不存在的單位碰撞,在它的路徑計算出來后和穿越它路徑的那些單位碰撞了。

在尋路代碼中忽略其他單位,意味著你必須寫另一份代碼來處理碰撞。這是游戲的細(xì)節(jié),所以我把解決方案留給你。本文末尾引用的 Bryan Stout's的文章中的幾種解決方案非常值得了解。

3.       一些速度方面的提示:如果你在開發(fā)自己的 A* 程序或者是改編我寫的程序,最后你會發(fā)現(xiàn)尋路占用了大量的 CPU 時間,尤其是當(dāng)你有相當(dāng)多的尋路者和一塊很大的地圖時。如果你閱讀過網(wǎng)上的資料,你會發(fā)現(xiàn)就算是開發(fā)星際爭霸,帝國時代的專家也是這樣。如果你發(fā)現(xiàn)事情由于尋路而變慢了,這里有些主意很不錯:

     使用小地圖或者更少的尋路者。

     千萬不要同時給多個尋路者尋路。取而代之的是把它們放入隊列中,分散到幾個游戲周期中。如果你的游戲以每秒 40 周期的速度運行,沒人能察覺到。但是如果同時有大量的尋路者在尋路的話,他們會馬上就發(fā)現(xiàn)游戲慢下來了。

     考慮在地圖中使用更大的方格。這減少了尋路時需要搜索的方格數(shù)量。如果你是有雄心的話,你可以設(shè)計多套尋路方案,根據(jù)路徑的長度而使用在不同場合。這也是專業(yè)人士的做法,對長路徑使用大方格,當(dāng)你接近目標(biāo)時使用小方格。如果你對這個有興趣,請看 Two-Tiered A* Pathfinding 

     對于很長的路徑,考慮使用路徑點系統(tǒng),或者可以預(yù)先計算路徑并加入游戲中。

     預(yù)先處理你的地圖,指出哪些區(qū)域是不可到達的。這些區(qū)域稱為“孤島”。實際上,他們可以是島嶼,或者是被墻壁等包圍而不可到達的任意區(qū)域。 A* 的下限是,你告訴他搜尋通往哪些區(qū)域的路徑時,他會搜索整個地圖,直到所有可以抵達的方格都通過 open list  close list 得到了處理。這會浪費大量的 CPU 時間。這可以通過預(yù)先設(shè)定不可到達的區(qū)域來解決。在某種數(shù)組中記錄這些信息,在尋路前檢查它。在我的 Blitz版程序中,我寫了個地圖預(yù)處理程序來完成這個。它可以提前識別尋路算法會忽略的死路徑,這又進一步提高了速度。

4.    不同的地形損耗:在這個教程和我的程序中,地形只有 2 種:可抵達的和不可抵達        的。但是如果你有些可抵達的地形,移動代價會更高些,沼澤,山丘,地牢的樓梯

       等都是可抵達的地形,但是移動代價比平地就要高。類似的,道路的移動代價就比        它周圍的地形低。

在你計算給定方格的 G 值時加上地形的代價就很容易解決了這個問題。簡單的給這些方格加上一些額外的代價就可以了。 A* 算法用來查找代價最低的路徑,應(yīng)該很容易處理這些。在我的簡單例子中,地形只有可達和不可達兩種, A* 會搜尋最短和最直接的路徑。但是在有地形代價的環(huán)境中,代價最低的的路徑可能會很長。

就像沿著公路繞過沼澤而不是直接穿越它。

另一個需要考慮的是專家所謂的“ influence Mapping ”,就像上面描述的可變成本地形一樣,你可以創(chuàng)建一個額外的計分系統(tǒng),把它應(yīng)用到尋路的 AI 中。假設(shè)你有這樣一張地圖,地圖上由個通道穿過山丘,有大批的尋路者要通過這個通道,電腦每次產(chǎn)生一個通過那個通道的路徑都會變得很擁擠。如果需要,你可以產(chǎn)生一個 influence map ,它懲罰那些會發(fā)生大屠殺的方格。這會讓電腦選擇更安全的路徑,也可以幫助它避免因為路徑短(當(dāng)然也更危險)而持續(xù)把隊伍或?qū)ぢ氛咚屯骋惶囟窂健?/span>

5.    維護未探測的區(qū)域:你玩 PC 游戲的時候是否發(fā)現(xiàn)電腦總是能精確的選擇路徑,甚至地圖都未被探測。對于游戲來說,尋路過于精確反而不真實。幸運的是,這個問題很容易修正。答案就是為每個玩家和電腦(每個玩家,不是每個單位 --- 那會浪費很多內(nèi)存)創(chuàng)建一個獨立的knownWalkability 數(shù)組。每個數(shù)組包含了玩家已經(jīng)探測的區(qū)域的信息,和假設(shè)是可到達的其他區(qū)域,直到被證實。使用這種方法,單位會在路的死端徘徊,并會做出錯誤的選擇,直到在它周圍找到了路徑。地圖一旦被探測了,尋路又向平常一樣工作。

6.    平滑路徑: A* 自動給你花費最小的,最短的路徑,但它不會自動給你最平滑的路徑。看看我們的例子所找到的路徑(圖 7 )。在這條路徑上,第一步在起點的右下方,如果第一步在起點的正下方是不是路徑會更平滑呢?

       有幾個方法解決這個問題。在你計算路徑時,你可以懲罰那些改變方向的方格,把它的 G 值增加一個額外的開銷。另一種選擇是,你可以遍歷你生成的路徑,查找那些用相鄰的方格替代會使路徑更平滑的地方。要了解更多,請看 Toward More Realistic Pathfinding 

7.    非方形搜索區(qū)域:在我們的例子中,我們使用都是 2D 的方形的區(qū)域。你可以使用不規(guī)則的區(qū)域。想想冒險游戲中的那些國家,你可以設(shè)計一個像那樣的尋路關(guān)卡。你需要建立一張表格來保存國家相鄰關(guān)系,以及從一個國家移動到另一個國家的 G 值。你還需要一個方法了估算 H 值。其他的都可以向上面的例子一樣處理。當(dāng)你向 open list 添加新項時,不是使用相鄰的方格,而是查看表里相鄰的國家。

類似的,你可以為一張固定地形的地圖的路徑建立路徑點系統(tǒng)。路徑點通常是道路或地牢通道的轉(zhuǎn)折點。作為游戲設(shè)計者,你可以預(yù)先設(shè)定路徑點。如果兩個路徑點的連線沒有障礙物的話它們被視為相鄰的。在冒險游戲的例子中,你可以保存這些相鄰信息在某種表中,當(dāng) open list增加新項時使用。然后記錄 G 值(可能用兩個結(jié)點間的直線距離)和 H 值(可能使用從節(jié)點到目標(biāo)的直線距離)。其它的都想往常一樣處理。

進一步閱讀(Further Reading)

Ok ,現(xiàn)在你已經(jīng)對 A* 有了個基本的了解,同時也認(rèn)識了一些高級的主題。我強烈建議你看看我的代碼,壓縮包里包含了 2 個版本的實現(xiàn),一個是C++ ,另一個是 Blitz Basic  2 個版本都有注釋,你以該可以很容易就看懂。下面是鏈接:

Sample Code: A* Pathfinder (2D) Version 1.71 

 

如果你不會使用 C++ 或是 BlitzBasic ,在 C++ 版本下你可以找到兩個 exe 文件。 BlitzBasic 版本必須去網(wǎng)站 Blitz Basic 下載 BlitzBasic 3D 的免費 Demo 才能運行。 在這里 here 你可以看到一個 Ben O'Neill  A* 在線驗證實例。

 

你應(yīng)該閱讀下面這幾個站點的文章。在你讀完本教程后你可以更容易理解他們。

Amit's A* Pages  Amit Patel 的這篇文章被廣泛引用,但是如果你沒有閱讀本教程的話,你可能會感到很迷惑。尤其是你可以看到 Amit Patel 自己的一些想法。

Smart Moves: Intelligent Path Finding  Bryan Stout 的這篇需要去 Gamasutra.com 注冊才能閱讀。 Bryan  Delphi 寫的程序幫助我學(xué)習(xí)了A* ,同時給了我一些我的程序中的一些靈感。他也闡述了 A* 的其他選擇。

Terrain Analysis  Dave Pottinger 一篇非常高階的,有吸引力的文章。他是 Ensemble Studios 的一名專家。這個家伙調(diào)整了游戲帝國時代和王者時代。不要期望能夠讀懂這里的每一樣?xùn)|西,但是這是一篇能給你一些不錯的主意的很有吸引力的文章。它討論了包 mip-mapping 

influence mapping ,和其他高階 AI 尋路主題。他的 flood filling 給了我在處理死路徑 ”dead ends” 和孤島 ”island” 時的靈感。這包含在我的Blitz 版本的程序里。

 

下面的一些站點也值得去看看:

·                     aiGuru: Pathfinding

·                     Game AI Resource: Pathfinding

·                     GameDev.net: Pathfinding 


posted on 2010-08-07 10:46 simplyzhao 閱讀(486) 評論(0)  編輯 收藏 引用 所屬分類: G_其他

導(dǎo)航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統(tǒng)計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品日韩精品欧美在线 | 久久嫩草精品久久久久| 黄色一区二区三区四区| 欧美激情区在线播放| 亚洲午夜电影在线观看| 久久久久久久网站| 一本色道久久综合狠狠躁篇的优点 | 欧美国产在线视频| 国产亚洲网站| 亚洲自拍偷拍视频| 亚洲另类视频| 欧美日韩理论| 欧美日韩在线视频一区| 亚洲精品免费观看| 一本色道久久综合| 麻豆精品网站| 国产精品区二区三区日本| 亚洲精品欧美在线| 亚洲第一偷拍| 亚洲欧美国产va在线影院| 国产精品国内视频| 亚洲在线播放| 亚洲视频免费| 国产精品亚洲精品| 久久久久久精| 国语精品中文字幕| 麻豆视频一区二区| 久久综合九色九九| 在线观看av不卡| 亚洲福利视频网| 欧美日本一道本在线视频| 在线综合亚洲欧美在线视频| 一区二区久久久久| 国产日韩免费| 久久天天躁夜夜躁狠狠躁2022 | 欧美一区二区女人| 国产日韩视频| 欧美阿v一级看视频| 欧美福利视频网站| 亚洲日产国产精品| aa级大片欧美三级| 国产色视频一区| 欧美a级理论片| 欧美电影电视剧在线观看| 一区二区高清| 欧美一区二区三区另类| 亚洲国产成人一区| 日韩一级黄色片| 国产色婷婷国产综合在线理论片a| 麻豆freexxxx性91精品| 免费亚洲电影在线| 欧美美女操人视频| 欧美一区二区观看视频| 亚洲精品1区2区| 99爱精品视频| 国语精品中文字幕| 国产精品高潮在线| 在线视频日韩| 久久精品99久久香蕉国产色戒| 一区二区在线视频| 99精品免费网| 在线播放一区| 亚洲视屏一区| 亚洲精品免费在线观看| 午夜精品www| 免费不卡视频| 99亚洲精品| 亚洲欧洲av一区二区| 久久免费视频网站| 亚洲欧美日韩一区二区三区在线| 久久久噜噜噜久久狠狠50岁| 亚洲一区视频在线观看视频| 久久亚洲国产精品一区二区| 亚洲欧美在线视频观看| 牛牛精品成人免费视频| 久久精品国产亚洲精品| 欧美日韩在线一区二区三区| 欧美刺激性大交免费视频| 国产欧美一区二区三区沐欲| 亚洲青涩在线| 亚洲第一主播视频| 久久国产精彩视频| 欧美一区激情| 国产精品麻豆va在线播放| 在线不卡免费欧美| 欧美在线不卡视频| 午夜激情综合网| 欧美视频免费在线| 亚洲欧洲在线看| 亚洲精品欧美日韩专区| 欧美不卡在线| 亚洲国产高潮在线观看| 1024成人网色www| 久久久久99精品国产片| 久久精品一区中文字幕| 国产免费亚洲高清| 亚洲欧美综合| 久久精品中文| 黄色一区二区在线| 老司机67194精品线观看| 久久亚洲午夜电影| 黄色精品一二区| 久久久91精品| 欧美成人免费在线| 亚洲黄色有码视频| 欧美成人三级在线| 亚洲精品视频免费| 亚洲午夜视频| 国产精品久久久久久一区二区三区| 一区二区av在线| 亚洲欧美日韩视频二区| 国产欧美在线观看| 久久精品日产第一区二区三区| 久久久久九九九| 亚洲成人在线视频播放 | 亚洲第一精品夜夜躁人人躁| 久久久久久久激情视频| 男人的天堂亚洲| 亚洲精品色图| 国产精品v亚洲精品v日韩精品 | 亚洲精品在线观| 亚洲视频在线观看网站| 国产精品乱码一区二区三区| 香蕉视频成人在线观看 | 免费国产一区二区| 亚洲免费不卡| 欧美影院在线| 亚洲第一在线| 国产精品福利网站| 久久av一区二区| 亚洲高清毛片| 午夜精品久久久久久久蜜桃app | 日韩网站免费观看| 国产精品视频一区二区三区| 久久国产主播精品| 亚洲精品之草原avav久久| 欧美亚洲在线播放| 亚洲黄色三级| 国产亚洲精品美女| 欧美刺激午夜性久久久久久久| 中国女人久久久| 欧美成人精品一区二区三区| 亚洲欧美综合精品久久成人| 最新高清无码专区| 国产拍揄自揄精品视频麻豆| 欧美精品www在线观看| 欧美在线啊v| 亚洲深夜福利网站| 亚洲国产你懂的| 久久最新视频| 久久aⅴ乱码一区二区三区| 亚洲免费电影在线观看| 国产自产v一区二区三区c| 欧美日韩视频免费播放| 久久久精彩视频| 亚洲一区制服诱惑| 亚洲全黄一级网站| 亚洲国产精品国自产拍av秋霞| 国产精品爽爽爽| 欧美日韩精品在线| 久久夜色精品国产欧美乱| 亚洲精品日韩综合观看成人91| 国内精品99| 国产欧美亚洲一区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 欧美资源在线| 午夜精品国产精品大乳美女| 亚洲黄网站在线观看| 韩国精品久久久999| 欧美日韩亚洲一区二区三区在线 | 六月婷婷久久| 久久成人人人人精品欧| 9色国产精品| 91久久亚洲| 亚洲国产一区二区在线| 伊甸园精品99久久久久久| 国产欧美精品xxxx另类| 国产精品久久91| 国产精品久久777777毛茸茸| 在线亚洲电影| 亚洲激情第一页| 亚洲黄一区二区| 米奇777在线欧美播放| 久久精品一区二区三区不卡牛牛| 香蕉乱码成人久久天堂爱免费| 亚洲天堂av在线免费观看| 亚洲婷婷在线| 亚洲欧美一区二区激情| 午夜激情一区| 久久久久久午夜| 蜜桃伊人久久| 亚洲二区视频| 亚洲六月丁香色婷婷综合久久| 亚洲黄色在线| 日韩天堂在线视频| 亚洲主播在线| 欧美伊人久久久久久午夜久久久久 | 欧美日韩免费在线| 欧美视频中文字幕| 国产精品三级视频|