迷宮系列的最後一期了,在這個系列中分別用算法生成隨機迷宮,尋找迷宮的出口;在編寫過程中領略到了算法的魅力所在,算法真的是程序的靈魂,理解並掌握了算法的真正意義後,在處理問題中真的是非常省心,邏輯清晰明瞭;像在用‘左手法則’走迷宮中不但要考慮碰撞檢測還要考慮角色的大小和每次行走距離,參數一旦不符合很難得到想要的結果,不像用算法,根本不用考慮這些因素,只要按照算法模板把邏輯表達清晰了就可以了!所以掌握一些算法是非常有必要的!~
用廣度優先尋找迷宮出口實現起來比起深度優先稍微複雜點,我把它分成兩個部分來處理,分別是廣度優先遍歷通路單元和尋找最佳路徑。
第一部分是典型的廣度優先遍歷算法,所用到的數據結構爲隊列(先進先出),就是按照層級關係逐級遍歷每一個‘路’節點,直到找到迷宮出口。實施步驟如下:
1、將起點壓入隊列
2、重複循環以下步驟,直到隊列爲空
(1)、彈出隊列第一個元素,將其周圍鄰接節點(是路、未訪問)壓入隊列
(2)、將其標記爲已訪問。
3、在循環過程中還需要將遍歷過的節點和父節點分別存入到遍歷過的節點列表和父節點列表中,給第二部分使用,代碼如下,其中的單元訪問顯示函數是爲了動態展示廣度優先層級遍歷的特點,可以不加;確定最佳路徑則是第二部分內容。
運行以上代碼我們就獲得了從起點到終點所有‘是路’的節點,接下來的第二部分就是從這些節點中找到一條起點通往終點的最佳路徑,在第一部分存儲遍歷過的節點的同時還保存了它們的父節點,要找到這條路徑一般的做法是從終點開始查找它的父節點,並存入最佳路徑列表中,然後再找到父節點的父節點,再存放最佳路徑列表…….直到起點(一開始做了個結束標誌‘-’),這樣我們就真正得到了從終點到起點存儲了父節點的列表,這個就是迷宮的通路。文字表達能力有限,不知道大家明白了嗎? 上代碼!~
主程序
繪製路線方法代碼太寬還是截不全
返回周圍節點方法
動態展示節點顯示
轉自公衆號:
嘻嘻哈哈學編程