《缺氧》DLC1中新增的生物甜素甲蟲(chóng)有著變異機(jī)制,那么變異的幾率是如何設(shè)定的呢,想要了解的玩家請(qǐng)看下面“234xdd”帶來(lái)的《缺氧》DLC1甜素甲蟲(chóng)變異機(jī)制解析,希望能夠幫助大家。
簡(jiǎn)化版總結(jié)
太長(zhǎng)不看版,甜素甲蟲(chóng)產(chǎn)蟲(chóng)果果蟲(chóng)卵的概率為隨照料蟲(chóng)果類植物的次數(shù)增加而增加,直至趨近于100%,而甜素甲蟲(chóng)每周期可以照料7棵左右的作物。
因此,大約可以在全效照
料4周期以后達(dá)到50%,7周期后達(dá)到70%,10周期后達(dá)到80%。如適用蟲(chóng)果果蟲(chóng)產(chǎn)卵,猜測(cè)除初始值變更為33%以外變異機(jī)制與甜素甲蟲(chóng)一致。
理論計(jì)算公式在概率不足98%時(shí)為a_n = 1 - (1 - a_0)*(1 + x)^(-n),超過(guò)98%時(shí)增長(zhǎng)會(huì)更慢。其中n表示照料蟲(chóng)果類植物的次數(shù),a表示產(chǎn)下果蟲(chóng)卵的概率,a_0表示初始概率2%。x表示變異率2.5%。
代碼分析
首先找到甜素甲蟲(chóng)的文件 DivergentBeetleConfig。
找到 EntityTemplates.ExtendEntityToFertileCreature()(這一行定義了動(dòng)物的生殖行為,所以海牛和章魚(yú)應(yīng)該時(shí)沒(méi)這一行的)。
找到其中定義產(chǎn)卵概率的參數(shù) DivergentTuning.EGG_CHANCES_BEETLE,所以我們轉(zhuǎn)戰(zhàn) DivergentTuning 文件。
其實(shí)到這里乍一看就無(wú)計(jì)可施了,因?yàn)?EGG_CHANCES_BEETLE 只定義了 0.02 和 0.98 兩個(gè)數(shù)字,對(duì)應(yīng)甜素甲蟲(chóng)初始狀態(tài)下產(chǎn)出兩種卵的概率。
好在仔細(xì)一看,這個(gè)文件中還有一個(gè)似乎和產(chǎn)卵概率相關(guān)的變量有定義 TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION 為 2,直譯為“進(jìn)化所需的每周期照料次數(shù)”。
搜索 TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION 在代碼文件中的引用,發(fā)現(xiàn)在 TUNING.CREATURES.EGG_CHANCE_MODIFIERS 文件中的 CreateCropTendedModifier 有用到。 CreateCropTendedModifier 的第一個(gè)參數(shù)為蟲(chóng)果果蟲(chóng)id,第二個(gè)為蟲(chóng)果果蟲(chóng)卵id,第三個(gè)為兩種能提供變異的植物((貧瘠)蟲(chóng)果植株),第四個(gè)參數(shù)即是0.05除以TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION (得0.025)。那么我門(mén)接下來(lái)分析 CreateCropTendedModifier 的邏輯。
可以看到,在 CreateFertilityModifier 的最后一個(gè)變量 applyFunction 中,回調(diào)的輸入被轉(zhuǎn)換為 CropTendingStates.CropTendingEventData 植物照料事件數(shù)據(jù),它其中便有被照料的植物id -- corpID。代碼邏輯為,如果被照料的植物是之前定義的幾種植物((貧瘠)蟲(chóng)果植株)中的一種,那就調(diào)用 inst.AddBreedingChance(eggType, modifierPerEvent) 函數(shù)調(diào)整變異概率,其中eggType是回調(diào)函數(shù)的輸入值,盲猜是蟲(chóng)果果蟲(chóng)卵的id,modifierPerEvent 正式之前算出的第四個(gè)參數(shù) 0.025。
現(xiàn)在來(lái)看 AddBreedingChance,簡(jiǎn)化的代碼為 chance.weight += Min(1 - chance.weight, Max(0f - chance.weight, 0.025)),套用到蟲(chóng)果果蟲(chóng)的例子中用人話說(shuō)就是,蟲(chóng)果果蟲(chóng)卵當(dāng)前的權(quán)重加上0.025,再把它限制到0到1的范圍之內(nèi)。注意后面還有一行NormalizeBreedingChances(),作用就是等比縮放所有的蛋的概率使得它們的和為1。
公式推導(dǎo)
本段涉及到最多到高中的數(shù)學(xué)知識(shí)
符號(hào)定義:
a 產(chǎn)出蟲(chóng)果果蟲(chóng)卵的概率,用0到1之間的小數(shù)表示。
x 每次照料增加的概率系數(shù),為0.025
n 照料蟲(chóng)果系植株的次數(shù),為自然數(shù)。
這樣,a_0就是初始狀態(tài)下甜素甲蟲(chóng)產(chǎn)下蟲(chóng)果果蟲(chóng)卵的概率0.02(2%),a_n就是照料過(guò)n次蟲(chóng)果系植株以后的甜素甲蟲(chóng)產(chǎn)下蟲(chóng)果果蟲(chóng)卵的概率。
根據(jù)代碼中的邏輯,現(xiàn)在可以得到蟲(chóng)果果蟲(chóng)卵概率的遞推公式:
當(dāng)a_{n-1} 小于等于 0.975時(shí),a_n = (a_{n-1} + x) / ((a_{n-1} + x) + (1 - a_{n-1})) = (a_{n-1} + x) / (1 + x)
當(dāng)a_{n-1} 大于 0.975 時(shí),a_n = 1 / (1 + (1 - a_{n-1} )) = 1 / (2 - a_{n-1})
根據(jù)高中的通過(guò)遞推公式求通項(xiàng)公式的知識(shí)(我自己忘得差不多了所以去某乎復(fù)習(xí)了一下),易得(等式兩邊同時(shí)減 1 即為等比數(shù)列)
當(dāng)a_{n-1} 小于等于 0.975時(shí),a_n = 1 - (1 - a_0) * (1 + x)^(-n)
根據(jù)(excel)計(jì)算,n 最大為 149 (即第一個(gè)超過(guò) 0.975 的 a_n 對(duì)應(yīng)的 n)
那么當(dāng) n 大于 149 時(shí),通項(xiàng)公式為(等式兩邊同時(shí)減 1 再取倒數(shù)即為等差數(shù)列)
a_n = 1 + 1/(1/(a_{149}-1) - n + 149)
結(jié)論驗(yàn)證
數(shù)據(jù)
其中"觀察值"為(1 - "原始觀察值"/100)。"理論值近似"為"理論值"四舍五入后的百分率表示方法。
圖表
可以看到觀察值與理論值分毫不差。
結(jié)論驗(yàn)證
數(shù)據(jù)
其中"理論值近似"為"理論值"四舍五入后的百分率表示方法。
圖表
可以看到理論值和實(shí)際值有一定誤差。推測(cè)誤差有兩方面,一是也許每周期照料作物棵數(shù)不是恰好為7,二是單精度浮點(diǎn)數(shù)計(jì)算上的誤差。
總結(jié)
目前看來(lái)論證公式能很好得解釋游戲中的現(xiàn)象。根據(jù)相似的代碼查找方法,可以推測(cè)如果用蟲(chóng)果果蟲(chóng)產(chǎn)卵,除初始值變更為33%以外變異機(jī)制與甜素甲蟲(chóng)一致。對(duì)于別的小動(dòng)物的變異機(jī)制,理論上應(yīng)該也能通過(guò)分析TUNING.CREATURES.EGG_CHANCE_MODIFIERS 文件來(lái)得到確切的邏輯。
更多相關(guān)內(nèi)容請(qǐng)關(guān)注:缺氧專區(qū)
全部評(píng)論