分層狀態機的設計思路

文 / 韋易笑   轉載自

  很多人問遊戲AI該怎麼做?隨着遊戲類型的多元化,非 MMO或者卡牌的遊戲越來越多,對AI的需求也越來越強了。而市面上關於 AI的書,網上找得到的文章,也都流於一些隻言片語的認識,理論化的套路,和一些簡單的 DEMO,離真正的項目差距甚遠,無法前後銜接成一條線,更無法真正落地到編碼。

  國內真正做過遊戲AI的少之又少,東拉西扯的人很多,真正做過項目的人很少,因爲國內主要以MMO爲主,RTS比較少,體育競技類遊戲更少,而從AI的難度上來看,應該是:MMO < FPS < RTS < 體育競技。作爲實際開發過AI的人,給大家科普一下,什麼叫做硬派AI。

  硬派遊戲AI,不是虛無縹緲的神經網絡,用神經網絡其實是一個黑洞,把問題一腳踢給計算機,認爲我只要訓練它,它就能解決一切問題的懶人想法。更不是遺傳算法和模糊邏輯,你想想以前8位機,16位機上就能有比較激烈對抗的足球遊戲、籃球遊戲,那麼差的處理器能做這些計算麼?

  硬派遊戲AI,就是狀態機和行爲樹。狀態機是基本功,行爲樹可選(早年AI沒行爲樹這東西,大家都是hard code的)。大部分人說到這裏也就沒了,各位讀完還是無法寫代碼。因爲沒有把最核心的三個問題講清楚,即:分層狀態機、決策支持系統、以及團隊角色分配。下面以我之前做的籃球AI爲例,簡單敘述一下:

  何爲分層狀態機?

  每個人物身上,有三層狀態機:基礎層狀態機、行爲層狀態機、角色層狀態機。每一層狀態機解決一個層次的複雜度,並對上層提供接口,上層狀態機通過設置下層狀態機的目標實現更復雜的邏輯。

  基礎狀態機:直接控制角色動畫和繪製、提供基礎的動作實現,爲上層提供支持。

  行爲狀態機:實現分解動作,躲避跑、直線移動、原地站立、要球、傳球、射球、追球、打人、跳。

  角色狀態機:實現更復雜的邏輯,比如防射球、籃板等都是由N次直線運動+跳躍或者打人完成。
 


  每一層狀態機都是通過爲下一層狀態機設定目標來實現控制(目標設定後,下層狀態機將自動工作,上層不用關心動畫到底播到哪了,現在到底是跑是跳),從而爲上層提供更加高級擬人化的行爲,所有狀態機固定頻率更新(如每秒10次),用於判斷狀態變遷和檢查底層目標完成情況。最高層的角色狀態機的工作由團隊AI來掌控,即角色分配的工作。而行爲狀態機以上的狀態抉擇,比如回防,到底是跑到哪一點,射球,到底在哪裏起跳,路徑是怎樣的,則由決策支持系統提供支持。

  何爲決策支持系統?

  狀態機爲角色的大腦,而決策支持系統爲角色的眼睛和耳朵,常見的工具有勢力圖(Influence Map)和白板(相當於不同角色間喊話),其中勢力圖比較常用,籃球遊戲AI勢力圖可以用下面幾張圖來表示:
 


  勢力圖1:於防守籃板距離的map,每格分值爲最遠距離減去該格到籃板所在格子的距離
 


  勢力圖2:進攻籃板距離的map,每個分值爲最遠距離減去該格到籃板距離,籃板後爲0
 


  勢力圖3:同敵人距離,每個敵人有影響範圍,範圍內,離敵人越近分越低,範圍重疊選低的。
 


  勢力圖4:同所有隊友目標位置距離map,打分方法類似上圖。
 


  勢力圖5:與每個隊友目標位置距離的map,標識單個隊友目標位置距離的map。
 


  勢力圖6:現實傳球可行性的map,分數越高,越容易把球傳到該格子上。
 


  勢力圖7:容易把球傳出的位置map,越容易直接傳球給隊友的區域分數越高。
 


  勢力圖8:綜合map,把以上map按一定加權求和。球員有合法目標區域,便於實現內線遊走和外線遊走。

  每個球員性格不同,權值也不同,有保守的球員,有喜歡冒險的球員,權值不同而已。這些勢力圖都是爲了給上面的三層狀態機和團隊狀態機提供決策支持的。

  何爲團隊角色分配?

  每一層狀態機爲下一層設定一個目標,讓下層自動工作,頂層角色層的目標則由最高層的團隊ai進行戰術指導。
 


  團隊狀態機跟據當前的遊戲情況確定當前首要目標(進攻或者防守),又根據當前的勢力圖等信息,確定進攻或者防守的具體戰略(比如中路突破、盤路包抄、下底傳中等),最終爲當前己方的所有角色分配一個新的任務,即設定角色層狀態機的新目標,確定他是做主攻還是做助攻,還是聯防還是策應。具體該怎麼聯防,怎麼策應,那就是角色層狀態機的事情了。

  話題總結

  其實團隊AI沒那麼玄乎,任何問題就是一個編程的建模問題,而最複雜的體育競技類遊戲的AI策略,上文已經給出模型,相信各位略加修改即可使用。寫狀態機是遊戲AI的硬功夫,如果狀態機邏輯經常改變或者項目規模大了以後可以考慮引入決策樹來控制狀態機,程序提供一系列接口,然後用可視化的編輯器進行更改,感興趣的人可以參考決策樹相關文章。

  概率統計

  如果上面這些邏輯都實現了,這時候纔可以輔助與概率統計來讓角色具備學習特性,比如統計某個策略對對手的成敗情況,用來支撐下一次決策,這樣能夠逐步發現對手的弱點,還可以統計所有用戶的大數據,來確定某種情況下,選擇什麼策略,能夠對付60%的用戶。

  神經網絡

  在上面所有邏輯都實現了,你調試好了,玩着比較順暢的時候,再在團隊角色分配處嘗試使用神經網絡或者模糊邏輯,同樣是學習大數據,來引入一些不可控的人性化的成分,讓遊戲更加有意思。(EA的 FIFA 20XX號稱引入神經網絡,Call of Duty的AI也號稱引入了神經網絡和學習機制)。確實讓遊戲更有趣一點,但僅僅如此而已。

  PS:關於棋牌類 AI的相關話題,和這個不一樣,因爲棋牌AI是要尋求最佳解的,使用博弈樹等工具進行解決,感興趣的話,可以參考我另外一篇文章:TINY-GOBANG 最精簡的五子棋人機對戰

  PS:當你看到屏幕的角色好似被你賦予了生命的樣子,一個個單獨而有整體有序的活動着,偶爾還能做出你意料之外的事情,你將充滿了創造的喜悅。

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