提高游戲可重復性:經典游戲如何巧用隨機生成?

【GameLook專稿,轉載請注明出處】

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,這些都藏在存儲文件里,而且不易改變,因此,一個存檔上很容易抓到的寶可夢,換到另一個就可能需要等很久。

如若轉載,請注明出處:http://www.xyzzmie.com.cn/2020/01/378998

關注微信
重庆时时调整20分钟一期 一分11选5下载 蓝思科技股票最新消 10分快3跟老师计划挣钱是真的吗 足球直播平台 湖南幸运赛车玩法解读 网上兼职能赚钱吗 幸运快3大小单双的玩法 pc蛋蛋豆豆网 四川金7乐走势图下载 重庆幸运农场选号方法 369爆平特平码 贵阳捉鸡麻将高手经 吉林心悦麻将下载安卓 让分胜负 快3甘肃开奖今天 尚天国际棋牌下载