從“智障”到“智慧”——淺談遊戲中的AI實現
本文回顧了遊戲中AI的發展歷程,從最早的指令碼AI,到後來的有限狀態機、行為樹,再到時下流行的基於機器學習的AI,且看它是如何從“智障”一步步走向“智慧”的。
今天的電子遊戲行業,蓬勃發展,日新月異。隨著渲染畫面越來越逼真、物理反饋越來越真實、傳輸速度越來越快,加上多人同屏、無線通訊、AR/VR這些新技術的加入,今天的遊戲玩家們可以更好地沉浸在設計師們構建的虛擬大千世界裡。然而,有一項古老的技術卻彷彿受到了冷落,那就是遊戲中的AI能力。
AI能力本來是遊戲中的核心邏輯,它提供了最直接的玩家體驗。其中的代表就是NPC(Non-Player Character,非玩家角色)。玩家和NPC的關係,就像奧特曼和怪獸一樣,「Boss虐我千百遍,我卻待他如初戀」。然而,在如今越來越高階的渲染、音效甚至互動方式面前,我們看到這些AI仍舊宛若“智障”一般,難以帶來驚喜。
傳統指令碼AI
回顧電子遊戲的發展史,不難發現,遊戲中的AI能力是伴隨著電子遊戲一起誕生的。早在1950年,電子計算器還是微型真空管的時代,就已經有工程師們在創造遊戲了。其中有一款遊戲名為《伯蒂的大腦》(Bertie the Brain)[1],玩家可以在四米高的計算機上,通過九宮佈局的背光鍵盤走子,與電腦對弈井字棋,同時大螢幕上會顯示當前的棋局。
《伯蒂的大腦》遊戲
當時這個巨大的電子裝置上有一個亮著燈光的記分板,上面寫著:“電腦大腦”vs“人類大腦”。似乎已經預示了,在電子遊戲的發展道路上,遊戲AI註定會作為一個重要的組成部分,為玩家提供對抗、合作、觀察等豐富的遊戲體驗。
而AI能力真正被玩家廣為熟知,是通過早期Atari 2600平臺上的一些遊戲,其中最典型的就是《吃豆人》(Pac-Man)。
《吃豆人》遊戲
這是一款令無數玩家著迷和抓狂的遊戲。其中的四個“小鬼”是通過AI來設計的,會不斷跑動來抓“吃豆人”。玩家需要在一次又一次緊張刺激的路口抉擇中,完成吃豆和躲避“小鬼”。新手玩家甚至會有被“小鬼”們戲弄的感覺。
實際上,當時的AI並沒有那麼智慧。“小鬼”的“思考”方式非常簡單:
- 紅色:一直跟在玩家後面。
- 粉色:以玩家行進路線的下一個路口為目標。
- 藍色:以下一個路口後的路口為目標。
- 黃色:完全隨機行動。
小鬼們的“思考”方式
而就是這些簡單的邏輯,組合起來後就彷彿具有了思考能力。讓無數的玩家在一次又一次的被抓後,毅然開啟新一盤的挑戰。不過,雖然怪物的行為有多種規則,目的還是太過單一。在“吃豆人”這種簡單目標的遊戲中還好,到了目標更多、更復雜的遊戲中(比如策略類遊戲),那麼僅按照單個預定目標一直走下去,顯然還是過於“蠢”了。[2]。
於是,以有限狀態機、行為樹為核心的遊戲AI模式出現了。
有限狀態機
有限狀態機,簡稱FSM(Finite-state machine),是一種基於單個或多個狀態的假設機器。有且只有單個狀態可以處於活動狀態,因此機器必須從一種狀態轉換到另一種狀態,以便執行不同的操作。
如下圖所示,基於有限狀態機的AI怪物,可以體現出比較複雜的行為,包括原地巡邏、發現玩家後攻擊玩家/躲避攻擊,甚至在自身血量少的情況下,還會主動逃跑、尋求支援。
有限狀態機
此時的遊戲AI,會更接近對真實世界生物行為的模擬,產生更豐富的行為。但狀態機的弱點也很明顯,玩家熟悉後會逐漸總結出設計者的邏輯,並形成針對性的策略。好的一面是遊戲AI本身產生了不少有趣的套路玩法,而壞的一面則是一些bug會讓玩家找到漏洞,研究出反制策略讓設計者的意圖落空。
比如時下很火的動作遊戲《只狼:影逝二度》,玩家就學會了利用NPC Boss的一個邏輯bug,在特定的地形位置,100%無傷地慢慢消耗boss血量,以“作弊”的方式擊殺Boss。玩家把這種操作戲稱為給Boss“修腳”。
《只狼》中的修腳師玩家
行為樹AI
現代遊戲AI的主流方法是行為樹AI。它有著比狀態機更為複雜的結構和設計,但本質上也是通過把人類的決策思路通過具體的邏輯判斷,一層一層展開來實現的。
行為樹的設計是通過一個樹狀結構,每次更新時都會從樹的根節點出發,根據子節點的型別和狀態,來確認要操作的狀態切換以及實際動作。它比狀態機複雜的地方在於,每一個節點都有執行的狀態,以及,每次執行完成後都會向父節點傳遞執行結果。再配合各種內部的特殊節點,就可以實現有一定複雜行為的遊戲AI。
其中比較重要的特殊節點包括:
- Selector Node 選擇節點:按順序選擇第一個執行條件為真的子節點,遇到True停止。
- Sequence Node 序列節點:按順序執行每一個子節點,遇到False停止。
- Parallel Node 並行節點:從頭到尾,平行執行它的所有子節點。
通過合理的設計,可以快速實現一個複雜AI,比如:讓Boss通過選擇節點攻擊離它最近的玩家的同時,通過並行節點關注自身血量,並且通過序列節點使用各種技能給自己回血。上述行為的編寫只需要幾個簡單的特殊節點,即可串起整個邏輯。
如下圖所示,通過直接編寫AI的判斷邏輯,製作對應的動作,即可實現一定程度的“智慧”。基於視覺化的工具,可以很好地看到行為樹的執行狀態。
視覺化的行為樹
行為樹對遊戲設計者來說,已經是一個相對靠譜的解決方案。但隨著遊戲越來越複雜,行為樹的節點數量會出現爆炸增長,維護難度也隨之大大提升。
行為樹節點爆炸
但即使在這麼細緻複雜的結構下,一些關鍵問題也始終未能得到解決:
1)未知輸入條件適應
基於人類想實現的效果、以人類思考邏輯來編寫,始終無法確保不會存在設計者意料之外的分支。在那些分支下,由於輸入條件是未知的,再精雕細琢的AI也會顯得特別“弱智”。隨便舉個例子,打過《魔獸爭霸3》的讀者可能知道,早期人族打AI時有一個耍賴戰術:箭塔流。第一個開發出這個戰術的玩家看來是吃透了電腦的智力水平,直接一路把防禦塔修到對面家門口,電腦就算看到有個農民在這造塔也會假裝沒看到,繼續安心工作。跟這樣的電腦對手打,中等水平的玩家都會很快喪失興趣,更別提那些指望提升技術的高手玩家了[3]。
《魔獸爭霸3》玩家“箭塔流”取勝
2)固定的臨界值判斷
AI在編寫判斷邏輯時,一般都會有一個臨界值。比如怪物在追擊了玩家一定距離後,自動會返回巢穴。而聰明的玩家,會在此時立刻轉身開始反追怪物,導致怪物傻傻捱打。這種行為還有了一個專門的名稱:“拉怪”。以至於現在的遊戲不得不在怪物返回巢穴的時候,增加回血機制或者直接變成無敵狀態。可見這種單一的條件維度和臨界數值,很容易被玩家感知並加以利用。
玩家“拉怪”操作
3)隨機性和成長性缺失
行為樹規則下,每次執行的行為通常也是固定的,既缺少由隨機效能帶來的分支廣度,也缺少經過時間累積、根據玩家個性化操作產生的分支深度。對玩家來說,見過第一次之後就不會再有任何驚喜感。電影《勇敢者的遊戲:決戰叢林》裡有個橋段就是調侃遊戲裡NPC的對話內容一成不變。
《勇敢者的遊戲:決戰叢林》劇照
總結
回顧遊戲AI的發展歷程,可以發現今天的遊戲AI還有非常大的提升空間。隨著深度學習、人工神經網路的興起,遊戲AI(甚至遊戲裡其他方方面面)的問題,都可能迎來全新的解決思路。包括前文提到的對未知輸入條件的適應、單一的臨界條件值、以及隨機性/成長性問題等,都是深度學習所擅長的領域。
而結合大資料、統計學習的能力,可以讓深度學習在遊戲關卡設計、數值平衡、NPC對話內容生成、美術模型/貼圖、動作資源產生等方面帶來進一步的效率優化。
我們有理由相信,在不久的將來,AI賦能下的遊戲將會變得更加豐富多變、更加貼近真實世界,甚至開創出全新的遊戲品類。
參考文獻:
[1] Meet Bertie the Brain, the world's first arcade game, built in Toronto - Spacing Toronto
http://spacing.ca/toronto/2014/08/13/meet-bertie-brain-worlds-first-arcade-game-built-toronto
[2] 《談談AI技術在遊戲行業中的現狀以及未來發展》
https://bbs.gameres.com/thread_801702_1_1.html
[3] 《遊戲AI是人工智慧?其實還差的很遠》
https://c.m.163.com/news/a/C938A4GE00314V8G.html?spss=wap_refluxdl_2018
來源:超引數科技
原文:https://mp.weixin.qq.com/s/5gaMb5l_bEbLwwWhIDshvg
相關文章
- 遊戲AI智障史遊戲AI
- 從“傑弗里斯”到“絕悟”,淺談遊戲AI正在發生的深層次變革遊戲AI
- 淺談Node中module的實現原理
- npc的AI是如何運作的? 從程式到策劃深入談遊戲AIAI遊戲
- 人工智障 2 : 你看到的AI與智慧無關AI
- 淺談從搜尋到動歸
- 關於意義:從現實到遊戲,從自我到自由遊戲
- 淺談Innodb的鎖實現
- 遊戲從業者如何迎接AIGC浪潮:淺談ChatGPT和AI繪圖遊戲AIGCChatGPT繪圖
- 淺談C#中標準Dispose模式的實現C#模式
- 淺談遊戲中的互動敘事遊戲
- 從心理學角度淺談三消遊戲遊戲
- 淺談足球遊戲的人工智慧 (轉)遊戲人工智慧
- 從巨穴歷險到清純美少女,淺談AVG遊戲發展史遊戲
- iOS架構淺談從 MVC、MVP 到 MVVMiOS架構MVCMVPMVVM
- 淺談react diff實現React
- 淺談遊戲遊戲
- 淺談Analysis Services MDX中父子維的實現方式UXUX
- 遊戲中的經濟:淺談貨幣在遊戲中的價值遊戲
- 從 Dropdown 的 React 實現中學習到的React
- 遊戲AI探索之旅:從AlphaGo到MOBA遊戲遊戲AIGo
- 從遊戲文化輸出淺談國產遊戲風格遊戲
- 從使用者角度淺談玩家的遊戲社交之道遊戲
- 遊戲心理學研究:淺談遊戲中的間性現象與同性戀情節遊戲
- Elasticsearch從入門到放棄:淺談算分Elasticsearch
- 淺談如何實現自定義的 iterator
- 淺談php變數的實現-PHPPHP變數
- 從科研角度談“如何實現基於機器學習的智慧運維”機器學習運維
- 淺談電子遊戲中選擇的設計遊戲
- 淺談卡牌遊戲中給玩家支援的設計遊戲
- 淺談遊戲中槍械:什麼因素影響射擊遊戲中的槍?遊戲
- 淺談iOS中圖片解壓縮從檔案渲染到螢幕的過程iOS
- 淺談JavaScript中的thisJavaScript
- 小鎮青年的網遊實踐與現實生活:從“遊戲即生活”到“遊戲只是遊戲”遊戲
- 手遊開發者談能從投幣街機遊戲的設計中學到什麼遊戲
- 做面試的不倒翁:淺談 Vue 中 computed 實現原理面試Vue
- 淺談 instanceof 和 typeof 的實現原理
- (Ajax) 淺談 JSONP 的原理與實現JSON