砸率計(jì)算器
注意:此工具除了測(cè)試砸率,還可以測(cè)試炮傷、刷新意外率、跳跳等。
詳見(jiàn)此。
太長(zhǎng)不看:
直接戳?https://marketplace.visualstudio.com/items?itemName=Crescendo.seml

什么是砸率計(jì)算?
如某不知名專欄中所述,砸率主要有以下幾種(樸素砸率就別提了):
1級(jí):極端值零砸率——最快的巨人不會(huì)砸
2級(jí):個(gè)體零砸率——考慮單個(gè)巨人,不論出生點(diǎn)和途中速度如何,都不可能砸
3級(jí):群體零砸率——考慮(無(wú)窮)多個(gè)巨人,不論出生點(diǎn)和途中速度如何,都不可能砸
雖是2年多前的定義,但放到今天也還算好用。
對(duì)于極端值砸率,直接使用速度計(jì)算器即可,還不會(huì)的可以戳藍(lán)鏈學(xué)習(xí)。
絕大多數(shù)墊材存活充分時(shí)間的情況下,極端值砸率是【夠用】的。但在一些場(chǎng)合,如墊材需提前鏟的,或是施墊時(shí)機(jī)過(guò)于詭異的,就可能存在【沒(méi)被墊到的巨人】反而成為最大威脅的情況。這也就是神秘的【群體砸率】了,也是砸率計(jì)算器著重解決的。

快速使用
Talk is cheap, show me how to use.
首先下載并安裝 VSCode(教程略)。然后進(jìn)入插件頁(yè),搜索“seml”并下載:

新建任意 “.seml”后綴的文件名,輸入以下內(nèi)容:
然后 Ctrl + Shift + P 呼出 VSCode 命令菜單,鍵入“測(cè)試砸率”后回車即可。

測(cè)試結(jié)果
其實(shí)測(cè)試結(jié)果是很好懂的,但這里還是解說(shuō)一下。
點(diǎn)開(kāi)生成的 .csv 文件:

上面的表是摘要:

一目了然,就是每波每路炮的砸率。注意所有砸率都指【單波砸率】,也就是每有5只紅眼,某炮被砸的概率。以PDc為例,在每波5只紅眼的出怪下,每波有~5%的砸率,每門炮有~1.25%的砸率。
之所以這樣計(jì)算砸率,是為了和炮傷的計(jì)算方式保持一致。
下面的表是詳細(xì):

紅框部分是玩家側(cè)的操作。HIT 代表紅眼受到此操作影響(被炮炸到,或被墊墊到),MISS代表未受影響??瞻状砑t眼尚未出生,或已死亡。
以砸率最高的這一行為例:

可以看到,這些(3303只)紅眼的共同特點(diǎn)是被第一波墊材墊到,但未被第二波墊材墊到,必定砸炮。這也符合常識(shí),因?yàn)镻Dc的砸率來(lái)源就是快速紅眼在第二波下墊前就對(duì)炮舉錘。

話說(shuō) Seml 是什么?
Seml 的全稱是 Survival Endless Markup Language,是專為描述 SE 操作定制的標(biāo)記語(yǔ)言。
它的語(yǔ)法結(jié)構(gòu)是很簡(jiǎn)單的(從上面的例子就能看到),具體細(xì)節(jié)請(qǐng)參考?https://marketplace.visualstudio.com/items?itemName=Crescendo.seml.
PS:Seml 插件有語(yǔ)法高亮,且若格式錯(cuò)誤則執(zhí)行“測(cè)試砸率”命令時(shí)會(huì)有提示,所以不用擔(dān)心“語(yǔ)法沒(méi)搞懂寫錯(cuò)了怎么辦”之類的問(wèn)題。

我想知道原理
對(duì)寫程序沒(méi)興趣的同學(xué)可以叉叉了,后面都是純技術(shù)討論的部分。(
以上面給出的數(shù)據(jù)為例,總共測(cè)試了 999000 只紅眼,耗時(shí)是多少呢?
答案是:耗時(shí) 12.98?秒, 使用了 32 個(gè)線程.
如果使用常規(guī) AvZ 跳幀,由于游戲限制每波最多 50 只紅眼,每次選卡就是 50*20 = 1000 只,要測(cè) 991 次選卡才行。一次選卡算它 3s 好了,那么就是要 991*3 = 2973s,即使 10 開(kāi)(開(kāi) 10 個(gè) PvZ 進(jìn)程)也要 297.3s,這還沒(méi)算上 10 開(kāi)其實(shí)并不是簡(jiǎn)單的效率*10,而是會(huì)有折扣。
換句話說(shuō),砸率計(jì)算器的運(yùn)行效率是 AvZ 跳幀的 ~100倍左右,拉開(kāi)了 2 個(gè)數(shù)量級(jí)的差距。
這是怎么做到的?這就要感謝二代技術(shù)黨 testla 在 2020 年編寫的 PvZ-Emulator (https://github.com/dnartz/PvZ-Emulator)。他通過(guò) IDA 反編譯 PvZ,復(fù)寫了游戲里與 SE 相關(guān)的所有邏輯,作為可調(diào)用的 C++ 靜態(tài)庫(kù)。由于免去了所有和更新游戲數(shù)據(jù)無(wú)關(guān)的內(nèi)容,其運(yùn)行效率比所有基于 PvZ 原版的測(cè)試框架都要快許多。砸率計(jì)算器便是基于此實(shí)現(xiàn)的。
據(jù)他本人說(shuō)他當(dāng)年是用這個(gè)訓(xùn)練無(wú)炮的,也就是真·智能無(wú)炮,在基本不設(shè)定規(guī)則的情況下讓模型自行學(xué)習(xí)打無(wú)炮的最佳方式(這也是當(dāng)年智能無(wú)炮的設(shè)想,而不是現(xiàn)在常見(jiàn)的“鍵控”無(wú)炮),不過(guò)這就是另一件事了,暫且不表。
當(dāng)然,使用者應(yīng)該注意,這不代表 PE 是沒(méi)有 bug 的,因此測(cè)試數(shù)據(jù)前,盡可能先測(cè)已有歷史數(shù)據(jù)的(如 PDc 砸率,在歷史上也認(rèn)為是 5% 左右,因此可以認(rèn)為砸率計(jì)算器基本沒(méi)有問(wèn)題),然后再測(cè)新的場(chǎng)景。就砸率計(jì)算而言,因?yàn)槿讨皇悄M巨人行動(dòng),所以出問(wèn)題的概率雖然存在但應(yīng)該不大。遇到 bug 歡迎反饋。

其它
基于 PE,筆者已經(jīng)寫了測(cè)試時(shí)空數(shù)據(jù)(坐標(biāo)極值),測(cè)試全收跳跳落點(diǎn),以及測(cè)試刷新概率的程序,均與舊有數(shù)據(jù)一致,相關(guān)源碼公開(kāi)于?https://github.com/Rottenham/pvz-emulator-examples。使用這些的門檻比砸率計(jì)算器稍高寫,需要你懂 git 并配有 C++ 編譯環(huán)境。
之后有計(jì)劃將這些測(cè)試也內(nèi)置進(jìn) seml,使得可以基于 seml 文件一鍵測(cè)試,敬請(qǐng)期待咯。除此之外,PE 可以解決的問(wèn)題還有很多,砸率炮傷刷新都能測(cè),技術(shù)黨不再開(kāi)游戲指日可待。(