更新於 Andrii Kovalenko10 分鐘閱讀

遊戲中的程序生成:它到底怎麼運作

程序生成是什麼、遊戲用哪些類型與演算法來建構關卡與世界,以及它和單純的隨機生成差在哪裡。

程序生成是一種技術:遊戲在執行時用演算法和規則來建構內容——關卡、地形、掉寶、敵人,乃至整顆星球——而不是由設計師一件一件手工擺放。餵給系統一個起始數字(也就是種子),它就會組出一份全新、可玩,而且仍落在設計師所設邊界內的結果。

這就是為什麼一款 Roguelike 在你玩到第一百輪時還能給你一座沒見過的地城,也是為什麼《Minecraft》能生出比地球表面積還大的世界。以下談這個詞真正的意思、這些演算法用白話怎麼解釋,以及整套做法在哪裡會失靈。

什麼是程序生成

大多數人第一個想到的詞是「隨機」,而這正是最該先澄清的誤解。程序生成更接近被策劃過的隨機。設計師先做好原料——房間模板、拼貼組、道具池、敵人類型、地形規則——再寫下這些零件該怎麼拼在一起的指示。演算法接著把它們組合起來,通常從一個種子出發,生出一個新的、但仍然遵守規則的結果。

所以當一款遊戲被形容成程序生成,並不代表開發者擲骰子擲出什麼就出貨什麼。它代表他們寫的是一套會即時組裝內容的系統,而不是直接把每一關做完。種子是關鍵細節:同一個種子永遠產生同樣的輸出,這也是為什麼玩家能交換種子碼去重玩朋友那張一模一樣的世界,以及開發者能靠重跑同一份配置來重現 bug。

工藝藏在限制條件裡。弱的系統生出一團爛泥;強的系統生出的多樣性,仍然讓人覺得是有意為之。

程序生成 vs 隨機生成

這兩個詞常被混用,但它們不是同一回事,而這個差別正是程序生成之所以有效的全部理由。

隨機生成不帶任何規則地抽值。擲個數字、放一面牆、繼續。放著不管,這種做法會很開心地把出口封死在一面砸不破的牆後面、把你丟進一間沒有門的房間,或是在起始格上疊三隻精英怪。

程序生成則把那份隨機包在規則與限制裡,套用到精心設計過的零件上。它可能還是照樣抽一間房,但它會檢查從入口到出口確實存在通路、提供的裝備足以打得下去,而且難度落在可接受的區間。隨機是引擎,限制條件才是方向盤。

簡單說:隨機是丟硬幣,程序生成是丟硬幣時旁邊站著一個設計師說「這個不行」。所有好的程序系統,本質上都是圍繞著一個亂數搭起來的護欄。

程序生成的類型

「程序生成」是個統稱。遊戲把它套用在內容中非常不同的部位,多數大作會同時使用好幾種。

  • 關卡與地城。 最經典的用法。《Spelunky》、《死亡細胞》和《以撒的結合》這類 Roguelike 每輪都從手工房間縫出一份新配置,讓你正在學著讀懂的空間永遠不會完全重複。這和永久死亡天生互補,畢竟固定地圖加上永久死亡,就只是一場記憶力測驗。
  • 地形與世界。 《Minecraft》、《無人深空》和《Valheim》用數學生出陸塊、生態域、洞窟和行星,而不是一手雕出來。這是小團隊能做出實質無限世界的關鍵。
  • 掉寶與道具。 《暗黑破壞神》和《邊緣禁地》從表格抽出武器與裝備數值——基礎類型、詞綴、稀有度——所以兩把「同型號」的槍可能玩起來完全不同。那句著名的「《邊緣禁地》有八百七十億把槍」,就是程序化掉寶的濃縮版。
  • 貼圖與模型。 雜訊函數能畫出大理石、木紋、雲層或鏽蝕,不需要美術一個像素一個像素手繪,也能把石頭、草叢和樹木撒滿整張地圖。
  • 任務與敘事。 最罕見也最難的一種。《矮人要塞》會模擬整部歷史——戰爭、遷徙、世仇——而《惡靈勢力》的 AI Director 則即時重組敵人波次與物資掉落,好把張力維持在高點。敘事生成也是程序系統最常露出破綻的地方。

常見演算法與技術

你不需要真的會寫這些,也能理解一款遊戲在做什麼。以下是主力選手,用白話說明。

  • 雜訊函數(Perlin、Simplex)。 相較於看起來像電視雜訊的純亂數,雜訊函數產生的是平滑、自然的漸變。在網格上取樣、把數值讀成高度,你就得到起伏的丘陵、山脈和谷地——這是幾乎所有生成式地景的骨幹,《Minecraft》也包含在內。Simplex 是 Perlin 的後繼者,更快,也比較不受網格方向影響。
  • 細胞自動機。 先隨機撒下「牆」與「地板」細胞,再反覆套用一條簡單的鄰居規則(周圍牆夠多,這格就變成牆)。跑個幾輪之後,雜訊會沉澱成看起來很有機的洞窟。這是生成自然洞穴系統的首選招式。
  • BSP 與房間走廊法。 二元空間分割會遞迴地把一個矩形切成更小的矩形,在每塊裡放一間房,再用走廊把它們連起來。它是很多經典地城配置背後那個可靠又好讀的方法。
  • 波函數塌縮。 較新的熱門選項。你給它一小份拼貼樣本,以及哪些拼貼可以緊鄰哪些的規則,它就會填滿整張地圖,讓每一個局部擺放都合法——像在解一道用美術拼貼組成的數獨。很適合做出連貫的城鎮、地城與圖樣。
  • L-system。 一種改寫文法,從一個符號出發,依規則反覆展開。把它指向分支結構,就能長出很有說服力的樹木、植物、河網和閃電。

真正的遊戲多半會把好幾種串起來用:雜訊做地形、細胞自動機做地形裡的洞窟、L-system 做上面的森林。

遊戲為什麼要用它

  • 耐玩度。 如果關卡和掉寶每輪都不一樣,就算你早已摸透系統,遊戲仍然難以預測。這正是 Roguelike 和它比較輕量的表親 Roguelite 的心臟。
  • 規模。 手工蓋出一個《Minecraft》或《無人深空》那種尺寸的世界根本不可能。程序生成讓小團隊也能端出近乎無限的空間。
  • 儲存空間。 生成出來的世界在硬碟上幾乎不存在——你存的是種子和規則,而不是成品的好幾 TB。《無人深空》能把一千八百京顆行星塞進一個正常大小的下載檔,是因為它存的是食譜,不是做好的菜。
  • 驚喜。 連開發者自己都不確定某個種子會生出什麼,所以這款遊戲還是有辦法嚇到做它的人。

取捨在哪裡

代價是作者意圖。手工搭建的關卡能有刻意安排的節奏——伏擊前那段安靜、剛好框住的一幅視野、一隻擺在你血量正低時撲上來的敵人。生成出來的關卡用一部分工藝換取多樣性,而當限制條件太弱,結果就會顯得千篇一律、「沒有靈魂」,或像是用不搭調的零件拼出來的拼圖。

最誠實的失敗模式是「廣而淺」的世界:技術上無邊無際,情感上一片平坦。上市時的《無人深空》就是那個警世故事——億兆顆行星,逛了幾十顆之後就開始糊成一團。

這也是為什麼最強的程序生成遊戲通常是混合型。《Spelunky》和《死亡細胞》生成整體配置,但拼裝用的是人類設計並調校過的房間,所以每一輪都新鮮,每一間房卻都公平。生成器負責排列組合,工藝仍然由人來處理每一塊零件的內部。就連程序化程度堪稱極致的《矮人要塞》和《Caves of Qud》,底下也倚賴大量手工撰寫的系統、美術與規則——生成器是把設計師的工作放大,而不是取代它。它同時也改變了死亡與重來的手感:世界是生成的,重新開始就是一道新題目,而不是把上一次重播一遍。

在我們自己的遊戲 KUTO:時間之鎖裡,我們坐在光譜上混合型的那一端。你會一路打過去的各個紀元——古埃及、維京時代、霓虹賽博都市——是手工設計的配置,而非完全生成,再加上變化,讓你使用克洛諾斯之鐮和所選時間能力的每次遭遇不會每輪都一模一樣。這是留有變化空間的作者式空間,不是程序生成的 Roguelike。到 Steam 把 KUTO 加入願望清單

常見問題

遊戲裡的程序生成是什麼?
程序生成指的是遊戲在執行時用演算法和規則來建構內容——關卡、地形、掉寶、敵人——而不是由設計師一件一件手工擺放。系統吃進一個叫做「種子」的起始數字,就能產生一份全新、可玩,而且仍落在設計師所設邊界內的結果。
程序生成有哪些類型?
常見類型包括關卡與地城配置(《Spelunky》這類 Roguelike)、地形與整個世界(《Minecraft》、《無人深空》)、掉寶與道具數值(《暗黑破壞神》、《邊緣禁地》)、以雜訊生成的貼圖與模型,以及任務或敘事事件(《矮人要塞》、《惡靈勢力》的 AI Director)。多數遊戲會同時混用好幾種。
程序生成跟隨機生成是同一件事嗎?
不是。隨機生成只是不帶規則地抽值;程序生成則是把規則與限制套用在精心設計過的素材上。純隨機可能把出口封死,或疊出一場打不贏的戰鬥——程序系統則保證結果可通關,而且難度落在預期範圍內。
程序生成會用到哪些演算法?
主力包括用來生成地形高度的雜訊函數(Perlin、Simplex)、生成有機洞窟的細胞自動機、用於地城的 BSP 與房間走廊法、讓每一塊拼貼都遵守局部規則的波函數塌縮,以及用來生成樹木、河流等分支結構的 L-system。
程序生成裡的「種子」是什麼?
種子是餵給演算法的起始數字。同一個種子永遠產生同樣的結果,這就是為什麼玩家可以交換種子碼去重玩彼此的世界,也是開發者能重現特定配置來除錯的原因。
Roguelike 為什麼要用程序生成?
以「輪」為單位的遊戲,每次嘗試都需要新鮮的內容。固定地圖會讓數十次重來變成背地圖的作業,而程序生成讓每一輪都是一道新題目——這正是這個類型玩了幾百小時還耐玩的原因。
程序生成有什麼缺點?
代價是作者意圖。手工搭建的關卡能帶出精準的節奏和位置完美的敵人;生成出來的關卡則用一部分工藝去換取多樣性。限制條件太弱,內容就會顯得千篇一律或前後不連貫,這也是為什麼多數工作室會把手工素材和程序化組裝混著用。
KUTO:時間之鎖有用程序生成嗎?
KUTO 落在混合型的那一端。它的各個紀元——古埃及、維京時代、霓虹賽博都市——是手工設計的配置,而非完全生成,再加上變化,讓你使用克洛諾斯之鐮和時間能力的每次遭遇不會每輪都一模一樣。這是留有變化空間的作者式空間,不是程序生成的 Roguelike。

繼續閱讀

屍體回收解剖學:從 Dark Souls 到 KUTO

好的屍體回收會在死亡之後再給玩家一個決定。KUTO 讓這個決定變得很個人——擋在你和戰利品之間的,是你自己的配裝。

為 2.5D 動作遊戲設計子彈時間

子彈時間很好加,也很好毀掉。唯一有意思的版本,是那個到現在仍得為自己在循環裡的位置奮鬥的版本。