春、曾,底线矿——以理论计算薄纱海量测试
Jchs-
编辑于 2023年01月15日 20:04
收录于文集
共5篇

前置声明:

  1. 本文将针对“曾守底线”这一若干年来可能存在模糊乃至争议的板块进行深入讨论;

  2. 指定游戏版本为英文原版(1.0.0.1051),不适用于北美版,不保证结论对其他版本仍然有效;

  3.  本合集共两部分,一部分基于锁随机数测试,另一部分基于理论计算;

  4. 总体流程遵循“实践→理论→实践”的步骤;

  5. 详细来说就是先测试,根据测试所得的初始数据进行理论计算,把求得的结果回代至验证测试,从而佐证最终结论;

  6. 这就意味着由此得出的结论除非初始数据或计算过程出错否则基本零误差,比脚本挂机更高效、也更准确;

  7. RND修改项有二:攻击初始199,攻击间隔0;

  8. 上面被锁的两项依次是?攻击植物第一次索敌所需时间;以及植物的最大攻击周期;

  9. 太长不看——概括一下就是本文对一些多曾守底构型的可靠性做了演算论证,演示视频见此

  10. 本文如有错误还请指出,本人在此表示感谢。

cut-off

基础零件

在进入正文前,建议您了解以下内容。知晓这些常识是参透本文讨论的前提。

 

矿工相关(时间单位cs, 下同)

本体血量270,一类饰品100,血量下降到70注1时掉头(物理),曾一轮攻击中的一发伤害20,15发可令其失去行动能力。矿工于底线出土转身到站稳注2/可被冰冻132,开始眩晕到眩晕结束对底线植物造成啃食伤害352,故而在352(含)注3内击杀之可保底线无伤。

注1:实则是89,但在本文语境下伤害都是以20计的,所以……

注2:站稳是一个模糊的概念,本文所有的“站稳”均指代矿工出土后可被冰冻的最早时刻。

注3:根据游戏机制,同一帧内的计算顺序为先植物后僵尸,所以352是最晚无伤时刻。

曾相关:

曾的攻击存在浮动。时间范围和首次索敌相同,是一个从rand(186,200)到0的倒计时。亦即曾每186~200判断一次范围内是否有僵尸,如果有,该轮倒计时结束后延迟64打出第一发,之后每隔28打出一发直至第四发,打出到命中目标延迟10。

 

举个简单的例子:假设某曾倒计时和首次索敌均锁200,若某次倒计时内判定范围内有僵尸,则从下次倒计时开始,该曾会于200-64=136打出第一发,并于126命中,此后的命中时机依次为98,70,42,其余情况的倒计时同理。

这说明一个处于静止状态的曾在僵尸进入其攻击范围(防区)内并使其转换为连续攻击状态需要一段“启动”时间。这个时间从0~200不等,长短取决于僵尸进入曾的防区时,曾的本轮倒计时还剩多少。而永动曾之所以能减小炮损,就是因为其跳过了第一轮倒计时归零的启动时间。为方便后续讨论,作如下约定:称处于静止状态的曾为静曾;处于连续攻击状态的曾为动曾(永动曾是动曾的一种特殊情况)。这样,二者的区别实际上就变成了“曾在做下一轮攻击前是否需要额外的启动时间”。

对动曾而言,若攻击间隔锁定为t,则任取时长为t的片段,打出的伤害总是80。

 

cut-off

案例分析

搞明白曾的攻击原理后,我们来分析几个常见的多曾守底构型 (方括号内为倒计时时刻, 如不加特殊说明, 默认从200(也可能是199, 原因见注4)开始)。

 

一、四静曾

在若干守底范例中不可不谓数一数二,被很多玩家认为是完守底线的存在,我自己也曾经挂了上百F,未发现矿工对底线植物剐蹭了哪怕一分一毫。那么这种构型真的无伤吗?我们不妨分析一下。

考虑最坏情况:四曾索敌与攻击均为200,令矿工在[199]时站稳,则曾在下一轮[126]时打出的第一发命中矿工,随后第二发[98]、第三发[70],直到第四发[42]将矿工打死。全过程用时200+(200-42)=358>352,有6cs的啃食区间。这6cs对应矿工站稳时机[199~194]注4(含边界值),其中于[199~198]站稳的矿工会对底线植物造成啃食伤害8点,其余4个时刻4点。所以那些不特殊处理矿工而直接四曾守底线炮的阵型,统统做不到理论无伤。为更直观地表示这一过程,将对应的时刻映射到数轴上,如下图所示:

关于图片,作如下说明(下同):

  • 绿色箭头指向的是矿工刚站稳的时刻,黄色箭头指向的是矿工最早的啃食时刻;

  • 轴线上的红色部分是矿工在曾的火力下存活的时间;

  • 126,98,70,42都是倒计时时刻,前文已有备注不再赘述。

那换做其他只占一格的植物(也即五曾守底)呢?乍一看好像没啥区别,四曾五曾不都是打一轮么?但通过计算得知同样情况下四曾要打完整一轮,而五曾只需要打三下,对应时机[70],全过程用时200+(200-70)=330<352,所以五曾是可以无伤的。你要问什么阵型五曾守底……请看这个视频​((

上文提到本人挂机上百F零损,从一定程度上说明这个概率已然很小。有多小呢?假设曾倒计时的浮动在范围内平均分布,则在四曾都roll到200这种极端情况下守底被蹭的概率为(1/15)^4*6/200,算出来结果约等于千万分之六。这里再强调一下,本文图简便直接锁了200,实际上可能199也会有伤,总体概率必不可能是上面这个结果这么小(一说概率在千分之一量级, 未经考证)

补:事实上就后续程序模拟大批量测试(合计百万次)得出的结果来看,有损概率在0.15%~0.2%之内,由于多次测试结果均在此范围内浮动,故初步认定其概率约为0.17%(或粗略认为是2‰)。程序模拟的演示视频见此​相关专栏请戳我​

注4:因为是采用PvZ Tools于(x, 1)放置矿工,对应放置时间需要提前132,即在 [200]站稳的矿工需要在上一轮[133]放置,但在实际测试中使用该时刻会导致曾提前攻击,而在上轮[132]放置的矿工(对应站稳时刻本轮[199])就没有这个问题,可以白嫖到静曾最长的启动时间;推测是修改器放置的僵尸在下一帧才生成的缘故。所以[199~194]站稳这个时间段,实际对应的是[132~127]放置;也正是如此,本文几乎所有的时间计算都存在1cs的出入。读者只需要明白这么写的意思即可,这1cs并不影响最终结论的正确性。

 

二、三动曾

为简化计算,假设(下文提到的)所有动曾第一发的命中时刻均为[126],令矿工在[41]时站稳,则恰巧能躲过三曾第四发于[42]命中的攻击。计算得矿工会在第二轮三曾打第一发时掉头,耗时42+200+(200-126)=316<352,故而三动曾完守底线,图片贴在下面以供参考:

 

三、一动曾+两静曾

这个构型此前出现在本人某视频的评论区里,不过当时由于各种原因只是单开修改器刷了几只矿工发现没啥问题后草草了事。今天归纳的时候想起来了,遂拿来算算。和前两种情况不同,这种既有动又有静的构型需要考虑的方面更多,如果还以最大化效益躲掉动曾的攻击选择在[41]站稳,那么于42后结束本轮索敌的两个静曾则会毫不留情地在两秒内将第一轮火力输出在矿工身上,进而使得结果和三动曾相同。这会是我们想要的结果吗?如果优先考虑两静曾并使矿工在[199]时站稳,则其两秒内伤害仅来源于一动曾,两静曾打不出一发攻击,纯属白给。时间来到两秒后,矿工已受到一轮攻击,还需11发伤害才能倒地。此时两静曾启动完毕,那么11=3+3+3+2,也就是说仍需要三曾第二轮打出的第四发攻击才能干掉矿工,但第四发命中时已经是200+(200-42)=358时的事儿了,所以最终结论是什么不用我说了吧,上图:

 

四、两动曾+一静曾

你说有没有一种可能,介于三动和一动二静构型之间的一静二动可以完守底线?

能不能守,一算便知。由一动二静的计算不难看出,若要计算形如x动x静这种二者兼备的构型,矿工什么时刻落脚(站稳)是关键。依照前文的计算方法选取落脚点在多数时候都能有所定论,但这种构型似乎有点不一样。经计算:若矿工以动曾为参照在[41]站稳,存活时间42+200+74=316<352;若以静曾为参照在[199]站稳,存活时间200+74+28+28=330一样小于352。看似该构型完守底线,但第六感隐示我就此下定论一定太过草率。

总感觉漏了些什么?让我们回到一开始选落脚点的地方。先前为了方便计算,我们统一了两种状态的曾的倒计时和它们的起始时刻。能否严谨无伤地守底考虑的一定是最坏情况,这么做是否亦是一种理想情况?如果是,还有比这更极端的情况吗?且慢。观察这两种情况,参照动曾比参照静曾早了42,如果把这42向后推迟,直到两个参考时刻对齐,并以静曾的[199]时刻作为参照——这么一拖,两个动曾第一发命中从原来的74变成116,不就变相给矿工续了一段时间吗!统一参考系后按次序计算命中时刻:

两动曾第一轮42+74=116命中第一个两发,再+28*3=200依次命中剩下六发;

随后静曾启动,+74=274命中第一发,+28*2=330先后命中第二、三发;紧接着动曾第二轮200+42+74=316命中第一个两发,+28=344再中第二个两发,到344时刻以上合计15发,正好将矿工打死。如果看得一头雾水不妨参照下图:

最终求得的结果为200+42+74+28=344<352,而这已经是最极端的情况。故此,认为该构型可以完守底线。

cut-off

仓促的收尾

这部分文字和上文没太大关系,甚至和标题也没啥关系,纯粹是些个人的杂谈。

说实话,一开始没想着刻意去测、去算这些东西,毕竟这篇报告、这份合集,统统是副产品,一开始的目标不是这玩意儿。而且这些东西真的又杂又碎,就像工作室里的remnant静静地躺在某个角落一样。不过凭着一股莫名其妙的动力,我还是顺便测了一下,不知道以前有没有人做过,现在也算有了一个比较清晰的答案吧。

大方向上,曾在大多数常规少io炮阵中面对的僵尸无非三样:矿工,蹦极,小鬼。到目前为止矿工研究完了,方法论也有了,下一步可能会把之前整合过所有的冰杀小偷测试​全盘重制一遍,终极目标是对后场小鬼与底线炮组合的完全解析,就是我上一篇专栏中提到的大纲。后者这几天做了一点,也只是冰山一角,需要量化的东西很多,阵设构型更多,总之还有很长的路要走。但时间紧迫,回过神来2022年已经过了一大半,而我还在浪费时间,不觉令人感叹。下半年肯定有够忙的,如果今年搞不出来,明年就更没时间搞;再以后,可能连玩2F生存的机会都不会有了。先就写这么多,后续可能会做少许修改。

cut-off

Ref.

  • 使用工具:PvZ_Tools_v2.7.2 / PvZ_Toolkit_v1.20.2,RND_3_4,ShowMe,TSV_5_0,WPF修改器;

  • 部分数据及计算方式来源于贴吧用户【逆命-断水】【不在宝前】,在此深表感谢;

  • 感谢B站用户【节操神将】指出的关键性问题,现已修正并添加了补充注释。

cut-off

本文最后编辑于2022.11.01        

 

cut-off