2020-01-09 來源:GameLook

隨著玩家對內容消耗速度越來越快,隨機生成內容對於開發者來說可以解決相當一部分壓力,不僅可以滿足玩家需求,還可以提高遊戲的可重複性。
那麼,遊戲里的隨機生成該怎麼做呢?海外開發者John Harris分析了三種比較經典的做法,以下是GameLook編譯的詳細內容:
你在自己的遊戲里對於隨機生成考慮過多少?如果沒有,那麼我建議你花點時間想想它的本質,以及有可能出錯的地方。
有些人覺得,遊戲不應該加入隨機性,或者說,類似搖骰子一樣的玩法應該是“邊緣角色”。把所有的信息展示給玩家,如果攻擊生效,它就應該是明確的,把不確定性排除。在一款動作遊戲里,如果你拿槍指著一名玩家並且扣動扳機,如果目標是真實的,那就一定會擊中,不應該被漂移或者描述數值干涉。
還有一些人,他們非常擔心人們對於90%擊中率的含義有所誤解,所以用混淆數學概念的方式擲骰子,所以實際上擊中率應該是98%。
真正隨機的電腦遊戲數量很少,在我們所處的宏觀現實世界里,隨機性實際上很少見。當我們擲骰子的時候,決定數字的主要原因是我們用手扔出去的力道,而用隨機性來解釋它實際上出於無知。我們不知道骰子在空中運行時候的運動矢量結果,也不知道它撞到桌子上有什麼反應、會如何翻滾和停止。
你可以在量子級別得到真正的隨機性,但這通常是傳統電子學無法覆蓋的。這個問題卻非常重要,有些Unix系統實際上通過玩家的精準實際輸入等資源形成了無序狀態池,作為OS級服務響應使用請求。這些請求十分重要,以至於可以用來阻塞、暫停請求過程,直到獲得足夠的數值,這種方式通常被用於加密。
不那麼重要的請求通常由其他方式構成。大多數時候,我們在遊戲里要做的隻是偽隨機數字生成器,它們很容易被理解、大多數編譯器的標準庫都有提供,如果有需要,你還可以自己做。
如果你打算在自己的遊戲里加入隨機數字生成器,這些都是非常值得研究的,因此,本文主要介紹3種值得注意的隨機數字生成器,包括它們的特性、使用方式,以及在一系列經典遊戲中的使用案例。
《最終幻想1》:從預生成數字按順序讀取
原版的《最終幻想》以及史克威爾公司一些列的Famicom遊戲,都是由傳奇8位素程序員Nasir Gebelli編程的,他在Apple Ⅱ電腦時代就已經非常出名。Apple Ⅱ與Famicom都使用了6502微處理器,所以Gebelli寫這款遊戲編程的時候,已經掌握了大量技巧。
其中的隨機遭遇生成大多數是由向上或者向下走來決定,通過存儲在在ROM里的256個預置數值隨機決定的。玩家角色每走一步都會更新參數,每個參數對應一個閾值,如果參數低於閾值,就會觸發遭遇戰。
但是,這並非《最終幻想》原版遊戲唯一的隨機數字生成器。在戰鬥中,當需要擲骰子的時候,就會用到類似系統,它帶有完全不同的256個數值,而且是按次序讀取。與遭遇戰生成器的參數不同,這個生成器存儲在有電池供應的RAM里,換句話說,如果在特定區域加載存檔之後遭遇戰鬥,重新加載遊戲,然後在相同區域還可以再次遭遇,而且會是同樣的敵人、同樣的難度。
有趣的是,雖然戰鬥狀態的隨機生成器存儲於RAM中,但它並不與玩家的存檔發生直接關聯。戰鬥開始之後,戰鬥引擎做了一件非常聰明的事情。該遊戲每兩幀都會調用數字函數,卻不使用結果,以至於你很難預測。
我們可以把這種行為叫做“旋轉”隨機數字生成器,即生成數字並非為它們的數值,隻是為了得到數字。當玩家移動光標的時候,隨機數字生成器會再次轉動。將戰鬥計算的結果與玩家操作時機關聯起來,做到每次遊戲都帶來不重複的結果。盡管遭遇戰生成器每次加載存檔都會一樣,但隻要玩家無法複製此前的精準操作,戰鬥狀態很快就會發生變化。
在RPG遊戲里,這一點是尤為重要的,你需要確保玩家無法掌握隨機數字生成規律,才能保證戰鬥系統不會形同虛設。如果提前知道某個區域有自己不喜歡的遭遇戰鬥,那麼玩家就會主動到另外一個遭遇區,甚至能夠利用這個漏洞區購買物品,找到對戰鬥最有利的道具。
唯一能夠避免這種情況的,就是獲取一些外部數值、外部無序資源,來通過編程產生多種運行狀態。在Commodore 64上,聲卡芯片和噪音振蕩器上的輸出雖然不夠完美,但通常可以提供足夠好的無序資源。有時候在NES和SNES上,一款遊戲可以對一些或者所有幀調用隨機數字生成器。由於對玩家輸入的反饋發生在不同幀,隨著玩家行為給系統提供大量無序資源,就會導致遊戲運行結果出現越來越多的差別。
帶有實時時鍾的系統會它來初始化偽隨機生成器,不過,玩家通常可以設置時鍾,所以這種做法也是一個漏洞。如果始終有不錯的分辨率是最好的,我們說的時間單位是以毫秒計的,如果通過這麼小的單位取閾值,你可以得到讓玩家很難有效操控的數值。
我們再回到《最終幻想》,大多數的休閑玩家是很難找到隨機生成器漏洞的。但是,如果玩家出於某種原因想要避開或者觸發一個特別困難的遭遇戰該怎麼辦?
在遊戲的一個房間里,有個叫做Warmech的偽boss,他出現在一個房間里的時候被遭遇的概率很高,但它是第8組遭遇敵人的一個,隻有三個數值可以觸發,也就是說,256場戰鬥才會遭遇三次。如果你知道戰鬥生成器的狀態,就可以故意觸發遭遇戰,讓它必定發生。
《超級馬力歐64》:線性同餘數生成器
一個非常受歡迎的偽隨機數字生成器叫做線性同餘數生成器(Linear Congruential Generator,簡稱LCRNG),它們在被操控的時候不會產出破壞遊戲的效果。如果想要詳細了解它的解釋,讀者們可以到維基百科查詢。
好的LCRNG在於它是不計算順序的遭遇,它的數值是跳躍式的,但同時會覆蓋所有的步驟。
你從子數值開始,通過基礎操作產生結果數值,後者會返回調用者並且再次生成數值,你最終可以得到每個子數值產生的一系列數值,最終形成循環。隨機數字生成器需要避免這種情況,但這也恰好是LCRNG的優勢:除非域內數值耗盡,否則絕不會重複。
《超級馬力歐64》就使用了這樣的隨機生成器,在YouTube做挑戰視頻的pannenkoek還專門發布過相關視頻。有一個問題在於,它的算法會在65114個數值之後循環,因為它的生成器隻有這麼多可能的結果,所以,如果玩家操作超出這個數值範圍,是得不到對應隨機數字的。
《口袋妖怪綠寶石》:不良種子行為
操控《最終幻想》的隨機數字生成器可以決定敵人出現的時機與具體種類,但這需要玩家投入大量的時間嚐試。《馬力歐64》的單個生成器就可以影響金幣複活與敵人行為,但這並不會對遊戲帶來巨大影響。《口袋妖怪》對隨機數字生成器的使用頻率更高。
當一個寶可夢產出之後,結果數值可能會存在很長時間,其中有些數字是神秘的、玩家不可見,但卻有長期影響。如果掌控這些數值可以給遊戲帶來破壞,由於玩家之間可以相互交易,所以最終傷害的不僅僅是遊戲本身。
由於生成器在《口袋妖怪》系列里十分重要,現代很多的續作都給偽隨機性使用的特別強大的算法,比如Mersenne Twister算法。由於該系列的受歡迎度,玩家們探索了很多方式破解該系統。
這些作弊方式其中一個目的是得到更好看的寶可夢,雖然不能帶來戰鬥優勢,但它們卻是十分稀有的。在Ruby、Diamond和Emerald系列里,隨機數字生成器每幀都會變化,戰鬥中的變化頻率提高為兩倍,更不用說到處可見的隨機性。不過,Smogon網站專門用了一頁研究如何操控該遊戲的生成器,因為它有一個非同尋常的缺陷:開機的時候,Emerald並不會把內部時鍾運用到生成器上,而是把它重置為0,其他兩款遊戲隻有在斷電之後才會這麼做。
由於遊戲的生成器按計劃處理種子數值,因此決定是否產出特殊寶可夢的有特定幀數。了解這些幀數並不能保證得到好看的寶可夢,但至少概率會大幅提升。
需要注意的是,該遊戲的生成器會利用玩家ID和秘密ID,這些都藏在存儲文件里,而且不易改變,因此,一個存檔上很容易抓到的寶可夢,換到另一個就可能需要等很久。
····· End ·····
GameLook每日遊戲產業報道
全球視野 / 深度有料
爆料 / 交流 / 合作:請加主編微信 igamelook
廣告投放 : 請加 QQ:1772295880
長按下方圖片,"識別二維碼" 訂閱微信公眾號
····· 更多內容請訪問 www.gamelook.com.cn ·····
Copyright © GameLook® 2009-2019
覺得好看,請點這里 ↓↓↓