你最好學(xué)學(xué)微積分,它是神的語言——理查德·費曼 我們身處的物理世界是一個不斷變化的系統(tǒng),牛頓、萊布尼茲窺見到了這一點,因此在前人的工作基礎(chǔ)上系統(tǒng)性的提出了微積分。微積分是一種對變化做定量描述的語言,從微積分里得到的微分方程不同于初等代數(shù)方程,它強(qiáng)調(diào)對事物從變化(一階導(dǎo))以及變化的推力(二階導(dǎo))的角度揣摩與端詳。這個角度對游戲數(shù)學(xué)建模,或說數(shù)值策劃的工作大有裨益。我預(yù)備在本文里展示不論戰(zhàn)斗或經(jīng)濟(jì),其工程數(shù)學(xué)的方法論主要是微分方程的,而且對任意游戲類型有效。就不同游戲類型而言,微分方程的形式不一定相同,但它告訴我們從變化和變化的推力角度看待問題是多么的簡潔、有效、統(tǒng)一。為達(dá)到這個目的,我對自己提出了如下要求: 1)風(fēng)格方面的,延續(xù)《游戲數(shù)學(xué)建模工程手冊》的工程數(shù)學(xué)闡釋方式,從而免去不專業(yè)的爭論。 2)實踐方面的,用微分方程假想建模兩個截然不同的游戲類型:魔獸世界(WOW)和皇室戰(zhàn)爭(CR)。這兩張模擬建模表可以在巴比倫人的數(shù)值策劃Q群下載:813299364。 我之所以選擇這兩個游戲類型是因為: 1)對WOW的,微分方程告訴我們,武器、技能本質(zhì)上是同一個東西。忽略公共CD時,瞬發(fā)技能和雙持武器完全等價,一個職業(yè)的瞬發(fā)技能數(shù)量越多相當(dāng)于持有和同時可發(fā)起攻擊的武器數(shù)量變多。 2)對WOW的,任意倆倆職業(yè)平衡在微分方程角度不過是改變了積分區(qū)域,這個積分區(qū)域是時間。 3)對CR的,圣水費用是離散的,即便對離散建模,微分方程仍然有效。 4)對CR的,卡牌克制、賺費(指比對手節(jié)約的圣水費用)是不平衡的另一種稱呼,微分方程告訴了我們?nèi)绾纹胶?,那么我們就可以量化和控制不平衡的程度,或說如何互相克制。 5)對CR的,累積傷害量是時間和圣水費用的二元函數(shù),微分方程角度將自然而然導(dǎo)出偏微分方程和高階導(dǎo)數(shù)的現(xiàn)實意義。 6)WOW和CR是2個截然不同的游戲類型,微分方程的視角建模仍然暢通無阻,體現(xiàn)了不論怎樣的游戲類型都不會妨礙使用微分方程。 基礎(chǔ)推導(dǎo) 傳統(tǒng)或說前微分方程的游戲數(shù)學(xué)建模往往思考的是:“我該在這個系統(tǒng)模塊投放多少屬性、產(chǎn)出值?對某個系統(tǒng)的數(shù)學(xué)模型,我如何拼湊出初等代數(shù)方程?”現(xiàn)在,我們要放棄這種思考方式,而是問:“我該在這個系統(tǒng)模塊投放多少屬性、產(chǎn)出的一階導(dǎo)?當(dāng)轉(zhuǎn)化為屬性值時,一階導(dǎo)對誰積分?對某個系統(tǒng)的規(guī)則進(jìn)行數(shù)學(xué)建模時,各個影響來源如何用變化的推力(一階導(dǎo)的導(dǎo)數(shù))、推力的貢獻(xiàn)(二階導(dǎo)的導(dǎo)數(shù))來看待?” 改變后的思考方式讓我們立即回憶起一個廣為人知的一階導(dǎo):每秒傷害。每秒傷害顯然是累積傷害量或總傷害量關(guān)于時間的一階導(dǎo)。接下來,必須有一個單位承受這個每秒傷害,否則它毫無意義。這個單位承受時付出的代價是生命,生命損失既然來自每秒傷害,于是損失也和時間有關(guān),即: H為剩余生命值,dH是生命的每秒損失,D為總傷害量,dD即每秒傷害。整理為: 這便給出了本文的第一個微分方程模型,它告訴我們,戰(zhàn)斗如果是平衡的,那么我的剩余生命流逝速度要等于你總傷害的累積速度,用積分形式表達(dá)就是: t為戰(zhàn)斗時間。戰(zhàn)斗平衡的積分形式給了我們一個提示:如果戰(zhàn)斗平衡,則必然雙方的積分區(qū)域t是相同的。t的取值范圍顯然大于0小于無窮,這說明你再去和另一個角色戰(zhàn)斗,這個角色有著不同的剩余生命和每秒傷害,只要改變t的取值且相等,那么仍然是平衡的。也就是滿足如下微分方程: α表示角色a的傷害偏移系數(shù),它線性的縮放dD,β表示b單位的傷害偏移系數(shù)。也就是說只需要知道a和b角色的傷害偏移,就知道雙方的戰(zhàn)斗時間縮放到了沒有任何偏移時的t的多少倍。原因是: 我們有: 于是: 上述推導(dǎo)過程隱含了一個假設(shè): 即總傷害量的一階導(dǎo)是一個常數(shù)。這是個不過分的假設(shè),它滿足工程師原則,也就是面對復(fù)雜系統(tǒng)時優(yōu)先選擇線性。 上圖為WOW的模擬建模,我已將需要注意的單元格加粗標(biāo)紅。最小最大容忍秒是說,既然倆倆職業(yè)任意平衡改變的不過是積分區(qū)域,那么職業(yè)之間的戰(zhàn)斗時間不要太小也不要太大,太小了玩家沒操作幾下、沒打出幾次技能就結(jié)束,太大了枯燥乏味。傷害微元即隱含的那個假設(shè),每秒傷害是一個常數(shù)。 但是,職業(yè)們的傷害能力和生命來源自多個模塊,如自身等級、武器與裝備。在WOW里,武器和裝備并不是每個職業(yè)單獨有的,如皮甲是獵人、盜賊與德魯伊共同使用,所以皮甲提供的傷害能力、生命應(yīng)該取這3個職業(yè)的哪一個偏移值?不論取哪一個,另2個職業(yè)必然沒有得到職業(yè)平衡要求的正確偏移。很容易想到,這2個職業(yè)的實際偏移是每個模塊的偏移與模塊占總值的比例,即加權(quán)平均: i表示一個具體職業(yè),向量a的每個分量表示某個模塊的傷害或生命偏移值,向量w的每個分量表示某個模塊給的傷害或生命占總模塊的比例。 在武器上,德魯伊、術(shù)士、牧師都使用法杖,武器戰(zhàn)士與圣騎士均使用雙手劍;在裝備上,德魯伊、獵人、盜賊都穿戴皮甲,武器戰(zhàn)士與圣騎士則穿戴鎖甲。為最小化偏移誤差,武器與裝備的偏移模塊可取這些職業(yè)偏移值的中位數(shù),中位數(shù)在統(tǒng)計建模里是穩(wěn)健的,均值容易受離群值影響是不穩(wěn)健的。 武器與技能 一個職業(yè)為讓每秒傷害打出去必須具備攻擊行為。在WOW里,這些行為有:赤手空拳、武器、技能。有這么多攻擊行為且與每秒傷害有關(guān),自然引出了一個問題:這些攻擊行為是在同一時間發(fā)生的嗎?如果同一時間發(fā)生,則每秒傷害顯然的線性疊加,否則只生效其中一個。對武器而言,攻速影響它何時生效,但對技能而言分為若干情況: 1)這個技能需要施法時間(術(shù)士的暗影箭)、引導(dǎo)時間(法師的奧術(shù)飛彈),則每秒傷害唯一的來自該技能,因為施法與引導(dǎo)時不可使用武器或其他技能。 2)這個技能生效時機(jī)是下一次普通攻擊時(德魯伊的重毆),即將產(chǎn)生的每秒傷害唯一的來自該技能,武器的普通攻擊行為與傷害被阻止。 3)這個技能有CD且瞬發(fā)傷害(薩滿的烈焰震擊),該技能的施放時間趨近于0,在極限上可視為不影響武器或其他技能。 4)這個技能沒有CD且瞬發(fā),但傷害是延遲的(牧師的暗言術(shù):痛),則該技能相當(dāng)于自動按時間間隔傷害敵人,與武器的自動攻擊等價。但是這個技能擅長對付多個敵人,因為它憑空創(chuàng)造出多把自動攻擊的武器。 5)這個技能沒有CD、瞬發(fā)、需引導(dǎo)但傷害是延遲的(法師的暴風(fēng)雪),則等同于第1種情況。 所以,針對上述不同情況,我們只需要將技能的每秒傷害加上被阻止的攻擊行為的每秒傷害,對瞬發(fā)技能則減去不被阻止的攻擊行為的每秒傷害,然后除以瞬發(fā)傷害技能的總數(shù)。 公共CD影響打出下一個技能的間隔,如果技能提前取消,公共CD會立即取消。公共CD的存在避免了玩家?guī)缀跬粫r間連續(xù)打出多個瞬發(fā)傷害技能,這會影響瞬發(fā)技能的每秒傷害,瞬發(fā)技能的實際每秒傷害將是: 因為n個瞬發(fā)技能,有n-1次公共CD將這些技能隔開,于是這些技能的每秒傷害有n-1次公共CD的時間損失。 皇室戰(zhàn)爭的偏微分方程模型 現(xiàn)在我們進(jìn)入皇室戰(zhàn)爭的模擬建模討論,很快發(fā)現(xiàn)我們面臨如下問題: 1)圣水費用越高,卡牌必須越強(qiáng),但不能等價。意思是2個1費的不能和1個2費的一樣強(qiáng),而是必須比2個1費的強(qiáng),否則誰還使用高費卡呢? 2)卡牌之間有克制關(guān)系、賺費概念。 謹(jǐn)記微分方程的思考范式:“從變化、變化與更多的變化考慮問題”。先清晰我們的目標(biāo):圣水費用越多,卡牌的什么越強(qiáng)?一個合理的回答是:每秒傷害越強(qiáng)。那么,什么叫越強(qiáng)?是圣水費用對每秒傷害這個一階導(dǎo)存在著正向推力,數(shù)學(xué)描述為: 也就是每秒傷害關(guān)于圣水費用W的變化率。這自然的引入了變量W,自然的導(dǎo)出了一個偏微分方程,其正式書寫格式為: 這稱二階混合偏導(dǎo)數(shù),這個表達(dá)式很符合我們的定性描述:“圣水費用越多,卡牌的每秒傷害越強(qiáng)”。因為二階混合偏導(dǎo)數(shù)其幾何意義是t不再繼續(xù)變動,僅考察W方向上的t對總傷害量的貢獻(xiàn)情況。從另一個角度也可以明白為什么必須是一個二階混合偏導(dǎo)數(shù),我們已經(jīng)假設(shè)每秒傷害是常數(shù),于是每秒傷害關(guān)于t不再有高階導(dǎo)存在,或說高階導(dǎo)為0,所以我們想要影響每秒傷害只能引入其他變量,這必然使得總傷害量是一個與時間t、圣水費用W有關(guān)的二元函數(shù)D(t,W)。 “圣水費用越多,卡牌的每秒傷害越強(qiáng)”這個定性描述不夠精細(xì),確切的說: 1)圣水費用增多,總是增多每秒傷害,不會逆轉(zhuǎn)也不會在一個閾值后恒為0。 2)但增多的量不能太劇烈,哪怕與牛頓的加速度公式一樣是個與時間有關(guān)的線性微分方程都不可取,因為肯定導(dǎo)致指數(shù)級增長。在物理世界里,速度有光速做上限,在游戲里可沒有。 所以什么叫“不能太劇烈”?對微積分而言不就是在說這個嗎? 結(jié)合不能是線性增長,立刻想到函數(shù)表達(dá)式為: W越大,在極限上趨于0。一次積分: 已知t的高階導(dǎo)都是0,所以f(t)為0。再次積分: C為積分常數(shù)。不過我們最好有個用于正比的參數(shù): 即每秒傷害的變化與圣水費用的對數(shù)值成正比。最終,每秒傷害在不同費用時的計算公式為: 如圖所示,其中α根據(jù)最大圣水費用的每秒傷害限制求得。圖中的出現(xiàn)“克制關(guān)系”就是不平衡,即某個職業(yè)、某類卡牌類型比別的職業(yè)、卡牌類型更強(qiáng)。對于刻意制造的不平衡,需分情況討論: WOW的職業(yè)克制、CR的克制建筑,只能引入新的屬性類型,否則不可能循環(huán)克制,因為數(shù)字的大小關(guān)系是傳遞性的。因此WOW有護(hù)甲(不對法術(shù)傷害生效)、CR有對建筑殺傷。這類克制關(guān)系容易做,只需要新屬性線性影響每秒傷害即可——這體現(xiàn)在圖中多單位對建筑殺傷系數(shù)小于1,單個單位對建筑殺傷系數(shù)等于1。 2)dH dt = -dD dt的微分方程模型已經(jīng)告訴我們,任意倆倆單位平衡只改變了積分區(qū)域t,但t必須相等。所以不平衡就可以讓t有一個差額從而不相等,不相等時,要么伱的dD、H放大,要么他的H、dD縮小。 上圖中,在平衡破壞里我選擇了僅偏移傷害,也可選擇生命傷害一起偏移,偏移相乘后的值仍等于1.4即可?!百嵸M”的概念在同樣的基礎(chǔ)上被計算出,1張5費的卡比5/4張4費的卡花費了相同的5個圣水,但1張5費卡仍然比5/4張4費卡強(qiáng)1.8倍,則5費單位還擁有44.4%的生命,由1-1/1.8=0.444算出(計算原理請翻閱《游戲數(shù)學(xué)建模工程手冊》),于是5費的卡還有44%的費用剩余,即0.444*5=2.22。 隱含假設(shè)存在的問題及微分方程改進(jìn) 前文明確指出每秒傷害為常數(shù)是一個隱含的假設(shè),意思是,我們在有意無意的持有這個假設(shè),這表現(xiàn)在這些情況中: 1)計算標(biāo)準(zhǔn)時長時,我們用生命除以每秒傷害。 2)在考慮武器攻速越慢,每次傷害越高時,我們用攻速乘以每秒傷害。 3)在考慮一個技能施法時間過長,CD過長時,我們用這個時間乘以每秒傷害。 4)在某些文章里,讓生命乘以傷害能力,計算所謂的能力函數(shù)、戰(zhàn)斗力時。 上述一切操作都隱含了一階導(dǎo)為常數(shù)的假設(shè)。然而這個假設(shè)是有適用范圍的,如果武器攻速、技能CD、施法時間、持續(xù)掉血的持續(xù)時間對于標(biāo)準(zhǔn)戰(zhàn)斗時間(尤其是最小容忍秒)占比不算高時,它是沒有問題的,當(dāng)占比較高時,則會一次性造成對方50%-80%的生命損失。想象下,標(biāo)準(zhǔn)戰(zhàn)斗時間也就5秒,可卻有3秒攻速的雙手斧,當(dāng)雙手斧砍下去,豈不是第一次就造成3/5=60%對方的生命損失?技能CD、施法時間同理。這對每秒傷害的改進(jìn)提出了如下要求: 1)攻速、CD、持續(xù)掉血技能的持續(xù)時間占戰(zhàn)斗時間比例較低時,每秒傷害是一個常數(shù) 2)當(dāng)占比較高時,分情況討論: ——如果是武器和瞬發(fā)技能,那么占比越高,則每秒傷害下降。因為瞬發(fā)更有優(yōu)勢,提前享受到打出去的傷害進(jìn)而立即獲益。 ——如果技能需要施法時間、引導(dǎo)時間,那么占比越高,每秒傷害上升。因為它可能被打斷、目標(biāo)超出距離而被浪費掉,對人性來說,也希望延后越久才造成的傷害,給予更多的“利息”。 ——如果是瞬發(fā)技能但按時間間隔造成傷害(暗言術(shù):痛),那么占比越高,則每秒傷害下降。因為它憑空創(chuàng)造出多個自動攻擊的武器,讓多個敵人承受這些傷害,角色的其他攻擊行為幾乎不被影響。 微分方程的思維再次幫助了我們,時間越長,每秒傷害越高/越低,說明對t的二階導(dǎo)存在: 對于占比低時為常數(shù),高時每秒傷害下降的規(guī)律,我給出的二階微分方程為: 對于占比高時每秒傷害上升的規(guī)律: 其中C是常數(shù)下的每秒傷害,γ為速率調(diào)節(jié)參數(shù),它們的圖像如下: 即一開始非常貼近1之后下降或上升。雙曲函數(shù)的優(yōu)良形式、圖像如此的符合游戲數(shù)學(xué)建模的需要是多么讓人驚訝的事情,我在《微分方程在游戲經(jīng)濟(jì)建模的應(yīng)用》里也使用到了雙曲正切函數(shù)。 應(yīng)用該模型需先定量定義什么叫時間占比太高、太低,我對此的定義是:希望攻速、CD、施法時間在3.5秒時恰好幾乎等于每秒常數(shù),從3.5秒之后變化。理論計算如下圖。 可以看到4秒開始,雙曲正割只有98%的每秒傷害,時間很大時,如滿打滿算25秒,只有59%的每秒傷害,也就是一個25秒CD的瞬發(fā)技能或武器,它一次性造成對方59%生命的損失。比對最開始的WOW模擬建模里的技能計算結(jié)果到底有多好,如下圖所示。 改進(jìn)后的長CD的神圣烈焰被明顯削弱,比之更長持續(xù)時間掉血的鎖喉則壓縮得更加厲害,施法時間太長的暗影箭則被補償了傷害,改進(jìn)后微分方程模型計算結(jié)果顯然比改進(jìn)前更為合理。 結(jié)語 正如《微積分的力量》一書里所說:“微積分?jǐn)U展了我們描述這個世界的能力”。這個能力就是賦予我們并強(qiáng)調(diào)從事物的變化、推動力的角度看待問題,然后用微分方程的形式寫出它們,再積分逆運算找到描述事物的函數(shù)表達(dá)式。許多人未能領(lǐng)會微積分的威力與強(qiáng)大,因為他們很少主動的從變化的角度看待問題,更不用說從更高階的變化看待問題了,希望本文能夠為游戲數(shù)學(xué)建模的系統(tǒng)性工程數(shù)學(xué)方法做出微不足道的貢獻(xiàn),給予許許多多數(shù)值策劃工作者一絲螢火蟲的光亮。 |
|