程序內容生成cing4 zeoi6 noi6 jung4 sang1 sing4procedural content generation),簡稱程序生成,係電腦科學上嘅一個概念,指用演算法產生數據,而非要電腦死記住一柞數據。舉個例說明:想像一隻電子遊戲遊戲程式入面有若干;一個典型嘅廿世紀遊戲程式嘅做法會係死記住每關嘅地圖係乜樣嘅;而一個用程序生成嘅遊戲程式就唔同-一個噉嘅遊戲程式會每關記住一段演算法,並且喺玩家要求程式整嗰關嘅地圖嗰時,即場用段演算法產生一幅地圖。呢啲演算法可以有隨機性,於是次次產生地圖嗰陣,最後出嗰幅地圖都會有少少唔同樣[1][2]

六樖用程序生成嘅虛擬

遊戲設計上,程序生成可以令一隻遊戲次次玩嗰陣都為玩家帶嚟唔同嘅體驗,提升隻遊戲嘅重玩價值(replayability):重玩價值喺遊戲設計上係指隻遊戲有幾能夠吸引玩家玩完又玩;而如果一隻遊戲用帶有隨機性嘅程序生成演算法產生關卡地圖(而唔係齋死記住每關嘅地圖)嘅話,就會令到玩家每次重玩嗰陣更加有新鮮感,令佢哋更加有可能願意一玩再玩[3]。呢種做法喺開放世界遊戲生存遊戲等要求玩家探索遊戲世界嘅遊戲類型當中零舍常見,而實際嘅例子可以睇《做個創世神》等嘅作品[2][4]

除咗電子遊戲製作,程序生成喺電腦圖像等嘅第啲電腦相關領域上都有用,例如用程序生成造出嚟嘅檔案往往會細過一般嘅做法-用程序生成嘅話,部電腦淨係需要記住一段源碼,然後喺有需要嗰陣即場用段碼砌柞數據出嚟,而唔係好似一般做法噉,死記住大柞數據-要死記嘅資訊量會少咗[5][6]

遊戲設計應用

 
一隻射擊遊戲當中嘅一個關卡
睇埋:重玩價值同埋擬亂數產生

產生關卡

睇埋:關卡設計

遊戲設計上,程序生成一個常見應用係用嚟整關卡地圖:喺好多類型嘅遊戲入面,玩家都要控制住玩家角色過若干關,每關都有一啲可以引致玩家角色死亡嘅嘢,而如果玩家成功過嗮咁多關,就算係打爆機;廿世紀電子遊戲設計嘅做法主流係,由遊戲設計師諗好嗮每一關嘅地圖係點嘅樣,並且要個遊戲程式死記住每一關嘅地圖;但由廿世紀尾開始,唔少遊戲設計方面嘅工作者都覺得呢種做法有個問題,就係唔能夠令一隻遊戲有高嘅重玩價值-重玩價值係遊戲設計上嘅一個概念,如果話一隻遊戲有高嘅重玩價值,意思係話隻遊戲能夠吸引玩家玩完又玩,而一般遊戲設計師都希望自己設計嘅遊戲有高嘅重玩價值,而如果有方法令玩家每次玩一關嗰陣,嗰一關都會有少少唔同樣,就可以令玩家更加有新鮮感,提升隻遊戲嘅重玩價值[2]。於是有人就提出運用程序生成整關卡-將一個遊戲程式設成 foreach 關卡記住一段演算法,每一關嘅相應演算法當中有隨機性,就可以做到「每次重玩一關嗰時,嗰關都會有少少唔同樣」嘅效果[7][8]

基本演算法

一般嚟講,一個用程序生成整遊戲內容嘅程式最基本會有以下部份[7]

  1. 生成遊戲內容;途中會用到隨機數生成(RNG)。
  2. 用某啲演算法評估個內容啱唔啱用,例:用程序生成產生一個關卡,再睇吓呢一個關卡係咪有可能過得到嘅(因為個演算法可能有時會意外產生一個根本冇可能過到嘅關卡);
  3. 如果步驟 2 嘅分析顯示個內容有問題,返去步驟 1;
  4. 如果步驟 2 嘅分析顯示個內容冇問題,攞個內容去用。
例子碼

以下嘅 C# 碼可以用嚟喺遊戲空間當中產生幾間相連嘅房[7]

class Room extends Sprite {
    // 一柞變數表示間房嘅坐標位置。
    public var x1:Int;
    public var x2:Int;
    public var y1:Int;
    public var y2:Int;
 
    // 變數表示間房嘅長同闊。
    public var w:Int;
    public var h:Int;
 
    // 變數表示間房嘅中心點。
    public var center:Point;
 
    // 產生一間新嘅四方形房。
    public function new(x:Int, y:Int, w:Int, h:Int) { // 攞四個整數做輸入。呢四個數字可以用隨機數產生法產生。
        super();
 
        x1 = x;
        x2 = x + w;
        y1 = y;
        y2 = y + h;
        this.x = x * Main.TILE_WIDTH;
        this.y = y * Main.TILE_HEIGHT;
        this.w = w;
        this.h = h;
        center = new Point(Math.floor((x1 + x2) / 2), // 用簡單嘅幾何原理,由間房嘅坐標位置計出佢中心點嘅坐標。
            Math.floor((y1 + y2) / 2));
    }
 
    // 睇吓間房有冇同第間房相交(檢查吓個內容有冇問題),如果有,呢個子程序會俾 true 做輸出。
    public function intersects(room:Room):Bool {
        return (x1 <= room.x2 && x2 >= room.x1 &&
            y1 <= room.y2 && room.y2 >= room.y1);
    }
}
 
一隻遊戲當中用程序生成產生嘅地圖;每一個方形空間代表一間房,而房之間嘅點點代表房之間嘅走廊。

「用程序生成產生關卡地圖」呢家嘢常見於開放世界遊戲(open world)同生存遊戲(survival)等有探索性嘅遊戲類型。例如係《無人深空》(No Man's Sky)呢隻喺 2016 年出嘅 PS4 遊戲噉:隻遊戲屬生存遊戲,講玩家探索外太空;成隻遊戲裏面有一個廣闊嘅宇宙俾玩家探索,呢個宇宙入面有無數咁多粒行星可以俾玩家去,而每粒行星上嘅地形、氣候同有嘅生命體都唔同;個遊戲程式嘅做法係,用一個擬亂數產生器每當有玩家要喺一粒行星上降落嗰陣即場產生粒行星,並且記住粒行星(另外一個玩家去到嗰粒行星見到嘅嘢會同第一個玩家去嗰粒行星見到嘅一樣),最後形成一個有多個玩家同時喺度探索嘅虛擬星系,而且玩家彼此之間可以分享有關「邊度邊度有粒點嘅行星」等嘅知識-令玩家更加有「自己真係探索緊太空」嘅感覺[9][10]

亦有種做法係攞程序生成演算法產生若干個板,然後設計師揀其中一個板嚟做關卡最後個樣。最後隻遊戲入面嗰關次次玩親都係嗰個樣。

產生掠奪品

 
喺某啲遊戲入面,玩家可以由打低咗嘅敵人嘅屍體身上攞走敵人攜帶嘅道具。

又有啲遊戲會用程序生成產生玩家可以得到嘅掠奪品(loot)。掠奪品泛指玩家可以由遊戲環境嗰度攞嘅道具,可以做到俾玩家一路通過關卡一路慢慢變強(手上嘅槍炮愈嚟愈勁)嘅效果;例如喺《邊緣禁地系列》(Borderlands)呢隻動作 RPG 入面,玩家會一路通過一個關卡一路用槍炮同敵人戰鬥,而途中可能會透過打低敵人或者搵到寶箱等嘅方法得到掠奪品,掠奪品包括咗武器或者裝甲等,而喺呢隻遊戲入面,啲槍炮係用程序生成產生嘅-每把槍炮都有若干個屬性,例如係火力同類型(手槍散彈槍狙擊槍等),而每當一個玩家將要得到掠奪品嗰陣,遊戲都會隨機噉揀選一把槍嘅屬性,並且即場砌一把槍出嚟,而喺個系列嘅第一作當中,一把用呢種方法產生嘅槍炮總共有成 17,750,000 個可能嘅款[4][11]

批評

不過有遊戲設計師指出,有隨機性嘅程序生成唔保證一定能夠令一隻遊戲有高嘅重玩價值,因為就算兩嚿物體唔同,如果佢哋之間嘅差異唔重要唔明顯,噉對用家嚟講兩嚿物體基本上一樣。例如 2016 年就有遊戲設計研究者喺網上遊戲製作雜誌 Gamasutra 嗰度撰文,以《無人深空》做例子[5]

原版英文:"'Every Planet Unique' might mean that each planet has a complex sci-fi backstory rich enough to fill a two-part Star Trek episode. It might also mean that, mathematically speaking, there's a rock somewhere on the planet that doesn't look like any other rock in the universe. Uniqueness almost always is used in the weakest, most technically correct way possible."

粵文翻譯:「每粒行星都獨一無二」(呢句嘢)意思可以係話每一粒行星都有一個複雜嘅科幻背景故仔,(每個呢啲故仔嘅內容)豐富到可以填滿一集兩部份嘅《星空奇遇記》(對玩家嚟講有趣嘅獨特性)。但呢句嘢意思又可以係話喺數學上嚟講,粒行星上某處有嚿岩石宇宙入面冇任何一嚿岩石同佢一樣樣嘅(對玩家嚟講唔有趣嘅獨特性)。啲人用起「獨一無二」呢個詞嗰陣,幾乎永遠都係用緊個字最弱、最技術上正確嘅意思。

出名遊戲

用咗程序生成嘅出名遊戲有以下呢啲:

... 等等。

Roguelike

內文:Roguelike

Roguelike 可以話係基於程序生成嘅一個電子遊戲類型。Roguelike 係一類受到枱上遊戲龍與地下城(D&D)影響、玩迷宮探索嘅遊戲,好大程度上源自 1980 年出嘅《Rogue》(英文「roguelike」意思正正就係「好似《Rogue》噉嘅」噉解),具有以下嘅特性[12][13]

  • 行回合制;
  • 地圖上嘅位置分做一格格;
  • 永久死亡機制;
  • 用程序生成產生嘅關卡;
  • 遊戲故仔通常會用奇幻美學,尤其係古典奇幻

... 等等。當中「用咗程序生成」可以話係 roguelike 最重要嘅特徵-Roguelitelite 係英文 light,意思係)係指輕度 roguelike,即係有某啲 roguelike 特徵、但有唔齊嘅遊戲,不過就算係 roguelite 遊戲基本上齊會有「用咗程序生成」呢一樣特性,例子可以睇吓用咗程序生成產生關卡嘅動作 RPG 系列《暗黑破壞神》(Diablo)[12][14]

 
1980 年遊戲《Rogue》入面嘅一個地下迷宮(dungeon);玩家要喺呢啲噉嘅迷宮入面打怪獸同搵寶藏,而程序生成嘅使用令玩家唔能夠齋靠死記關卡內容嚟過關。

體驗主導

睇埋:玩家體驗模擬同埋用家體驗

程序生成可以配合玩家體驗模擬(player experience modeling)嚟用:遊戲製作最重要嘅目的係要令玩家玩得開心過癮;電子遊戲人工智能上嘅技術可以用嚟建立模擬玩家體驗嘅數學模型,呢啲模型一般會攞描述遊戲參數變數input,即係例如係關卡參數(有幾多敵人、幾長...)同遊戲畫面呀噉,而 output 就係(個模型所預測嘅)玩家體驗,後者可以用「喺玩家玩完之後,彈個視窗出嚟問佢哋 1 至 10 分會俾隻遊戲幾多分」等嘅方法嚟量度[註 1];然後研究者可以(例如)用監督式學習(supervised learning)訓練人工神經網絡由遊戲參數預測玩家體驗,而如果順利嘅話,個模型可以話到俾製作組聽,「如果隻遊戲係噉噉噉樣,玩家嘅體驗會係噉噉噉樣」。呢種建構模型嚟預測玩家體驗嘅技術就係所謂嘅玩家體驗模擬[15][16]

體驗主導程序內容生成(experience-driven procedural content generation,EDPCG)係指用玩家體驗模擬主導一隻遊戲當中嘅程序生成:舉個簡單例子說明,遊戲設計師可以將隻遊戲設計成噉做[3]

  1. Foreach 玩家,用程序生成演算法產生一關嘅地圖,而段演算法裏面有一啲可調節嘅參數(例如「敵人之間嘅平均距離」)[17]
  2. 用玩家體驗模擬推算玩家會有幾滿足;
  3. 以呢個數字( )同第啲指標[註 2]做基準,衡量嗰柞演算法參數(一個陣列嘅數值)有幾「好」;
  4. 重複。

  呢個數字就可以(例如)做進化演算法(evolutionary algorithm)上嘅適應度(fitness)數值,代表邊一柞參數數值先係「理想」。不過呢種做法吓吓都要玩家俾反應,可以會搞到玩家覺得煩,所以遊戲製作界仲有諗第啲方法用嚟評估玩家有幾鍾意一個用程序生成產生嘅遊戲內容[18][19]

註釋

  1. 有唔少遊戲設計工作者覺得吓吓問玩家俾意見會阻住玩家享受隻遊戲,所以會比較偏好客觀(喺呢個情況下係指唔使要玩家開口答)嘅量度方法,例如係量度表情等反映情緒生理變數。
  2. 例如係模擬嗰關要簡單嘅遊戲人工智能玩起上嚟會出現點嘅情況。

睇埋

文獻

  1. Shaker, Noor; Togelius, Julian; Nelson, Mark J. (2016). Procedural Content Generation in Games: A Textbook and an Overview of Current Research. Springer.
  2. 2.0 2.1 2.2 Moss, Richard (January 1, 2016). "7 uses of procedural generation that all developers should study 互聯網檔案館歸檔,歸檔日期2019年8月27號,.". Gamasutra.
  3. 3.0 3.1 Liapis, A., Yannakakis, G. N., & Togelius, J. (2012). Adapting models of visual aesthetics for personalized content creation. IEEE Transactions on Computational Intelligence and AI in Games, 4(3), 213-228.
  4. 4.0 4.1 Togelius, J., Yannakakis, G. N., Stanley, K. O., & Browne, C. (2011). Search-based procedural content generation: A taxonomy and survey (PDF). IEEE Transactions on Computational Intelligence and AI in Games, 3(3), 172-186.
  5. 5.0 5.1 Cook, Michael (August 10, 2016). "Alien Languages: How We Talk About Procedural Generation". Gamasutra.
  6. Greuter, S., Parker, J., Stewart, N., & Leach, G. (2003, February). Real-time procedural generation of 'pseudo infinite' cities (PDF). In Proceedings of the 1st international conference on Computer graphics and interactive techniques in Australasia and South East Asia (pp. 87-ff).
  7. 7.0 7.1 7.2 Create a Procedurally Generated Dungeon Cave System.
  8. Van Der Linden, R., Lopes, R., & Bidarra, R. (2013). Procedural generation of dungeons. IEEE Transactions on Computational Intelligence and AI in Games, 6(1), 78-89.
  9. Khatchadourian, Raffi (18 May 2015). "World without end : creating a full-scale digital cosmos". Annals of Games. The New Yorker. 91 (13). pp. 48-57.
  10. Wilson (16 July 2015). "How 4 Designers Built A Game With 18.4 Quintillion Unique Planets". Fast Company.
  11. Kuo, Ryan (April 19, 2012). "Why Borderlands 2 Has the Most Stylish Guns in Gaming". Wall Street Journal.
  12. 12.0 12.1 Craddock, David L (August 5, 2015). Magrath, Andrew (ed.). Dungeon Hacks: How NetHack, Angband, and Other Roguelikes Changed the Course of Video Games. Press Start Press.
  13. Hatfield, Tom (2013-01-29). "Rise Of The Roguelikes: A Genre Evolves". GameSpy.
  14. Procedural vs. Randomly Generated Content in Game Design. Gamasutra.
  15. Yannakakis, G. N., & Hallam, J. (2008). Entertainment modeling through physiology in physical play. International Journal of Human-Computer Studies, 66(10), 741-755.
  16. Yannakakis, G. N., Martínez, H. P., & Jhala, A. (2010). Towards affective camera control in games. User Modeling and User-Adapted Interaction, 20(4), 313-340.
  17. Shaker, N., Yannakakis, G. N., & Togelius, J. (2010). Towards automatic personalized content generation for platform games. Sixth AAAI Conference on Artificial Intelligence and Interactive Digital Entertainment, Stanford. 63-68.
  18. Takagi, H. (2001). Interactive evolutionary computation: Fusion of the capabilities of EC optimization and human evaluation (PDF). Proceedings of the IEEE, 89(9), 1275-1296.
  19. Yannakakis, G. N., & Togelius, J. (2011). Experience-driven procedural content generation (PDF). IEEE Transactions on Affective Computing, 2(3), 147-161.
  20. Jennings-Teats, M., Smith, G., & Wardrip-Fruin, N. (2010, June). Polymorph: dynamic difficulty adjustment through level generation (PDF). In Proceedings of the 2010 Workshop on Procedural Content Generation in Games (pp. 1-4).