利用MATLAB逆推王者榮耀物抗—免傷率公式

白木辛發表於2020-04-17
我們先來猜測一下王者榮耀的傷害計算公式採用的是什麼形式,以物理傷害為例,如(圖1)和(圖2),后羿物攻176,木頭人物抗400,普通攻擊一次傷害105。可見,並不符合減法傷害計算公式(傷害=物攻-物抗),因此猜測王者榮耀用的是乘法傷害計算公式,傷害=物攻×(1-免傷率)。

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

雖然王者榮耀並沒有向玩家直接展示當前物抗所對應的免傷率,但我們仍然能有辦法得知這一資料,通過傷害公式:

利用MATLAB逆推王者榮耀物抗—免傷率公式

可推匯出:

利用MATLAB逆推王者榮耀物抗—免傷率公式

可見,我們只需要知道被擊方受到的傷害,和攻擊方的物攻,就可以推匯出被擊方當前物抗所帶來的免傷率大小。如(圖3)和(圖4),被擊方后羿的物抗86,攻擊方后羿物攻175,傷害153。

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

通過計算:

利用MATLAB逆推王者榮耀物抗—免傷率公式

可知,86物抗所對應的免傷率為0.1257。

我們需要驗證一下86物抗是否的確對應0.1257的免傷率,可以通過改變攻擊方后羿的物攻的方法來驗證,如(圖5)。可以看到,攻擊方后羿物攻增加到了191,而被擊方后羿的物抗仍是86。根據以上計算到的86物抗對應0.1257的免傷率,我們可以預先算出,被擊方后羿受到的傷害將是:

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

在(圖6)中可以看到,被擊方后羿受到的傷害的確是167。

利用MATLAB逆推王者榮耀物抗—免傷率公式

因此,可以知道,利用此方法計算出來的物抗所對應的免傷率是正確的。我們可以記錄多個物攻、物抗、傷害的資訊,如(圖7)。

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用公式: 利用MATLAB逆推王者榮耀物抗—免傷率公式 ,可以計算出各物抗數值下對應的免傷率。如(圖8)

利用MATLAB逆推王者榮耀物抗—免傷率公式

得到資料後,接下來就可以用MATLAB軟體裡的曲線擬合功能逆推免傷率計算公式了。

1、開啟MATLAB,並匯入Excel中的資料,只需要匯入物抗和免傷率即可

利用MATLAB逆推王者榮耀物抗—免傷率公式

2、以列向量的格式,分別匯入物抗和免傷率

利用MATLAB逆推王者榮耀物抗—免傷率公式

3、修改一下列向量的名字,方便識別

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

4、開啟曲線擬合工具

利用MATLAB逆推王者榮耀物抗—免傷率公式

5、選擇以物抗為x軸資料,免傷率為y軸資料

利用MATLAB逆推王者榮耀物抗—免傷率公式

6、由於物抗屬於開放數值,可以無上限,而免傷率屬於封閉數值,其範圍在0~1之間。在Tools-Axes Limits中調整一下xy軸的最小最大值。

利用MATLAB逆推王者榮耀物抗—免傷率公式

7、這裡可以看到,圖中出現離散的黑色點和一條連續的藍色線,黑色離散的資料點就是我們錄入的資料,而藍色連續的線就是y=f(x)的函式影像,也就是我們所想要逆推的公式的函式影像,我們需要通過使藍色線儘量吻合黑色的資料點,從而推出公式。

利用MATLAB逆推王者榮耀物抗—免傷率公式

8、通過調整MATLAB的逼近方式,可以調整藍色線的形狀

利用MATLAB逆推王者榮耀物抗—免傷率公式

9、經過嘗試後發現,通過選擇有理數逼近,且分子分母中自變數最高次數都為1次方時,曲線最為吻合。

利用MATLAB逆推王者榮耀物抗—免傷率公式

10、Results中可以看到結果。

利用MATLAB逆推王者榮耀物抗—免傷率公式

11、如圖,R-square(確定係數)表示擬合的程度,R-square越接近1,表明擬合程度越高。在這裡可以看到,擬合程度是很高的,基本可以確定這就是我們要找的公式。接下來就可以讀取公式了,可以看到f(x)=(p1*x+p2)/(x+q1)是該公式的基本形式,下面緊接著提供了常數p1,p2,q1的值。得出公式:

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

12、考慮到遊戲設計的公式中的係數不會如此複雜,將各常數近似簡化後,得出如下公式:

利用MATLAB逆推王者榮耀物抗—免傷率公式

即:

利用MATLAB逆推王者榮耀物抗—免傷率公式

13、我們可以在遊戲中驗證一下,可以看到即將捱打的狄仁傑的物抗為779,而即將攻擊的狄仁傑的物攻為228,根據免傷率公式:

利用MATLAB逆推王者榮耀物抗—免傷率公式

可以知道,計算出來的779物抗對應的免傷率應該為0.5665。根據傷害計算公式:

利用MATLAB逆推王者榮耀物抗—免傷率公式

利用MATLAB逆推王者榮耀物抗—免傷率公式

可以知道,計算出來的,捱打的狄仁傑受到的傷害應該是99.

14、我們讓他們打一下看看。可以看到,捱打的狄仁傑受到的傷害的確是99,完全符合上面理論計算出來的傷害值。基本可以確定這就是正確的免傷率計算公式。

利用MATLAB逆推王者榮耀物抗—免傷率公式

15、我們還可以思考一下設計師為什麼要選擇一條這樣的公式。我們很容易就可以想到,免傷率應該是有個範圍的,大小在0到100%之間,假如這個免傷率大於100%,那就是無敵了,因此這是一個封閉的數值,是有上限的,上限為100%,同時,它還不能達到100%,因為達到100%也意味著無敵了。那麼我們可以看一下這條公式的函式影像,當物抗趨於無窮大時,免傷率無限趨近於1,但永遠也無法達到1,符合需求。同時,從函式影像也可以輕易看出,當物抗越大時,免傷率的增長速率越小,意味著當玩家物抗越高時,再購買加物抗的裝備的收益也就越小了。

利用MATLAB逆推王者榮耀物抗—免傷率公式



相關文章