遊戲戰鬥力數值研究(一)

遊資網發表於2020-02-28
遊戲戰鬥力數值研究(一)


昨天躺床上睡不著的時候想到了一個問題,很多遊戲都有戰鬥力系統,通過一些角色屬性計算出一個戰鬥力用來比較玩家之間的強弱等。這是一個非常經典常見的設計。

不過似乎是我臉比較黑,打一些遊戲的競技場之類的東西時,經常會出現“明明對方戰力比我差一截,但我就是打不過去”這種匪夷所思的情況,而且這種情況還不在少數,難免倒人胃口。畢竟,戰鬥力這個數值設計就是用來衡量玩家的強弱的,但我既然更強卻打不過弱的,怎麼也說不過去。

所以我打算自己分析一下,從最簡單的模型開始一點點增加變數,看看到底應該用怎麼樣的辦法能更準確地計算戰鬥力的數值,並且嘗試對其中部分做簡單的證明來保證其科學性。

因為是邊推導邊發,一不小心咕了不說,可能有些地方會有疏漏和錯誤,望大家不吝賜教,提前謝過。

HA體系

先來看最簡單的“生命-攻擊”(HA)體系。

顧名思義,角色的屬性只有兩種,攻擊力和生命值。在這一體系下,遊戲的規則為:

1, 生命值小於等於0,角色死亡
2, A對B攻擊,對B造成相當於A攻擊力大小的傷害

這個體系和其下的規則相當簡單,可以說是RPG類遊戲的基礎。引入其他諸如防禦力,暴擊,屬性剋制等內容對傷害公式進行修正和改進,就得到了市面上各種各樣的RPG遊戲。

我們首先假設兩個角色A(Attack= 遊戲戰鬥力數值研究(一) ,Health= 遊戲戰鬥力數值研究(一) )和B(Attack= 遊戲戰鬥力數值研究(一) ,Health= 遊戲戰鬥力數值研究(一) ),並假定A強於B,在這一規則下,傷害公式應為

遊戲戰鬥力數值研究(一)

似乎有點過於簡單以至於沒有寫的必要。不過,傷害公式是進行戰鬥力計算的關鍵,對於每一個體系列出傷害公式,才能有助於我們更好地判斷戰鬥力的大小。所以雖然這個公式看起來很水,還是要列一下。

假定A先手,如果A不死亡,且A在自己的 遊戲戰鬥力數值研究(一) 回合後勝利,則對B累計造成的傷害為 遊戲戰鬥力數值研究(一) ,自己受到B造成的 遊戲戰鬥力數值研究(一) 點傷害。而A勝利的唯一條件為擊殺B,因此,應有如下兩個不等式:

遊戲戰鬥力數值研究(一)

應該注意的是,由於先手優勢,A能夠比B多打出一輪傷害。而如果如之前假定A強於B,則A在後手時也應獲勝。因而,類似的,有:

遊戲戰鬥力數值研究(一)

由於在後手情況下,A同樣需要N回合擊殺B,故不難證明:

遊戲戰鬥力數值研究(一)

將上式帶入A後手情況得出的兩個不等式,應有:

遊戲戰鬥力數值研究(一)

聯立【1】【2】【3】三個不等式,【1】+【3】所得結果約去2,得:

遊戲戰鬥力數值研究(一)

由於 遊戲戰鬥力數值研究(一)遊戲戰鬥力數值研究(一) 均為正值,移項並聯立兩式,有:

遊戲戰鬥力數值研究(一)

由於生命值與攻擊力為定值,因此兩者的乘積也必然為一常量。注意到我們在這個過程中並沒有對 遊戲戰鬥力數值研究(一)遊戲戰鬥力數值研究(一) 做出限定,因此,這一數值適用於HA體系下任意情況,並且可以準確衡量角色的真實強度。

定義

遊戲戰鬥力數值研究(一)

由這個公式可以得到一個有意思的結論:當可以在生命值和攻擊力中二選一進行提升的時候,選擇數值更低的進行提升收益更大。因而,這一體系下無腦堆血與玻璃大炮在單人遊玩的情況下並不會產生很好的效果。如何證明自然也很簡單,這裡不再贅述。

另外,一些遊戲為了保證每次攻擊產生的數值均不同,引入了亂數補正的手段。一般來講,亂數補正產生一個對稱的區間,每次造成的傷害在其中隨機取值,而整體期望仍為無補正時的數值大小,故對戰鬥力不產生影響。若區間不對稱,則傷害值應修改為實際期望,戰鬥力公式也要相應修改。

例如,若引入亂數補正係數 遊戲戰鬥力數值研究(一) ,上公式應修改為:

遊戲戰鬥力數值研究(一)

在以後的內容中,除非特殊說明,預設不討論亂數補正的情況。

HADa體系

如果引入一點更復雜的變數呢?

我們試著引入一個防禦看一看。

不同遊戲對於防禦的設定也不同。有些遊戲採用防禦抵消等值攻擊的做法,例如,如果一個原本為10點傷害的攻擊打到一個防禦為5點的角色上,則這個角色應受到5點傷害,而如果這個角色的防禦為15,則該角色不會受傷。此時可稱為一個“生命-攻擊-防禦吸收”(HADa)體系。

當然,在絕大多數場景下,很少有遊戲會在這種體系架構下使一個角色完全無傷,一是因為越來越多的遊戲使用自動加點的方法,升級自動提升對應屬性而玩家無法對此進行操作;二是可以結合等級對僅堆防禦的玩法進行邊際收益遞減,使得玩家實際的數值提升要小於玩家所看到的提升——當然,這又需要設計一套轉換的數值。對於高防禦角色,現在遊戲一般採用強制扣除極小傷害(如1點)等方法。以下討論預設防禦低於所受攻擊,即攻擊必定產生傷害的情況。

我們依然假設兩個角色A(Attack= 遊戲戰鬥力數值研究(一) ,Health= 遊戲戰鬥力數值研究(一) ,Defense= 遊戲戰鬥力數值研究(一) )和B(Attack= 遊戲戰鬥力數值研究(一) ,Health= 遊戲戰鬥力數值研究(一) ,Defense= 遊戲戰鬥力數值研究(一) ),並假定A強於B,在現有規則下,傷害公式應為

遊戲戰鬥力數值研究(一)

前加下劃線表示另一名角色。

同樣類似於HA體系,有:

遊戲戰鬥力數值研究(一)

不難同樣推匯出:

遊戲戰鬥力數值研究(一)
聯立,得:

遊戲戰鬥力數值研究(一)

然而這一式子難以化簡為下標1的項均在左,下標2的項均在右的形式。因此需要換個思路重新進行。

我們以上一個戰鬥力公式為例:

遊戲戰鬥力數值研究(一)

應該意識到,在引入防禦力這一屬性後,角色每回合都能得到一個大小為 遊戲戰鬥力數值研究(一) 的防禦,可以等效為增加額外的生命值。同時,由於回合數增加,角色總輸出也得以提高。在攻擊力不變的情況下,若回合數變為2倍,總輸出也變為2倍,這等效於無防禦時攻擊力提高2倍。

因此,對生命值和攻擊力進行修正,應為:

遊戲戰鬥力數值研究(一)

遊戲戰鬥力數值研究(一)

上式中, 遊戲戰鬥力數值研究(一) 為無防禦時回合數, 遊戲戰鬥力數值研究(一) 為帶防禦後回合數。故有:

遊戲戰鬥力數值研究(一)

帶入,得:

2020年2月11日晚修正:


修正生命值與修正攻擊力都考慮了防禦產生的額外回合造成的影響,這自然沒有問題。然而當兩個修正項相乘時,即相當於對防禦收益重複計算了兩次,因而,原戰鬥力公式在這裡產生了偏差,重複計算防禦收益使得防禦的權重被過度放大了,原公式中右側分式平方項應去掉平方,修改後公式見下:

遊戲戰鬥力數值研究(一)

很顯然,當防禦為0時,HADa體系退化到HA體系。且求導可得,戰鬥力對生命值,攻擊力,防禦力的導數均為正數,即不論增長的方向為哪一種,均可以提高戰鬥力。

不過,這裡同樣出現了一個很大的問題,也就是對手的攻擊。簡單來講,對手造成的攻擊高低也決定了這一戰力數值,然而在通常計算戰力數值時無疑是不可能有一個“對手”的。

一種可行的辦法是虛擬一個對手的攻擊值,換言之,人為規定一個 遊戲戰鬥力數值研究(一) 。為了防止除0的錯誤,虛擬的攻擊值應大於防禦上限。此外,觀察分母可得知,防禦值越接近上限,戰鬥力增加越快,收益越大,線性效果越差。若想取得較好的線性效果,應至少使得 遊戲戰鬥力數值研究(一) 達到防禦值上限的2~3倍以上。

同樣觀察這個模型,可以發現,若一個角色僅注重提升某一個屬性的屬性,其收益雖依然存在,但逐漸會導致其他項的偏導數增大,最終使得提升其他屬性的收益大於僅提升單一屬性。

這篇文章原本刊載在我的公眾號“鹹魚眼”上,20號晚上寫完之後就發了。早上起來又看了看知乎上面的其他戰鬥力公式。

大概看了一圈,對於第一個模型其實都提出了一樣的結果。這其實很好理解,所謂“活著才有輸出”,角色一旦死亡,不僅之後輸出為0,還會直接失敗,這也是為什麼第二個模型中後期防禦力對戰力的影響越來越大的原因——防禦越高,能抵禦的傷害就越多。即使僅增加一點防禦,如果需要10個己方回合才能獲勝,也相當於額外的10點hp,更別提如果本來無法戰勝的情況下靠這10點hp多出來的一回合裡能造成的額外輸出了。

很多采用了線性的戰鬥力計算公式, 遊戲戰鬥力數值研究(一) 這種格式。某種程度上並沒有問題,因為為了保證屬性的增加能反映到戰鬥力上,偏導數為正這一點是必須的。但權重係數的選擇很大程度上依賴於經驗和模擬。並且很多時候,很難做到完美的貼合。究其原因,在於攻擊與生命值——或者抽象一點,輸出與續航——是相互聯絡的。續航越久輸出的時機就越多,總輸出就越高;而單次輸出越高越能更快擊殺敵人,擊殺速度越快敵方回合數越少,因此變相延長了續航。在我看來,線性的公式很大的一個問題就在於,將兩個互相糾纏的變數獨立化,而提高生命值對攻擊力的隱形影響被忽視了。

當然最後也應該指出,第一個公式也並不完全完美。例如兩個角色A(Attack=5,Health=10)和B(Attack=6,Health=10),按照第一個計算公式,顯然B的戰鬥力要高於A,然而讓兩人對打可以發現,實際情況是先手必勝。

看起來似乎花了很大的篇幅介紹了一個完全無用的模型。事實上,這是由於回合數必須取整導致的。如果我們把傷害方式和規則改成“兩人碰面站著不動,按照對手攻擊值的速度均勻連續掉血”,那毫無疑問B必勝。不連續的回合數導致面向連續過程的模型在這裡出現了偏差,而當數值足夠大時——例如A和B的生命值從10變成10000而攻擊不變,則每次攻擊造成的傷害足夠小以至於可以近似認為是連續過程。因此,定義HA體系的偏差因子s:

遊戲戰鬥力數值研究(一)

其中 遊戲戰鬥力數值研究(一) 為敵方平均攻擊力,可以採用其他水平相似的玩家或怪物的攻擊力進行加權平均, 遊戲戰鬥力數值研究(一) 為角色生命值。偏差因子越大,證明此模型擬合程度越差。

因此若使用此模型,應該儘可能快地對生命值進行膨脹,以減小偏差因子。然而事實上,過長的回合無疑會拖慢遊戲節奏。僅pve的情況下這一問題不大,因為玩家的生命值膨脹並不會影響玩家的實際體驗。然而在pvp模式下,雙方過高的生命值和過低的攻擊力,使得戰鬥變成了冗長而無聊的“互相修腳”。這是在設計初期就應該竭力避免的。


作者:老鹹魚
專欄地址:https://zhuanlan.zhihu.com/p/108183307

相關文章