談談戰鬥力【二】——暴擊、穿透與減法公式
這次主要接著上一篇文章繼續往後談,涉及暴擊、穿透、乘法公式下的防禦和減法公式的問題。
下一篇的話,打算試著引入MP和魔法攻擊這種。我也不知道自己到底會在哪一步徹底把問題變成我解決不了的程度,姑且現在先往前推動一些吧。
暴擊
即使我們在傷害計算時引入了亂數補正,保證每次傷害都會打出不一樣的數值,以此來增加刺激感。然而對玩家而言,這種數值的增加並不明顯。即使偶爾運氣好一次,也最多隻能打出亂數補正的上限傷害,然而為了保證遊戲的數值相對穩定避免運氣壓倒一切,頻繁觸發的亂數補正自然不會將上限調得很高,充其量也就是在10%上下浮動。
因此,一些遊戲做出了暴擊這一設定。一些說法認為最早的暴擊出現在桌遊,而我對桌游完全不熟悉,只聽說過DND的D20之類的東西,所以也無法對這個訊息的準確度進行判斷。不過,DND裡面行動的擲點數這一隨機過程,倒確實與暴擊這種全隨機的判定機制非常吻合,考慮到DND對RPG這一品類的深遠影響,這一看法多少還是有些可信度的。
就此打住,我們依然還是設定兩個角色A和B,但這次我打算在其中引入多段暴擊——例如:
生成一個0-100範圍內的隨機數。
如果這個值大於80,判定觸發一次普通暴擊,打出1.5倍傷害;
如果超過95,判定觸發一次特殊暴擊,打出2.5倍傷害;
如果超過99,判定觸發一次超級暴擊,打出4倍傷害……
當然這個數值設定的是否合理暫且不談,我們應該看到,決定一次暴擊最重要的為兩個引數,即暴擊率( ,下文縮寫為 )與暴擊倍數( ,下文縮寫為 ),前者決定一次暴擊判定為成功的概率,後者決定這次暴擊判定成功時,這次傷害應該增加的倍數。
設兩個角色A(Health= ,Attack= ,CSR= , , ……,CM= , , ……)和B(Health= ,Attack= ,CSR= , , ……,CM= , , ……)。注意到,當某次暴擊判定成功時,其攻擊力變為 ,而對應的暴擊率為 。
在這種情況下,由於暴擊的隨機發生可以極大地影響整個戰鬥的局勢,自然無法僅憑一次簡單的互相攻擊就能判斷兩者的戰鬥力大小。因此此時的戰鬥力更多地作為一種統計學意義上的戰鬥力,也就是說,如果A和B互相攻擊足夠多次數後,戰鬥力高的一方勝率要高於戰鬥力低的一方。
通過概率論知識我們不難得知,此時傷害的期望值為:
注意此時出現了下標為0的項,這是因為一次暴擊判定必然存在失敗的可能性(否則刀刀暴擊也就失去了設計暴擊的意義)。我們定義:
這樣,整個傷害的期望值就可以化簡成如最開始的式子一樣簡潔清晰的形式。
與HA體系相比,不難看出,此時傷害由原本的攻擊值變成了結合暴擊倍數的期望值,考慮到這時戰鬥力的統計意義,不難得出:
類似地,在考慮防禦力後,戰鬥力的期望大小應該變為:
穿透
防禦的引入固然使得遊戲增加了一些變化,但僅靠著生命、攻擊和防禦這三者做出的數值體系還是太過單薄。據此,我們在這裡引入穿透(Penetration)屬性用來削減對手的防禦力。
此時的傷害公式應變為:
展開括號,則變成了:
這裡我們似乎可以把攻擊力和穿透兩個數值疊加,作為一個虛擬的攻擊力數值進行後續的運算。
然而問題恰恰出在這裡。
注意到在HADa體系裡,一開始的假設即預設“防禦低於所受攻擊,即攻擊必定產生傷害”。在僅有防禦的前提下這一問題還不算太突出,因為僅有防禦一個限制,在設計時就可以儘量壓縮防禦值的大小避免這種情況——然而當引入穿透後,事情亂套了:
如果角色A擁有5點防禦,但B擁有10點穿透和10點攻擊,按照上面的公式,傷害似乎應該為:
然而實際上,10點穿透打在5點防禦上,意味著這10點穿透中有5點是溢位的。換言之,實際上的傷害應該為:
這便是問題的根源了。
當然看到這裡,這時候有人一定會覺得“那就把穿透也設定得更小,避免這種溢位的情況就可以了嘛”。然而防禦值上限已經被壓縮的情況下,繼續壓縮穿透值上限,穿透對玩家的提升就實在太小了。另外還有一個問題——穿透值有溢位的可能而攻擊力沒有,同樣提升的前提下(穿透或攻擊增加一點,在不溢位的情況下反映到傷害上都是增加一點傷害),為什麼我要去提升穿透呢?直接攻擊一路碾過去豈不是更簡單粗暴?
這種情況下,穿透就處在了一個很尷尬的位置,相當雞肋沒有什麼重要性,但憑空多的這個數值又會分散玩家的注意力,且投入很可能沒有收益(比如穿透數值已經比其他角色的防禦高的情況下,再投入穿透並不會增加玩家在實際戰鬥中的優勢),而玩家加點嘗試發現穿透的問題後,大概率又要回頭來噴策劃……
這便是減法公式和乘法公式的根本問題了……
當然,這個我會放在下一小節討論,這裡還是先給出考慮穿透情況下的公式:
減法、乘法與除法公式,以及乘法公式下的防禦
簡而言之,兩者最主要的差別在於:
減法公式很容易產生負數,而乘法公式的本質確保了負數很難出現。
原因很簡單——諸如傷害計算,防禦判定等內容如果用減法公式做,就必然會涉及減法,而初中數學已經告訴我們,兩個正數相減,結果可以是正,也可以是負。
負數是一個很煩人的東西。仍然以防禦為例——角色A攻擊50,角色B防禦60,假如我們在一開始的傷害部分偷懶沒考慮到溢位的情況,戰鬥的結果就會變得匪夷所思——A打B,B不僅毫髮無傷,隨著A的攻擊反而一點點奶回來了。這種情況下該怎麼寫一個穩定的計算公式?畢竟公式不是程式碼,不可能套幾個if或者switch就扔那裡不管了。這也是為什麼一些策劃對減法公式避之不及的原因。
而假如我們把防禦變成“抵消20%的傷害”,A攻擊B,傷害則變成了40。如果A的攻擊變成了5,依然能造成4點傷害。無論A的攻擊有多低,其攻擊力也必定大於0。原因就在於兩個正數相乘結果必然為正。乘法公式正是靠著這個特性規避了負數的出現。
另有一種公式,也是我剛才閒著無聊谷歌翻出來的——除法公式,最簡單的形式下,它定義傷害為:
此時戰鬥力公式為:
除法公式的防禦力權重被進一步放大了,如果一個角色的防禦力變成0,這個角色等於毫無還手之力,因為此時即使是路邊的一隻史萊姆,造成的傷害也是無窮大。另外,在這種體系下,防禦力的上限不能設定太高,即使防禦力只有5,反映到傷害上也已經相當於80%的減傷。而即使防禦力的上限提高到攻擊力上限的僅1%,在後期屬性達到天花板的情況下也相當於一次僅能造成一百點傷害——我想應該沒有人會給一個遊戲後期的角色設計低於1000的生命值上限……
除法公式也許我之後會再轉回來寫……到時候再說吧——這裡還是先給出乘法公式下的戰鬥力公式:
其中 為減傷率,用來抵消對應百分比的傷害。
最後說兩句——
最初想寫這個是因為想研究一下為什麼自己高戰力還總是吃癟,不過現在看了一下,大概也明白了。這種戰鬥力計算公式,其實很多時候只能起到一個指示性的作用,並不能真正說明兩個角色互打,戰力高的就必定獲勝——但總的來看,戰力越高,在不同戰鬥中獲勝的可能越大,這一點是無需置疑的。正如我在上一篇裡面舉的例子——A(Attack=5,Health=10)和B(Attack=6,Health=10)互打,先手必勝,然而讓兩個人打一個2攻26血的怪物,不考慮亂數補正的前提下,無疑B必勝而A必敗。回合的不連續性使得戰鬥力這一在連續的前提下推匯出的結果顯得漏洞百出,畢竟從來沒聽說過0.5回合這種東西。
下一次除了開篇提到的魔法攻擊用來一點點過渡到多元素傷害以外,速度也值得好好考慮一下了——雖然實際上,目前還是逃不開“你砍我一刀我砍你一刀”這種站樁互砍的模型……
作者:老鹹魚
專欄地址:https://zhuanlan.zhihu.com/p/108933100
相關文章
- 戰鬥公式的演化與策略--屬性與公式的關係、減法公式與乘法公式公式
- 談談ACT手遊戰鬥系統
- 談談戰雙的戰鬥機制設計趨同
- 讓戰鬥更有視覺衝擊力:開發者談《騎馬與砍殺2》盾牌與劍鞘的設計視覺
- 動作與射擊漫談:俯視角射擊(二)
- 動作與射擊漫談:格鬥遊戲進化簡史遊戲
- 動作與射擊漫談:格鬥遊戲中的動作設計遊戲
- 【數值框架】戰鬥公式:傷害公式選擇框架公式
- 淺談快取寫法(一):快取的雪崩和穿透快取穿透
- 淺談DDos攻擊與防禦
- Netty系列(二):談談ByteBufNetty
- 通達信穿透力指標公式原始碼穿透指標公式原始碼
- 談談比特幣的機制及攻擊比特幣
- 動作與射擊漫談:俯視角射擊(一)
- kubernetes雜談之(二)Pod初談
- 淺談《艾希》中的META元素與打鬥設計
- 荒野亂鬥角色設計淺談
- 由Spring應用的瑕疵談談DDD的概念與應用(二)Spring
- 網路攻擊泛談
- 談談ES6語法(彙總上篇)
- 談談ES6語法(彙總下篇)
- 談談ES6語法(彙總中篇)
- 等級提升背後的隱藏公式——結合《鬥破蒼穹》淺談經驗設計公式
- 寶付談小白IT職場奮鬥之路
- 談談資料戰略的重要性
- 獎勵一定是正向的嗎? 談談遊戲中的“壓力”與“獎勵”遊戲
- 簡單來談談Unicode與emojiUnicode
- 淺談Kotlin語法篇之變數和常量(二)Kotlin變數
- 當我們談論格鬥遊戲時,我們在談論什麼遊戲
- 淺談 React Hooks(二)ReactHook
- 架構雜談《二》架構
- Android 談談封裝那些事 –BaseActivity 和 BaseFragment(二)Android封裝Fragment
- 談談編碼風格與規範
- 談談深拷貝與淺拷貝
- 談談Markdown的認識與入門
- 當官、宮鬥哪家強?淺談官鬥遊戲的前世今生遊戲
- 從槍支配件出發談硬核射擊遊戲的法則遊戲
- 遊戲戰鬥力數值研究(一)遊戲