柴游傷害測試的實驗方法
前言
各位好,這里是面粉敵對。
兩年半以前,敵對做了一個粗糙的火柴人攻略,在那里有說一些槍械、空手以及扔槍的傷害,在之后的攻略中也多次提到一些結(jié)論是由這些數(shù)據(jù)得來的。
關于這些數(shù)據(jù)的由來,敵對好像之前有寫過一篇專欄,又好像沒有。
今天看到有評論提到這一點,就說一下吧。
初始信息的獲得
原問題是這樣的:
“我很好奇up主是怎么知道大約傷害呢,游戲里沒有顯示扣的血量,只知道打人正常5拳就打死了,為什么空手不是20是22很好奇?!?/p>
是的,通過5拳能打死人我們只能得到以下兩個信息:
5拳能打死,所以傷害大于等于20。
4拳打不死,所以傷害小于25。
?
但這僅僅是正常100HP下的結(jié)論,如果設置為300HP,你會發(fā)現(xiàn)需要14拳才能打死,同樣,我們得到了兩個信息。
14拳能打死,所以傷害大于等于21.43
13拳打不死,所以傷害小于23.08
這樣我們就將范圍縮小了,但仍然不能得到一個確定的值。
從開發(fā)者的角度來說,將傷害數(shù)據(jù)設置成一個很復雜的數(shù)顯然不是一件明智的事,因此這里提出了一項假定。
假定:傷害為整數(shù)。
在接受了整數(shù)假定之后,空手出拳的傷害就縮小到了22和23兩個整數(shù)了,但仍然不能確定是哪一個,我們還需要進一步測試。
既然測不出空手的傷害,那其他的呢?能不能先測出一個?
相信你已經(jīng)發(fā)現(xiàn)了,在空手這種中等傷害的攻擊下,最終被鎖定范圍在300/14到300/13之間,那如果是更低傷害的攻擊方式,那這個范圍的長度就更小了,再結(jié)合整數(shù)的假定,我們就能得到第一個確切的數(shù)據(jù)了。
于是第一個有確切傷害的數(shù)據(jù)被測試出來了——UZI,300HP下22發(fā)子彈能擊殺敵人,傷害為14。
?縮小范圍
接下來就是這項測試的關鍵了,我們該如何利用已經(jīng)得到在整數(shù)假設下?lián)碛写_切傷害數(shù)據(jù)的武器去得到其他中等甚至是高傷害的武器傷害呢?
我們再來回顧一下空手傷害數(shù)據(jù)的測試:在空手的攻擊下,傷害范圍最終被鎖定在300/14到300/13之間。
要如何縮小這個區(qū)間呢?
300已經(jīng)是最高HP了,換句話說21.43到23.08這個區(qū)間的長度,已經(jīng)是HP/13-HP/14中的最小值了。
但這僅僅是Min(HP/(次數(shù)-1)-HP/次數(shù)),而我們最終要得到的,是Min(HP/(次數(shù)-1))-Max(HP/次數(shù))。是的,通過改變HP,我們能夠刷新范圍上下限,最終從所有下限中找到最大那個,從所有上限中找到最小那個,從而達到范圍的縮小。
而如何改變HP,答案已經(jīng)呼之欲出了——利用已經(jīng)測出傷害的武器。譬如要測試空手,我們只需要在用空手攻擊工具人之前,用UZI給他來上幾槍,這樣就能改變HP。
像UZI這樣的已知整數(shù)假定下的確切傷害的,我們稱之為“探針武器”,通過探針改變初始HP,就能對傷害范圍進行縮小。
HP雖然減少了,但相應的,最終擊殺工具人所需的攻擊次數(shù)也在減少。
這里將擊殺所需次數(shù)記為X,那么傷害H=Min(HP/(x-1))-Max(HP/x).
而HP=300-a1*n1-a2*n2-a3*n3……
此處a1等為使用的探針武器的傷害,n1等為使用的探針武器的次數(shù)。
?探針使用次數(shù)的確定
那么問題又來了,這里的n到底要取多少呢?具體到空手傷害的測定,就是“給工具人打拳之前,我要用uzi射他幾次呢?”。
如果每一次的HP都是憑感覺得到的,新得到的區(qū)間就不一定能夠縮小范圍,也就是“無效測試”。為了避免測試次數(shù)過多,我們需要找到一個穩(wěn)定的測試方法,即得到一個好的n。
要想得到一個合理的n,我們就得知道加入探針之后的測試到底是做了一件怎樣的事。
探針使得HP減少,因此我們一次測試得到的結(jié)果——擊殺工具人所需攻擊次數(shù)X是不可能大于最初的X的。
那么對于單個探針的測試,將n從1開始羅列,我們會發(fā)現(xiàn)一件事。
以空手傷害的測試為例,n=1,a=14,HP=286.
我們期望得到的X有可能是多少?
從先前無探針的結(jié)果已知空手傷害的粗略上下限。
可能的X必須滿足,(X-1)*(下限)<=HP<=X*(上限)
因此當n=1,X可以取14、13。
當n=2,HP=272,X可以取13、12。
當n=3,HP=258,X只能取12。
……
對每個n,我們對其帶來的效果進行評估。
對于n=1,若X為14,則區(qū)間為20.43-22,降低了上限。若為13,則區(qū)間為22-23.83,下限并沒有提高。這是因為最初的范圍經(jīng)過整數(shù)假定修改為了22-23.
對于n=2,若X為13,則區(qū)間為20.92-22.67,降低了上限。若為12,則區(qū)間為22.67-24.72。提高了下限
對于n=3,X只能為12,區(qū)間為21.5-23.45,上下限都沒有縮小,排除。(我不用實驗都能推測出X只能取一個值了,還可能縮小范圍嗎?)
我們可以選擇從n=1開始,尋找第一個可能滿足縮小范圍的n,(或者設置為先尋找一個無論X取多少都能縮小范圍的n,找不到就選可能縮小范圍的n中數(shù)值最小那個)只要滿足了,就用這個n進行試驗。得到的結(jié)果用于生成新的范圍,再將新的范圍設為選取新n的標準,就能保證每次都在縮小范圍,直到范圍內(nèi)的整數(shù)只有一個或者無法縮小范圍。
這就是n選取的方法,這個過程可以用一些簡單的編程實現(xiàn),實驗時我們只用更新傷害的范圍,然后讓程序告訴我們有效的n。
一些別的
雖然用到了一些簡單的C,但整體還是屬于實驗方法,獲得的數(shù)據(jù)用來解釋現(xiàn)象是足夠的,但精確性就是另一個問題了。敵對測試傷害那個時候還沒有發(fā)現(xiàn)什么解包啊顯示HP之類的高科技。后來那些方法也有人測了下,得到的結(jié)果應該比敵對更加精確,一些數(shù)據(jù)也得到了互相印證,據(jù)說有些傷害是帶0.5的,但敵對的數(shù)據(jù)用來解釋現(xiàn)象已經(jīng)完全足夠了。
敵對的這套方法包括當時寫的小程序都是兩年多以前的了,而且沒寫注釋(已經(jīng)看不懂了,噔噔咚),當時怎么想的現(xiàn)在只能說是復原一下,肯定有區(qū)別,并且當時后面測試大傷害武器的時候用了新的探針武器,又或者是幾個探針一起上,估計還有一些紕漏什么的。
當時測完大概半年之后,又用這個方法測了下BOSS傷害,然后發(fā)現(xiàn)了BOSS的秘密(大小球傷害變化之類的),于是拉著劍楊試驗了好久單挑BOSS方法,最終總結(jié)出來了一些心得,還對每個BOSS的弱點進行了評估,然而我咕了。