2014-02-18 22 views
0

我正在使用Unity,使用C#作爲一個應該很簡單的項目。 我堅持pathFinding。一個特定的PathFinding方法

我在Dikjstra的和一種參考*看了,但由於某些原因,我仍然不能採取他們在我的情況下工作。我想我的大腦:=while(1);

這裏的理念是:

從文本文件導入我一個「地圖」,其中每個「*」表示牆,每個「」 walkarea。在地圖上,這個區域隨機放置了兩個物體:一個炸彈和一個代理。

代理必須研究地圖(形成一個迷宮),並發現炸彈。如果代理不是Wall,代理可能會移動到他的8個鄰居貼圖。在我的代碼中,代理類擁有他自己的地圖。對於他所訪問的每一塊瓷磚,他都會詢問「世界地圖」以瞭解關於他的8個鄰居瓷磚的信息。

在他自己的地圖,然後他把一張紙條已知的磚型(牆/ walkpath)的,如果它是一個walkpath,他也指出,他曾多少次訪問它。代理商還有一個「首選方向」列表。這將告訴下一個要移動到哪個圖塊,如果超過1個圖塊沒有被訪問過。

到現在爲止,我已經將它設置都好正常運行,如果我讓他跑,他最終發現了炸彈。問題在於,因爲他只根據訪問次數最少的瓷磚在優先的方向上運行,所以他必須像白癡一樣多次重新訪問某些瓷磚。那麼,什麼

我必須做的是這樣的:

如果主體到達了這一片瓦,每nighbour要麼是牆或已經訪問過,那麼他應該研究自己的地圖,並從過去的筆記找一個未訪問的瓷磚,然後步行到那裏。每個步行方向具有相同的權重/成本,所以我們不需要考慮路徑成本。

在我看來,Dijkstra的是最接近申請,但我仍然無法得到它的權利。

任何想法或幫助將不勝感激。

謝謝

亞歷克斯的問題

+0

您可能想嘗試[DFS](http://en.wikipedia.org/wiki/Depth-first_search) –

+0

所有啓發式搜索算法都使用某種開放/關閉列表策略,最初,當前代理的位置在打開的列表中。當一個節點被評估(這意味着:所有它的鄰居都被考慮並且可能被放入打開的列表中),節點本身被放入封閉列表中。永遠不要重新評估封閉列表中的節點。如果打算在每一幀迭代地進行基於代理的搜索,則當代理正在移動時,則必須基於搜索的不斷增加的「請求ID」來「開放」/關閉節點。 – StarShine

回答

0

部分是你要多少信息,讓您的代理。如果你願意讓他知道目標是在哪裏,或者至少是與自己相關的總體方向,那麼你可以用它來影響代理人的決定。這可以讓你始終傾向於朝着最接近目標的方向前進,同時走最少的路線。

否則,我跟蹤他在一個單獨的地圖,還有8個相鄰的瓷磚訪問的每個地方,因爲他已經「看到」他們,像-1,表明已出現了牆壁,-2表明一個看不見的位置,0表示看到但未訪問。然後,我會使用A *或其上的變體,根據遍歷的瓦片數量將其移動到最近的未訪問點,隨機打破關係。這將導致在迷宮方法中出現更多的試錯鼠。