万维百科粤语版

遊戲_AI

(由遊戲 AI跳轉過嚟)
跳去導覽 跳去搵嘢
一班人喺度玩食鬼;啲鬼由電腦操控,但曉追捕玩家-展現咗簡單嘅智能。
搵路演算法泛指用嚟教電腦喺指定空間入面搵移動路線嘅演算法,係遊戲 AI 不可或缺嘅一環。
一隻簡單遊戲嘅 NPC 喺度同玩家「傾偈」-製作者想玩家心入面有「我面前呢個個體係有智能」嘅假像。

電子遊戲人工智能係指電子遊戲粵拼din6 zi2 jau4 hei3英文electronic game)當中嘅人工智能粵拼jan4 gung1 zi3 nang4英文artificial intelligence,簡稱「AI」):電子遊戲係能夠同玩家互動、以娛樂玩家為目的嘅電腦程式;而電子遊戲入面好多時會涉及由電腦控制,同玩家進行對局嘅角色NPC[1]遊戲開發者為咗想玩家得到樂趣,通常會想呢啲由電腦控制嘅角色有返咁上下聰明,能夠為玩家提供一定嘅挑戰(睇埋心流[2];噉即係話佢哋會想 NPC 展現一定程度嘅智能,而「教電腦程式做出類似有智能噉嘅行為」正正就係 AI 呢個領域嘅重心[3][4]

舉個簡單例子,食鬼入面嘅敵人由電腦控制,一個教電腦控制啲敵人嘅可能演算法如下[5]

Pac-Man.pos
clyde_target = random_tiles // 將 clyde_target 設做隨機一格

while game == in_play: // 當隻遊戲進行嘅每一個時間點,
    case player of:
      Blinky:  move 1 tile toward Pac-Man.pos // 第一隻鬼要向主角位置(Pac-Man.pos)行一步。
      Inky:    move 1 tile toward (Pac-Man.pos + 4) // 第二隻鬼要向主角位置前四格行一步。
      Clyde:   if Clyde.pos == clyde_target: // Clyde 呢隻鬼要向佢嘅目標位置前進,如果到咗目標位置,揀個新嘅目標位置。
                   clyde_target = (clyde_target + 1) % 10 
               else:
                   move 1 tile toward clyde_target

上述嘅會令啲敵人曉追趕主角-有少少似有智能嘅噉[6]

早期-廿世紀中-嘅電子遊戲經已有喺度用相對簡單嘅 AI,而廿一世紀初及後,電子遊戲嘅 AI 仲成為咗遊戲製作上嘅一個大課題。遊戲製作嘅專家會研究用乜嘢演算法整一隻遊戲嘅 AI 先最可以令玩家過癮,而且 AI 仲有俾人運用嚟做控制 NPC 以外嘅工作,例如係做遊戲測試(game testing;喺隻遊戲出街前測試隻遊戲玩起上嚟點)以及對局配對(matchmaking;喺網上 PvP 遊戲當中、搵若干個玩家、再將佢哋擺喺一個對局嘅過程)等等都有用到 AI 相關嘅技術[7][8]

基本概念

遊戲程式

內文: 遊戲程式

電子遊戲電腦程式嘅一種,而一個遊戲程式嘅根基係遊戲迴圈(game loop):隻遊戲嘅程式係一個程式迴圈(loop),要係噉重複做同一樣嘅工作(而唔係將個程式啲逐句逐句行一次就算)-呢樣工作就係攞「玩家透過手掣等架生俾嘅輸入」以及「隻遊戲喺上一刻嘅狀態」等嘅資訊,再按呢啲資訊同隻遊戲嘅法則,計遊戲世界下一刻嘅狀態應該係點。一隻電子遊戲大致上可以想像成噉樣(用咗 while 迴圈)嘅虛擬碼[9][10]

 while game is running
   process inputs
   update game world
   generate outputs
 loop
1982 年嘅食鬼遊戲

用以下呢段食鬼嘅虛擬碼為例[9]

 while player.lives > 0 當玩家有多過 0 條命嗰陣一路做...
    // Process Inputs
    JoystickData j = grab raw data from joystick 由手掣嗰度探測玩家撳咗乜掣
    
    // Update Game World
    update player.position based on j 基於玩家撳嘅掣,更新玩家角色嘅位置
    foreach Ghost g in world for 每一隻鬼
       if player collides with g 如果玩家撞到嗰隻鬼
          kill either player or g 玩家就死
       else
          update AI for g based on player.position 基於隻鬼嘅 AI,更新佢嘅位置;例子有上面提到嘅演算法。
       end
    loop
    
    // Pac-Man eats any pellets
    ...
    
    // Generate Outputs
    draw graphics 喺熒光幕上面畫相應嘅影像
    update audio ... 同埋整聲效
 loop

遊戲 AI 嘅碼位於 update game world 當中:有好多 PvE 遊戲嘅關卡入面都會有敵人俾玩家打,甚至有啲遊戲會喺 PvP 對局入面有由 AI 控制嘅個體[11];每當個程式更新遊戲世界嘅狀態嗰陣,佢都要估計每個 AI 個體需要採取乜嘢行動-呢啲個體要識探測玩家嘅位置,攻擊玩家,以及對玩家嘅攻擊作出迴避等等-即係話要按照呢啲 AI 嘅運作原理,計出佢哋每個個體喺下一刻會變成乜嘢狀態[12]

人工智能

內文: 人工智能

人工智能(AI)泛指教機械展示有智能行為嘅一類技術,喺電子遊戲業當中好常用:喺實際應用上,好多遊戲都會俾遊戲設計師設計成由玩家負責操控嘅主角打低一啲敵人通過關卡,而呢啲敵人喺美術上通常都會被設成「敵人士兵」等理應有智能嘅物體,所以玩家自然會期望呢啲個體識得或多或少噉展現出智能;喺認知科學(cognitive science)等嘅領域上認為,一個有智能嘅物體至少會曉感知周圍嘅環境,然後按收到嘅資訊同自己嘅目的決定要做出點嘅行為[13]

所以一般嘅遊戲 AI 至低限度會有以下兩大部份:

  • 刺激詮釋器(stimulus interpreter):刺激詮釋器會話俾一個 AI 程式知個遊戲狀態係點;一般嚟講,每個個體敵人都會有個獨立嘅 AI,每個智能會透過刺激詮釋器得到佢哋應該得到嘅資訊(例如一個敵人士兵應該知道佢視線範圍內發生緊乜事),即係話個程式要有方法表示「foreach AI ,嗰個智能手上有乜資訊」[14];刺激詮釋器喺某啲遊戲類型-例如係隱蔽類遊戲(stealth game;指重視要玩家避開敵人偵察嘅遊戲)-入面零舍重要,例:一隻俾玩家扮演忍者嘅遊戲,有機制決定一個敵人有冇睇到玩家,喺每個時間點,foreach 敵人,遊戲程式由個敵人對眼射幾條隱形嘅光出去,睇吓嗰幾條光有冇同玩家嘅命中框(hitbox)相交,而如果有,嗰個敵人就算睇到玩家[15]
  • 決策系統(decision system):呢個部份嘅碼一般會喺刺激詮釋器嘅碼後面;每一個 AI 都要按手上嘅資訊同自己嘅目的,計出跟住要採取乜嘢行動;例如一個敵人見到玩家,知道玩家嘅位置,而佢目的係要行埋玩家度攻擊佢,佢個 AI 程式就要有個方法教佢點樣用「玩家嘅位置」同「自己嘅位置」(個決策系統嘅輸入)計出「自己應該向乜方向移動」(個決策系統嘅輸出)[14]

攞返上面食鬼嗰個例子,段虛擬碼嘅其中一行 move 1 tile toward Pac-Man.pos 涉及要隻鬼移向主角嘅位置,即係話個程式知道主角嘅位置(Pac-Man.pos),並且直接當隻鬼知道呢個資訊(刺激詮釋器),而隻鬼嘅智能按一條好簡單嘅法則運行-向主角嘅位置移一格(決策系統),喺下刻,遊戲程式就按此知道隻鬼嘅狀態(位置)要點樣改變[5]

啟發法

內文: 啟發法

啟發法(heuristics)係認知科學同相關領域上嘅一個概念,指一啲用嚟解難嘅簡單法則:喺現實生活當中,人類好多時會用一啲過往經驗顯示咗係解到難嘅「認知捷徑」嚟應付佢哋面對嘅問題;舉個例子說明,想像有個人家陣去超市買餸,想買意粉,如果佢想做完全理性嘅決策,(根據理性嘅定義)佢要諗過度過嗮所有有得買嘅意粉牌子,諗出一套基準決定一隻牌子點先算「好」,量度吓每一款有幾能夠滿足佢嘅慾望(價錢貴唔貴、有幾好食等),再用一個效益函數(utility function)計吓邊隻牌子效用最高,而某隻牌子嘅效用可以(例如)用呢條式計:

當中 效益(utility), 係買咗之後淨低嘅錢反映嘅效用, 反映隻牌子有幾好食,而 反映隻牌子有幾健康(假設呢幾個數都可以用同一單位量度)。計咗呢條數之後,嗰個人就要揀效用最高嗰隻牌子,令自己效用最大化;佢又可以就噉揀佢買開嗰隻牌子-「揀我買開嗰隻牌子嘅意粉」就係一個啟發法;呢個啟發法未必可以達到最理想嘅結果-例如可能有一隻好好味、但佢未試過嘅意粉牌子(搞到用呢個啟發法達唔到最高嘅可能效用),但就幫到個人手慳好多時間。喺日常生活當中,人類做嘅經濟決策多數都係用啟發法做嘅-事實係,如果人類吓吓用完全理性嘅方法做決策嘅話,佢哋就要嘥好多時間做運算,喺實際應用上根本唔可行[16]

同一道理,如果要一個遊戲 AI 做完美運算,往往會嘥極大量嘅時間同精神,而且亦有搞到個 AI 唔似現實世界嘅智能嘅憂慮,所以遊戲 AI 嘅設計者一般會用大量嘅啟發法嚟教 AI 解決問題;好似係上面嗰段食鬼碼噉,原則上,個遊戲程式可以寫成(例如)每隻鬼都曉做運算,計算玩家跟住落嚟嗰 50 步嘅概率分佈(跟住落嚟嗰 50 步嘅所有可能性以及每個可能性發生嘅機會率),然後再攞每個可能性,計算喺每個可能性下,自己要用乜嘢移動軌跡,先可以令自己捉到玩家嘅機會率最大化-相比之下,move 1 tile toward Pac-Man.pos(靠近玩家嘅位置)或者 move 1 tile toward (Pac-Man.pos + 4)(靠近玩家位置前四格嘅位置)呢啲解難法則就簡單好多[17]

移動

睇埋:遊戲物理

教 AI 移動嘅演算法係遊戲 AI 嘅基礎之一:除咗好似互動式小說等嘅類型之外,絕大多數嘅遊戲都會包含一個遊戲空間,俾遊戲角色喺個空間入面移動;好似食鬼等嘅早期電子遊戲經已有喺度用演算法教 NPC 點樣探索遊戲空間,而呢個時期用嘅演算法有啲到咗廿一世紀都仲有人用[5]

喺比較簡單嘅情況下,一個電子遊戲 AI 移動演算法會攞遊戲空間入面其他物件嘅運動屬性做輸入,並且用呢啲輸入計出個 AI 角色應該要移去邊個方向或者位置:

  • 輸入 input:第啲物件或者個 AI 角色本身嘅
 position(位置) # 一個二至三維嘅向量,用坐標表達位置。
 orientation(方向) # 一個單一嘅數值,用離正北方嘅角度表達個角色面向邊個方向。
 velocity(速度,) # 另一個二至三維嘅向量,表示個角色喺三條軸分別嘅速度。
 rotation(旋轉) # 一個單一嘅數值,degree per second
  • 輸出 output:個 AI 角色跟住落嚟嘅
 acceleration(加速度) # 一個二至三維嘅向量,