遊戲尋路 深度優先搜尋

2021-06-16 05:32:38 字數 1201 閱讀 6551

基本思想:

從起始點開始開始遍歷,首先訪問起始點v,再訪問與v相鄰的點w,接著訪問與w相鄰且沒訪問過的點,以此類推,直至某個被訪問的頂點的所有相鄰頂點均被訪問為止。

然後退回到尚有相鄰頂點未被訪問的頂點r,再從r的乙個未被訪問的頂點出發,重複上述步驟,直至圖中所有和v有路徑相通的頂點都被訪問過。

若圖中尚有頂點未被訪問,則另選圖中乙個未被訪問的頂點做起始點,重複上述過程直至圖中所有頂點都被訪問為止。

**:

測試**:

**基本思想:

1.用乙個二維陣列表示map,其中x為橫座標,y為縱座標,0 表示可以通過,1 表示不可以通過,為阻擋點。

2.在class deepsearch中也用乙個二維陣列,m_table記錄點是否已經走過。

用乙個大小最大為1000的陣列記錄每一步移動的方向,移動次序為:左、右、上、下,分別用1,2,3,4表示。

按這個次序從開始點v移動到其相鄰的乙個點t,t的座標可以根據v的座標,及移動方向對點座標x、y的影響因子dx、dy計算得出。

3.主要的搜尋過程在startseach()中完成:

用兩個bool變數記錄所有過程是否結束和當前過程是結束,後者也就是從乙個點有沒有走到下乙個點。

外層while:

條件,所有搜尋過程沒有結束。

迴圈體,把記錄已經走過的步數的變數m_cursteps + 1,把當前搜尋結束標記至false。

裡層while:

把當前步數的移動方向+1,也就是根據左、右、上、下的移動次序移動。

如果這個方向可以移動的話,可以移動的意思是:移動方向沒有超過最大移動方向,將要移動到的點在地圖內,將要移動到的點是可以通過的,將要移動到的點以前沒有走到過,也就是在m_table中為0。

如果可以通過的話,那麼把當前點m_curpt,設為剛才移動到的那個點,並且在m_table設1,記錄此點已經走過。把當前移動是否結束的標記m_islevelok置true,並把點新增進儲存路徑的vector——m_path中。

如果不可以通過的話,再判斷所有方向是否已經走完,如果是的話,往回退。往回退的意思是:根據m_cursteps可以,在記錄每步移動方向的陣列m_act中得到上乙個點到當前的移動方向,因此根據當前點的座標和上乙個點的移動方向,可以反推上乙個點的座標,把當前點的移動方向清0,並把上乙個點置為當前點。繼續迴圈,根據當前點移動方向的次序找它的相鄰的沒有走過的點,重複上述步驟。如果退回到起始點的話,說明起始點到終點無路可走,直接退出吧。

隨機迷宮生成與尋路演算法(1)深度優先搜尋

接下來一段時間,想要研究下隨機迷宮生成演算法,打算在有空可時候偶爾更新一下這方面的學習過程。隨機迷宮的生成演算法有很多種,比如遞迴回溯,遞迴分割,隨機prime等等。今天是第一次嘗試隨機迷宮生成,就先試一下用遞迴的方法通過深度優先搜尋來生成隨機迷宮。首先我們來明確一下基本觀念,迷宮可以通過乙個二維陣...

隨機迷宮生成與尋路演算法(3)深度優先搜尋

該方法很容易理解 首先我們將迷宮的起始點入棧將棧頂元素標記為當前座標,然後按照已經定義好的方向陣列依序從上 下 左 右四個方向 方向可以是任意的,但沒必要每次都進行隨機選取 來遍歷當前座標的相鄰方塊如果這個取得的方塊是合法的 也即是說這個方塊不是邊界,不是障礙物,並且沒有標記為路線或者死胡同 則結束...

廣度優先尋路演算法

廣度優先遍歷,是一種非啟發式 不用預處理的尋路演算法。通常會將整個圖全部遍歷,意圖尋找終點。從起點開始,每次所有符合的點全部遍歷,類似於擴散的樣子。一般情況,廣度優先遍歷演算法都是基於佇列結構,先進先出的遍歷所有節點。該尋路演算法,通常先將起點加入佇列結構,然後將該點周邊符合要求 未加入佇列結構並且...