【轉載】遊戲----攻擊判定流程研究
攻擊判定流程研究
CaffreyMo 2016-08-18 1.12w瀏覽
想免費獲取內部獨家PPT資料庫?觀看行業大牛直播?點選加入騰訊GAD遊戲策劃行業精英群361498939
內容簡介
攻擊判定流程幾乎是所有包含戰鬥玩法的遊戲都無法繞過的一塊內容,常見的攻擊判定流程有瀑布演算法、圓桌演算法以及混合演算法三種。本文簡述了這三種判定流程的特徵,以例項對比分析了瀑布演算法與圓桌演算法各自的優點,以期為後續其他戰鬥數值設計內容的論述提供一定的基礎。
攻擊判定流程概述
自此開始正文內容的敘述——讓我們直接代入一個例項:
在一款遊戲中,攻擊方有命中率和暴擊率兩個攻擊屬性,而防守方有閃避率、招架率和格擋率三個防禦屬性。於是相應的,一次攻擊有可能產生6
1. 瀑布演算法
顧名思義,在瀑布演算法中,各事件的判定順序如同瀑布一般自上而下。如果“水流”在某個位置被截斷,則後面的流程都將不再繼續進行。據我所知,瀑布演算法是大多數遊戲所採用的攻擊判定演算法。
上述例項若採用瀑布演算法,則會以如下方式進行判定:
n 先判定攻方是否命中
n 再判定是否被守方閃避
n 再判定是否被守方招架
n 再判斷是否被守方格擋
n 最後判定該次攻擊是否為暴擊
瀑布演算法流程圖
由此我們可以得出:
l 瀑布演算法特徵1
l 瀑布演算法特徵2:後置判定依賴於前置判定的通過
注:有的遊戲會將命中和閃避合併在一次擲骰中判定,這意味著將攻方命中率與守方閃避率合併計算出實際擊中概率後再進行擲骰判定,仍是瀑布演算法
我們再代入一些具體的數值,設攻守雙方角色的面板屬性如下:
n 攻方命中率=90%
n 攻方暴擊率=25%
n 守方閃避率=20%
n 守方招架率=15%
n 守方格擋率=30%
按照上述的流程判定,6種判定結果將會按如下的概率分佈:
n 實際未命中概率=1-命中率=1-90%=10%
n 實際閃避概率=命中率*閃避率=90%*20%=18%
n
n 實際格擋概率=命中率*(1-閃避率)*(1-招架率)*格擋率=90%*(1-20%)*(1-15%)*30%=18.36%
n 實際暴擊概率=命中率*(1-閃避率)*(1-招架率)*(1-格擋率)*暴擊率=90%*(1-20%)*(1-15%)*(1-30%)*25%=10.71%
n 實際普通命中概率=命中率*(1-閃避率)*(1-招架率)*(1-格擋率)*(1-暴擊率)=90%*(1-20%)*(1-15%)*(1-30%)*(1-25%)=32.13%
瀑布演算法的判定結果分佈
由此我們可以得出:
l 瀑布演算法特徵3:各事件出現的概率符合經典的概率計算方法
l 瀑布演算法特徵4:擲骰輪次越偏後的屬性衰減程度越大,但不會出現無效的屬性
2. 圓桌演算法
將所有可能出現的事件集合抽象成一個圓桌桌面,便是圓桌演算法這一稱呼的由來。圓桌演算法的實質,是將所有可能發生的事件狀態按優先順序依次放上桌面,直至所有事件被放完或桌面被填滿。圓桌演算法正是史詩級鉅作魔獸世界中所採用的演算法。據筆者瞭解,使用該演算法的遊戲並不多見,但即便僅魔獸世界這一款,已足以使這種演算法成為永恆的經典~
上述例項若採用圓桌演算法,則會用一次擲骰判定該次攻擊的結果。
圓桌演算法流程圖
圓桌演算法的操作步驟可以歸納為:
(1) 攻方角色的命中率決定圓桌桌面的大小
(2) 將各個事件狀態按優先順序依次放上桌面,直至所有的事件均放置完或桌面被填滿
(3) 若桌面還未填滿,則用普通命中填滿空桌面
將先前設定的數值代入,6種判定結果將會按如下的概率分佈:
n 實際未命中概率=10%
n 實際閃避概率=20%
n 實際招架概率=15%
n 實際格擋概率=30%
n 實際暴擊概率=25%
n 實際普通命中概率=90%-實際閃避概率-實際招架概率-實際格擋概率-實際暴擊概率=90%-20%-15%-30%-25%=0%
注:在上述計算中,優先順序按如下排序:閃避>招架>格擋>暴擊>普通命中
圓桌演算法的判定結果分佈
可以看出,由於普通命中的優先順序最低,所以它被完全擠出了桌面。這意味著,若攻守雙方以此數值模型進行對決,則攻擊方的攻擊結果中將不存在普通命中。
由此我們可以得出:
l 圓桌演算法特徵1:一次擲骰即得出該次攻擊的判定結果
l 圓桌演算法特徵2:事件有優先順序,圓桌放滿後優先順序低的事件將被擠出桌面。這意味著那部分溢位的屬性將不再生效
l 圓桌演算法特徵3:圓桌內的各事件出現概率不會衰減,只要優先順序低的屬性沒有被擠出圓桌,各種事件的實際發生概率就與面板屬性數值吻合
3. 混合演算法
這是一種先判定攻方事件,再判定守方事件的判定流程。筆者曾在一篇帖子中看到過這樣判定流程,不確定是否有實際的遊戲應用,故僅在此做一些簡單的理論分析。
混合演算法在單方事件的判定中採用圓桌演算法,即:
n 攻方判定結果:普通命中OR未命中OR暴擊
n 守方判定結果:閃避OR招架OR格擋OR被命中
混合演算法流程圖
注:上面這個圖僅作示意之用,從流程圖的角度來看可能不太嚴謹
將先前設定的數值代入,6種判定結果將會按如下的概率分佈:
n 實際未命中概率=10%
n 實際閃避概率=攻方命中率*閃避率=90%*20%=18%
n 實際招架概率=攻方命中率*招架率=90%*15%=13.5%
n 實際格擋概率=攻方命中率*格擋率=90%*30%=27%
n 實際暴擊概率=攻方暴擊率*敵方被命中概率=25%*(1-20%-15%-30%)=8.75%
n 實際普通命中概率=攻方普通命中概率*敵方被命中概率=(90%-25%)*(1-20%-15%-30%)=22.75%
混合演算法的判定結果分佈
由此我們可以得出:
l 混合演算法特徵1:先判定攻方事件,再判定守方事件,共進行兩次擲骰
l 混合演算法特徵2:先在單方事件的判定中採用圓桌演算法,再用瀑布演算法串聯攻守雙方事件
l 混合演算法特徵3:會產生並發動作,例如暴擊被閃避等
注:這也正是實際暴擊率較低原因所在
瀑布演算法與圓桌演算法的特性對比
在上一塊內容的鋪墊之下,我們不妨繼續以魔獸世界中的攻擊判定流程設計例項作為切入點,對比分析一下圓桌演算法與瀑布演算法各自的特性。
(1) 面板屬性傳遞資訊的直觀性
u 瀑布:由於各屬性在判定流程上的生效時間有先後之分,所以各屬性的實際效用與面板顯示的不符。
u 圓桌:由於屬性的判定沒有先後之分,只要沒有屬性被擠出圓桌,則所有屬性的實際效用與面板顯示的相當。
這裡可以看出圓桌演算法的優點:
l 屬性的實際效用與面板顯示相符顯然更易於普通玩家的理解,便於玩家掌握自身的戰力情況。
(2) 屬性的價值
u 瀑布:擲骰輪次越偏後的屬性衰減程度越大,但所有的屬性均會生效。
u 圓桌:只要沒有屬性被擠出圓桌,則不存在屬性效用的衰減。
這裡可以看出圓桌演算法的優點:
l 由於不存在判定流程上的先後,所以各屬性的實際價值會比較接近,一般不會出現玩家堆了某個判定流程靠後的屬性結果很廢的情況。
同樣也可以看出其缺點:
l 一旦有屬性溢位,則該部分屬性的效用為0,完全沒有價值。
(3) 相同面板數值下的生存能力
u 圓桌:在面板數值相同的情況下,魔獸世界用圓桌演算法大大提高了坦克角色的生存能力,使得他們可以應對來自首領怪的超高攻擊,匹配大型團隊副本的玩法設計。
瀑布演算法下,免傷概率=18%+10.8%+18.36%=47.16%
圓桌演算法下,免傷概率=20%+15%+30%=65%
傳統的概率為相乘關係,圓桌為相加關係,後者的概率總和要大的多
並且,當防禦職業將三維堆至一個閾值(70%)後,配合技能可達100%的免傷覆蓋,將命中和暴擊全部擠出桌面,從而衍生出特定的玩法(70級年代伊利丹的剪下技能)。
u 瀑布:相同的面板數值在瀑布演算法的框架下,免傷概率相較於圓桌演算法要低得多。換言之,角色達到相同的有效生命值,所需的免傷屬性要高得多。
這裡可以看出:
l 在圓桌演算法的框架之下,屬性投放若是脫離了控制超過了閾值,將對平衡性產生較大的衝擊(70級的盜賊單刷格魯爾——當然在暴雪光環的作用下,玩家會認為這是精妙的設計~)。
l 在國產遊戲收入導向的大環境下,設計者是否能頂住收入壓力,嚴守屬性投放的極值不越界,是值得慎思的問題。採用瀑布演算法,能有更大的數值空間用於能力投放,更為適合現階段的市場環境。
(4) 運算量
u 瀑布:多次擲骰
u 圓桌:單次擲骰
顯而易見:
l 擲骰次數越多,運算量越大。圓桌相較於瀑布,有著相對較小的運算量。簡單即是美。
注:除魔獸世界外,《冒險與挖礦》的技能施放也採用了圓桌演算法,大大簡化了技能施放的判定流程。可以想象一下,一次攻擊至多發動一個技能。而每一次攻擊,一個隊伍中有幾十個角色的技能施放需要判定,如果採用瀑布演算法,將產生多大的運算量。
思考與總結
對戰鬥數值的研究,應該基於理論推導而歸於實踐應用。畢竟遊戲數值設計不是做數學研究,其本質應是一種體驗設計。最後希望交流的是筆者個人對於這兩種演算法的一些理解。
(1) 不同的攻擊判定流程會向玩家傳達不同的戰鬥感受
究其本質,不同的攻擊判定流程,影響著一場戰鬥中的各種攻擊判定結果將以何種概率分佈出現。
假設在一款遊戲中,閃避率的投放上限是30%,暴擊率的投放上限是40%,命中率的投放上限是100%。瀑布演算法下,出現閃避、暴擊和普通命中的概率是30%、28%和42%;圓桌演算法下,則為30%、40%和30%。這兩種不同的概率分佈,必然會帶給玩家不同的戰鬥體驗,但在缺少其他條件的情況下,並不能判斷孰優孰劣。
使戰鬥體驗匹配遊戲的核心玩法,使屬性投放的極限值能滿足遊戲的商業化需要,是設計攻擊判定流程時首先要考慮的。
注:甚至於部分競技遊戲強調公平性,將暴擊做成了偽隨機。
l 使用瀑布演算法,則不應該設計種類繁多的事件狀態
若是仿照魔獸世界的做法設計一連串的事件狀態(未命中、閃避、招架、格擋、暴擊、普通命中、偏斜、碾壓),非但運算繁雜,而且後置判定的屬性衰減幅度較大,效果極不明顯。這種隱晦的設計將不易傳達,同時還會影響玩家的遊戲感受(某個判定流程靠後的屬性堆得很高結果卻沒用)。
l 使用圓桌演算法,則應該嚴守屬性投放的上限,防止平衡崩壞的情況發生
需要澄清的是,並不是說使用瀑布演算法就可以無限投放數值,而是說,相較於瀑布演算法,圓桌演算法的屬性投放上限會低很多(免傷概率的相加與相乘)
(2) 不同的攻擊判定流程將影響有效生命EHP和有效攻擊EDPS的表示式
幾乎每個數值策劃都會將角色的屬性轉化為EHP和EDPS以衡量其的戰鬥能力,但曾見過不少人對所有的遊戲都用統一的EHP、EDPS表示式進行分析模擬。這種偏差較大的模擬方式必然會影響體驗設計的精準性。在不同的攻擊判定流程之下,EHP與EDPS有著截然不同的表示式,舉例說明如下。
n 瀑布演算法下:
若命中閃避分兩次判定:
EHP=HP/(1-免傷率)/(1-閃避率)/(1-招架率)
EDPS=DPS*命中率*[1+暴擊率*(暴擊傷害倍率-1)]
若命中閃避合併判定:
EHP=HP/(1-免傷率)/(命中率-閃避率)/(1-招架率)
EDPS=DPS*(1+暴擊率*(暴擊傷害倍率-1))
n 圓桌演算法下:
EHP=HP/(1-免傷率)/(1-閃避率-招架率)
EDPS=DPS*[命中率-敵方閃避率-敵方招架率+暴擊率*(暴擊傷害倍率-1)]
注:閃避、招架>暴擊>普通命中,且各狀態發生概率之和未超過圓桌大小
n 混合演算法下:
EHP=HP/(1-免傷率)/(1-閃避率-招架率)
EDPS=DPS*[命中率+暴擊率*(暴擊傷害倍率-1)]
可能有人會覺得:模擬得這麼準又有什麼卵用,數值平衡最後還不是靠調?誠然,在數值設計領域,確實有名言曰:數值平衡是調出來的。但在筆者看來,調節應該建立在正確的理論推導的基礎之上。依靠調節來掩蓋數值模型的錯誤設計,是本末倒置的行為。即便達到了所謂的平衡,也不過是扭曲的平衡,會為後續版本的迭代埋下隱患。
寫在最後
市面上的大多數遊戲,都不會設計複雜繁多的攻擊事件,且基本採用瀑布演算法。如此看來,攻擊判定流程的設計十分簡單。那麼為什麼要大費周章地將簡單問題複雜化呢?
愛因斯坦曾說過:Everythingmust be made as simple as possible, but not one bit simpler——凡事應該力求簡單,但不能過於簡單。從瞭解一種數值設計方法到理解如此設計的目的,從模仿成功遊戲的數值設計到理解其設計的內在意義,這是每個數值策劃成長的必經之路。
從全盤照搬一種數值體系到能夠融會貫通並根據實際情況靈活運用,這是一條並不好走的路。知其然,也應知其所以然——這是一個入行一年有餘的新人的一點感悟。
免責申明:
1. 筆者無法保證本文所用詞彙的普適性,能力所限,請多包涵~
2. 不保證文中魔獸世界例項中的設定均與原作完全相符。但即便不相符,也不會影響圓桌理論的推演。