• <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>

            公告

            聯系我:我的126郵箱: billhsu。 Locations of visitors to this page
            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            • 隨筆 - 41
            • 文章 - 0
            • 評論 - 82
            • 引用 - 0

            常用鏈接

            留言簿(16)

            隨筆分類

            隨筆檔案

            相冊

            Game Dev

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            A* (A-star A星)尋路算法
            A*在游戲尋路算法里使用很廣,可是感覺很多介紹它的文章故意讓人看不懂。
            仔細看了看gamedev.net的一片文章(A* Pathfinding for Beginners http://www.gamedev.net/reference/articles/article2003.asp ),對A*更了解了一點,寫點東西記錄一下。
            A*是一種啟發式的算法,所謂的"啟發式",就是對每一個搜索的位置進行評估,也就是把找的位置離目標的距離當成找點的一個依據,然后猜測這個點是否最佳("啟發式"就是猜測)。

            image001.jpg

            為了找到最佳的那個點
            可以規定:
            G = 從起點,沿著產生的路徑,移動到網格上指定方格的距離。
            H = 從網格上那個方格移動到終點B的預估移動距離。

            F = G + H
            F最小的點可以認為是該選的點。
            引用一下原文的翻譯:
            我們令水平或者垂直移動的耗費為10,對角線方向耗費為14。我們取這些值是因為沿對角線的距離是沿水平或垂直移動耗費的的根號2(別怕),或者約1.414倍。為了簡化,我們用10和14近似。比例基本正確,同時我們避免了求根運算和小數。


            既然我們在計算沿特定路徑通往某個方格的G值,求值的方法就是取它父節點的G值,然后依照它相對父節點是對角線方向或者直角方向(非對角線),分別增加14和10。例子中這個方法的需求會變得更多,因為我們從起點方格以外獲取了不止一個方格。

            H值可以用不同的方法估算。我們這里使用的方法被稱為曼哈頓方法,它計算從當前格到目的格之間水平和垂直的方格的數量總和,忽略對角線方向。然后把結果乘以10。這被成為曼哈頓方法是因為它看起來像計算城市中從一個地方到另外一個地方的街區數,在那里你不能沿對角線方向穿過街區。很重要的一點,我們忽略了一切障礙物。這是對剩余距離的一個估算,而非實際值,這也是這一方法被稱為啟發式的原因。想知道更多?你可以在這里找到方程和額外的注解。



            第一步搜索的結果可以在下面的圖表中看到。F,G和H的評分被寫在每個方格里。正如在緊挨起始格右側的方格所表示的,F被打印在左上角,G在左下角,H則在右下角。

            image003.jpg

            引用一下原文的翻譯:

            我們做如下操作開始搜索:
            ???
            1,從點A開始,并且把它作為待處理點存入一個“開啟列表”。開啟列表就像一張購物清單。盡管現在列表里只有一個元素,但以后就會多起來。你的路徑可能會通過它包含的方格,也可能不會。基本上,這是一個待檢查方格的列表。
            ???
            2,尋找起點周圍所有可到達或者可通過的方格,跳過有墻,水,或其他無法通過地形的方格。也把他們加入開啟列表。為所有這些方格保存點A作為“父方格”。當我們想描述路徑的時候,父方格的資料是十分重要的。后面會解釋它的具體用途。
            ???
            3,從開啟列表中刪除點A,把它加入到一個“關閉列表”,列表中保存所有不需要再次檢查的方格。

            為了繼續搜索,我們簡單的從開啟列表中選擇F值最低的方格。然后,對選中的方格做如下處理:

            ???
            4,把它從開啟列表中刪除,然后添加到關閉列表中。
            ???
            5,檢查所有相鄰格子。跳過那些已經在關閉列表中的或者不可通過的(有墻,水的地形,或者其他無法通過的地形),把他們添加進開啟列表,如果他們還不在里面的話。把選中的方格作為新的方格的父節點。
            ???
            6,如果某個相鄰格已經在開啟列表里了,檢查現在的這條路徑是否更好。換句話說,檢查如果我們用新的路徑到達它的話,G值是否會更低一些。如果不是,那就什么都不做。
            ??????另一方面,如果新的G值更低,那就把相鄰方格的父節點改為目前選中的方格(在上面的圖表中,把箭頭的方向改為指向這個方格)。最后,重新計算F和G的值。如果這看起來不夠清晰,你可以看下面的圖示。


            image004.jpg

            image005.jpg

            image006.jpg

            image007.jpg

            這樣就可以找到最佳路徑了。


            posted on 2008-11-01 18:19 Bill Hsu 閱讀(10396) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Game DevAlgorithm

            亚洲一区中文字幕久久| 久久久久97国产精华液好用吗| 无码任你躁久久久久久老妇| 韩国三级大全久久网站| 中文字幕人妻色偷偷久久 | 久久亚洲精品成人无码网站| 伊人色综合久久| 精品水蜜桃久久久久久久| 亚洲伊人久久大香线蕉苏妲己| 狠色狠色狠狠色综合久久 | 国产精品久久国产精麻豆99网站| 伊人久久大香线蕉综合Av| 性欧美大战久久久久久久久| 伊人久久大香线蕉av不卡| 亚洲AV无码久久寂寞少妇| 久久综合狠狠综合久久 | 精品久久777| 青青国产成人久久91网| 香蕉久久夜色精品国产小说| 88久久精品无码一区二区毛片| 久久精品成人免费国产片小草| 无码国内精品久久人妻麻豆按摩| 久久只有这精品99| 久久国产乱子伦免费精品| 久久99精品综合国产首页| 久久久久久久亚洲精品| 久久无码高潮喷水| 97精品伊人久久大香线蕉app | 狠狠色综合网站久久久久久久 | 思思久久好好热精品国产| 亚洲精品乱码久久久久久久久久久久 | 热RE99久久精品国产66热| 91麻豆国产精品91久久久| 亚洲AV日韩AV永久无码久久| 欧美精品一区二区精品久久| 久久综合九色综合久99| 精品无码久久久久国产动漫3d| 久久无码人妻一区二区三区| 日本精品久久久久中文字幕| 偷窥少妇久久久久久久久| 久久久国产精品福利免费 |