體育競技遊戲的團隊AI

NO IMAGE

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

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

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

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

http://www.skywind.me/blog/archives/1216

何為分層狀態機?

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

  • 基礎狀態機:直接控制角色動畫和繪製、提供基礎的動作實現,為上層提供支援。
  • 行為狀態機:實現分解動作,躲避跑、直線移動、原地站立、要球、傳球、射球、追球、打人、跳。
  • 角色狀態機:實現更復雜的邏輯,比如防射求、籃板等都是由N次直線運動 跳躍或者打人完成。

image

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

何為決策支援系統?

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

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

何為團隊角色分配?

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

image

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

話題總結

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

概率統計

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

神經網路

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

PS:關於棋牌類 AI的相關話題,和這個不一樣,因為棋牌AI是要尋求最佳解的,使用博弈樹等工具進行解決,感興趣的話,可以參考我另外一篇文章:http://www.skywind.me/blog/archives/1029 。

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