格鬥遊戲的 AI 是怎麼實現的?
例如怎麼確定是要防禦還是攻擊?怎麼能實現連招?我說的格鬥遊戲是類似拳皇和街霸那種。
沒有題主所設想的暴nb的那種AI,本人恰好參與過某一代kof開發,就是個無比巨大的狀態機。
參與過另外的格鬥遊戲,碰到一種很有趣的做法(非拳皇,其他格鬥遊戲)。把彙編用宏定義成另外一種狀態描述語言,把某彙編指令定義成 IF_A ,某彙編定義為動作B,用這種類似於低級腳本的宏寫狀態機。然後用gcc編譯成二進位文件,狀態機從二進位流中讀取。
恰好今年我審的課程中有一篇是講述AI基礎的,之前也從事過很長一段時間關於遊戲AI的部分,簡單說一下。
當然,在遊戲中所用到的通常我們提的AI都是非真正意義上的智能,而是基於大量假設,大量數據,大量遍歷的對應演算法而已。
————————————————————————————
最常見的也就是行為樹,行為樹最簡單的說法就是,當X情況下,Y對Z,進行了A動作,這就是一條行為;其實X,Y,Z,A都是可以嵌套或者是交叉調用的一種方法。當無數條或者足夠數量條的行為組合在一起,就形成了行為樹。
關於行為樹的更多科學解釋見wikipeida:Behavior Trees
————————————————————————————
另一種常見的做法叫有限狀態機,簡單的來說就是一個 if else的判斷,則構成了一個最簡單的有限狀態機,複雜一些的化加上枚舉類型的如switch等。
關於有限狀態機的更多科學解釋見wikipedia:Finite-state machine
————————————————————————————
兩種常規的實現方法,各有利弊,行為樹可以處理更複雜的狀況,但是當對狀態的應對越多,便利行為樹所帶來的開銷就越大;有限狀態機在處理複雜狀況時依然可以保證效率,但處理複雜狀況的能力相對較弱,且面對衝突時調試難度較大。
————————————————————————————
以上為遊戲AI的基礎原理,現在回答答主的問題,就很簡單了,如何確定要防禦,這個問題起因於玩家的一個輸入,由此構建出若干個行為導致防禦。例如:
如果1P重拳,則COM無條件防禦。
如果1P輕拳,且當COM血量低於30%,則COM執行防禦。
…
以此類推,根據開發者的思維來編輯若干條行為。
則當你執行了一個操作後,COM就去遍歷你的這個操作符合哪條行為,並進行後續的判斷,如果全部符合,則進行了防禦。
當然實際情況遠沒有說的那麼簡單,裡面還涉及很多其他概念,比如時間切片,優先順序分析等概念,我想也就不用說的太多了,作為玩家我想也不用涉及過多。
我覺得去學習mugen裡面的AI會給你巨大的收穫。
看到有人提到mugen吾心甚慰啊,如果真對格鬥遊戲感興趣的話,研究研究mugen是不錯的選擇喲。
這裡給出幾個百度mugen吧里的AI相關的教程貼的地址吧
口水軒的AI教程貼 在下的AI教程...緩慢更新ing_mugen吧
文森的AI範例分析 Mugen人物AI範例分析第一篇
net教授的AI答疑樓 開一個關於ai問題的答疑樓_mugen吧
一個簡易人物AI教程 人物簡單AI教程_mugen吧
這些雖然都是主要講mugen人物AI,不過方法是相通的,題主加油吧一個不錯的技術博客:AI分享站
裡面有提到行為樹的方式,也有其他的AI實現方式,我覺得還是授人以漁吧~
行為本身造成的效果用狀態機設計模式應該比較適合,但我沒試過,不敢多言。
你說的是格鬥遊戲,不是那種格鬥網遊吧?DNF是動作遊戲+RPG。
格鬥遊戲的AI就是從內存里讀取一下對手態勢(狀態,相對位置,此狀態將持續的時間),然後從AI的行動列表中選一個。
其實判斷還挺麻煩的,因為格鬥遊戲里對手是不停變化的幾個區塊,比如出拳的時候,手臂是一個區塊,有攻擊判定,然後軀幹和腿是另外的區塊,有受攻擊判定。
AI不會管這麼細,它只要知道雙方相對位置,對手處於什麼狀態,持續時間,從對應的策略表裡選一套行動就行,區塊判定這些應該是在設計對應策略表時考慮的。
一年以前,我心中有和樓主一樣的疑問。後來我看了一下StreetFighter的代碼,心中的疑惑大概都消散了。建議題主搜一下「JavaScript" "StreetFighter",是騰訊的一個貌似叫合金團隊成員用JavaScript實現的仿街頭霸主的遊戲,可以直接在瀏覽器中運行。我當初曾打算用cocos2dx實現,然後移植到Android上,後來又沒了激情,這事就不了了之了。
將動作分類, 然後根據主角的不同出招動作,進行判斷後做出相應動作。這麼做在動作上比較好看,手感也很棒,缺點是成本很大。通常一個角色至少幾十套動作,主角甚至上百套,根據方位操作以及動作中斷等等進行不同的變招。
當然還有一個缺點是主角一旦完全不動,AI往往也會禁止不動。也可以看做「敵不動,我不動」的一種策略吧。這個也是可以通過調試改變攻擊策略的。
AI這東西沒必要說太細,只需要知道是用行為樹組織起來動作節點的就行。
漫談遊戲中的人工智慧前段時間寫了篇關於AI的博客,雖然是關於MMO的,但是格鬥遊戲也可以參考。
自己的見解,全無科學依據。
感覺npc的大多是依靠你按下的按鍵進行反應的,只不過你按下的鍵對應的對手動作複雜不複雜而已。
難度低的時候電腦做的動作隨機性較強,比如你攻擊他就莫名地跳起,難度越高對面的動作針對性越強,就像你按下的攻擊鍵可能對手會秒防禦。
還有就是給電腦一個套路,鐵拳裡面就記錄著世界各種玩家的打法套路,剛開始你還不一定打得過……
全是猜想,歡迎批評指正!
用狀態機或者行為樹 其他看具體邏輯
一般攻擊是周期性的固定行為,而防禦是基於「被攻擊」這個不確定時機而做出的不固定行為,防禦優先順序高於攻擊,如果防禦行為觸發時正在進行攻擊,那麼就強制從攻擊動作轉換為防禦,當然有動作融合的話表現看起來才比較流暢
電腦的AI就靠作弊,最高難度時你只要跳到電腦選手附近就升龍判定,嗯,就是這樣的。
貌似這些不叫AI吧?模擬器的拳皇(同樣是8級難度),剛裝上的時候很容易,越打會感覺電腦越「聰明」,我和朋友交流過,他們也有這樣的體會。星際爭霸和魔獸爭霸也是。這種「自學習」是怎麼實現的呢?
其實格鬥的AI是相對簡單的。
因為格鬥AI主要靠作弊。
以街霸II為例, 實際操作者,比如古烈,需要(下上腿)蓄勢三秒才能完成動作,但是AI操控時,直接判斷P1(操作者)就行。
類似
if P1.Y&>0 // (在空中)
then P2.腳刀();
推薦閱讀: