智能尋路貪吃蛇系列之 貪吃蛇AI算法的優化

本系列博文最終將實現一個MFC版的“智能尋路貪吃蛇”。

前面的三篇博文我們已經實現了一個基於單一的BFS算法的智能貪吃蛇.得意

美中不足的是,這條蛇雖然能夠歡快的跑一段時間,但是因爲吃食物的過程中不顧後果,導致蛇跑不了多久就掛掉了.

這篇博文,我們就來解決這個問題.


上篇中說道當前算法中存在的不足之處:

0.由於每次都是吃到食物之後才執行一下Bfs函數,所以,得到的路徑就是那一瞬間的最短路徑,但是可能在蛇移動的過程中,當前的格局發生了變化,可能會有更短的路徑出現,雖然這個問題不是致命的,但是也浪費了蛇吃東西的時間.
1.隨着蛇身的增長,蛇的身體很可能將地圖分爲互不相通的幾個部分,所以,當食物和蛇的頭部出現在不同的部分時,Bfs算法就沒轍了,這個問題是致命的!

那麼如何解決這個問題呢?

其實說來也很簡單,原來的策略是每次吃完食物後,就使用BFS算法重新計算一遍路徑.

其實這樣計算出來的路徑是過時的,蛇每移動一步,當前的格局都會發生變化,如果還是按照老路走,就很有可能繞了遠路.

所以只要換一下策略,每走一步,就做一次BFS,實時更新路徑,前面的問題就不復存在了.


這個的改動是非常小的,只要簡單的改變一下函數的執行位置即可,不多說.

經過我的測試,這樣改動之後的蛇的確走的路徑每次都是最短的,而且存活的時間也更長了,只是執行尋路算法的次數大大增加,時間複雜度也更大了.

雖然這樣解決了一定的問題,但是最根本的還是沒有解決(看圖)


當蛇頭和食物不在一個次元的時候,蛇就會一頭撞死.

而這種情況是經常發生的,尤其是蛇身比較長之後..

那麼如何解決這個問題呢?

蛇是因爲吃了某塊食物之後才使自己陷入困境的,我們要做的就是避免蛇陷入這種困境.

這就需要每次在走位之前,都要判斷一下當前的路徑是否是安全的.

如何判斷路徑是否安全呢?

在第一篇博文中引用的Hawstein大神的文章中提到,只要蛇頭和蛇尾之間存在路徑,則認爲當前的路徑是安全的~

所以,如果是安全的,那麼蛇就安安心心的去吃食物,如果不安全怎麼辦呢?

我們再來看一眼第一篇博文中那隻銷魂的蛇~


仔細觀察就會發現,當這隻蛇陷入困境時(路徑不安全),就一直在空白的地方"遛彎",知道新的路徑出現爲止.

而且,遛彎的時候蛇走位的規律性也是極強的.

就是朝着尾巴所在的那一端不斷地做S運動

搞清楚了基本的方法,就可以開始編寫代碼了..


代碼的主要更新之處就是寫了一個IsSafe()函數來判定當前狀態是否安全,如果不安全,就按照一個特定的方法走幾步,這個方法的缺點就是有的時候隨便走幾步結果卻把自己走到了更危險的處境上.

雖然整體的算法比剛開始有了很大的改進,但是最終的效果還是達不到上面的圖片那樣把整個地圖填滿,主要原因是我想不通怎麼來追着蛇尾跑~如果您有好的方法,望不吝賜教 ! 

這個版本的源代碼我已經上傳到CSDN了,有興趣的可以下載看一下~

點我進入下載頁!

程序使用VS2012編寫,低版本的VS可以自行修改sln文件中的版本信息,具體方法請百度.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章