1. 程式人生 > >即時戰略遊戲的AI是怎樣實現的?

即時戰略遊戲的AI是怎樣實現的?

導讀:作為實際開發過AI的人,拿一份五年前的程式碼,以最難的體育競技類遊戲為例,來科普一下,什麼叫做遊戲團隊策略,什麼叫做分層狀態機?具體該如何落地到程式碼?如果你能實現體育競技的AI,那即時戰略只是小事一樁。

  國內真正做過遊戲AI的很少,說概念的人很多,所以看了半天離實際編碼還是很遠,不知道該怎麼入手,因為國內遊戲主要以MMO和卡牌為主,RTS比較少,體育競技類遊戲更少,沒幾個真正寫過強AI程式碼的。而從AI的難度上來看,是:MMO < FPS < RTS < 體育競技。作為實際開發過AI的人,拿一份五年前的程式碼,以最難的體育競技類遊戲為例,來科普一下,什麼叫做遊戲團隊策略,什麼叫做分層狀態機?具體該如何落地到程式碼?如果你能實現體育競技的AI,那即時戰略只是小事一樁。

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

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

  何為分層狀態機?

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

  基礎狀態機:直接控制角色動畫、提供基礎動作實現,為上層提供支援。

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

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

1428553055640597.jpeg

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

  何為決策支援系統?

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

1428553153654118.jpeg

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

1428553173243415.jpeg

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

1428553188896388.jpeg

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

1428553205281825.jpeg

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

1428553219364044.jpeg

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

1428553231798721.jpeg

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

1428553243614858.jpeg

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

1428553257670860.jpeg

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

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

  何為團隊角色分配?

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

1428552961358586.jpeg

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

  話題總結

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

  概率統計

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

  神經網路

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