植物大战僵尸 FE 无经济命题探索

前排提示:本文仅适用于年度版。年度版舞王被削,不再威胁陆地前置炮。同样的阵型在原版 MJ 舞王的情况下不成立。
自从入了键控坑后,PvZ 于我而言就变成了一个彻彻底底的数学游戏。我也开始探索一些曾经完全无视的命题,比如对于手控而言不可能完成的夜晚场地无经济命题。
夜晚场地无经济,表现形式为全场没有向日葵和阳光菇,同时阳光存量为 0。同时,因为夜晚场地,天上不会掉阳光,你的阳光数永远为 0。这意味着:
哪怕偷花也需要至少 25 阳光的启动资金,0 阳光 + 全场无花意味着你没有任何恢复经济的能力。
你能进行的操作只有发炮、放置小喷菇、放置模仿小喷菇、放置海蘑菇这四种,无法使用冰变奏,无法使用灰烬卡片代奏。能使用的节奏只有三大 P 系节奏。
由于没有经济恢复能力,任何操作都必须要严格无伤。所有的波长都必须要选择严格无伤的波长,而不能像很多其他阵一样“能接受轻微的炮损,只要适时换炮即可”。夜晚无经济阵不能接受僵尸对除小喷菇和海蘑菇外任何植物的啃食、碾压、秒杀行为。
不搭梯子的南瓜无用。因为不搭梯子的南瓜的唯一存在意义就是被啃食,拖延僵尸的行动时间,但这与上一条矛盾。同时南瓜还会增大判定范围,让冰车和巨人更早地进入攻击范围内。
第一次尝试:无伤经典八炮
我首先想到的是在 FE 经典八炮的基础上做修改。FE 经典八炮的原阵如下所示:

那么,去除经济作物和南瓜后,阵型变成了下面这样:

水路的冰瓜我也去了,水路冰瓜的原意是减速海豚,让海豚啃南瓜别那么 happy。但现在海豚啃南瓜这个大前提都不存在了,水路冰瓜自然也没有存在的必要了。
实战时使用 9s 一对炮的 P4 节奏,发炮时机 698 - 373 = 325,炸点 (2, 8.7)、(5, 8.7)。除第 9、19、20 波外,每波均只发一对炮;第 9、19、20 波除非清场(当前波倒计时 <= 200),否则至多发 3 对炮后才停止。小喷随时垫满 7 列。
海豚跳过 7 列植物啃 6 列的严格最早时机是 706,且海豚在空中时判定范围较大,所以 698 落地的炮能完收海豚。
最后,对于珊瑚的处理,因为没有阳光,所以只能炮消,不能冰消。第 20 波的 -150 时间,向 (4, 7) 发射一门炮,炮于 -150 + 373 = 223 时间落地可以无伤干掉 6~8 列的珊瑚三人组,对于第 9 列的珊瑚,会被接下来的一对消灭大部队的炮干掉。
实战中遇到的问题:自然出怪机制下,第 10 波红眼的数量可能会特别多,进而导致刷新延迟。如果第 11 波僵尸迟迟不进场,那么根据设定,本波过了 9s 也不会继续发炮,进而导致第 10 波红眼靠近玉米炮,遂破阵。
第二次尝试:防延迟的经典八炮
后来我在代码里加入了对第 10 波的防延迟判断。第 10 波从 698 - 373 = 325 时机开始,每隔 1s 读取一次刷新倒计时,连续读 9 次,直到 1225 时机,若刷新倒计时仍然 >200,则补发一对炮消除延迟。
本次方案一度完美运行了较长时间,直到有一次,1225 补炮,炮仍在空中飞行时,冰瓜的 IO 意外激活了刷新,下一轮出怪提前入场。9s 一波的循环被打破了,导致第 11 波的炮在需要发射时仍在 CD 中,遂破阵。
第三次尝试:添加一门炮,改为九炮,多出的炮当临时樱桃使用
在常规的有经济阵型里,通常都是使用樱桃来消除旗帜波的刷新延迟。但是在无经济阵型里,我们没有额外的阳光去放置樱桃。所以,无经济阵里,可以额外添加一门炮,用这门炮来作为樱桃的代奏。
阵型调整为如下的样子:

实际摆阵后,我发现九门炮不只是可以代樱桃这么简单:首先因为小偷抱不走玉米炮,合理的摆放位置能省下一把伞,并扩大原先 (2, 3) 和 (5, 3) 两把伞的作用范围。另外 9 炮在循环 1 次后会多出一门待命的炮,以此类推,循环 2 次后会多出两门,即一对待命的炮,大大增加了容错机制,即使循环在短时间内因为各种意外原因被打破,阵型依然可以稳定运行,不会出现准备发炮时有炮在 CD 中的现象。
实战中,除第 9、19、20 波外,每波发炮完毕后 375 时机(即 700 时机)检查刷新倒计时是否 >200。若仍 >200,说明本波发生了刷新延迟,则立刻向 (5, 8.7) 发射备用炮消除延迟,相当于炮代樱桃。其余和原始阵型的运阵方法一致。实战中大部分的延迟都是在第 10 波发生的,上百次选卡中只有一次是在第 7 波发生了延迟。
实战中遇到的问题:有一次跳跳 + 白眼的关卡,挂机到最后发现虽然未被破阵,但还是丢了脑子。众所周知,能不破坏阵型进家的僵尸有三种:气球、跳跳、巨人扔出的小鬼。本关未出气球,所以只可能是另两者破的阵。总之就是,底线单曾不太靠谱,虽然跳跳、小鬼进家概率很低,但不是不可能。常规阵型里可以拿窝瓜、寒冰菇等补漏,无经济阵型里不行。所以还是得双曾守底。
第四次尝试:改为双曾守底

再次稳定跑了几小时后,(4, 7) 的灯连同荷叶一起无了,怀疑是小丑炸的。接下来四路海豚直接在 6 列起跳了,(5, 8.7) 位置落地的炮炸不到海豚了,又被破阵。
考虑到小丑更容易下炸上,同时玉米炮的判定比普通植物更靠后,所以把灯改放到 (3, 7) 处,(4, 6)、(4, 7) 放一门炮更能提高阵型的安全性。
第五次尝试:灯放到三路

考虑到之前的运阵节奏里小丑抗性不足,故现在将 9s 波长缩短到 8.7s。
遇到的问题:炮粘手——4 路的 6~7 列炮向 (4, 7) 发射以便炮消珊瑚时,如果捏起和发射的点击间隔小于 30cs,就会由于两次点击间隔太短且距离太近导致发射不出去。解决方案:炮消珊瑚时,提前 40cs 选中要发射的炮,等待 40cs 以后再发射出去,即可完美炮消珊瑚。
实战结果:140 次选卡后(720 flags ~ 1000 flags),该阵型依然固若金汤!读取内存查询场上植物的 HP 时,可以发现除小喷菇、梯子南瓜和荷叶外,所有植物的 HP 均为 300,没有损伤。因此,以上无经济阵型可以稳定无尽的可能性大于 99.99%。
【运阵规则】对每一波而言:
如果当前波次为第 20 波,则于相对时间 -150 时向 (4, 7) 发射一门玉米炮(炮消珊瑚)。
于相对时间 +300 时向 (2, 8.7) 和 (5, 8.7) 发射一对玉米炮。
如果当前波次不为 9、19、20 波之一,则于相对时间 +675 时检查当前波次倒计时是否 > 200。如果回答为【是】,则说明出现了刷新延迟,向 (5, 8.7) 补发一门炮消除延迟。
如果当前波次为 9、19、20 波之一,则于相对时间 +1200 检查当前波次倒计时是否 <= 200 或停滞。如果回答为【是】,则向 (2, 8.7) 和 (5, 8.7) 补发一对炮。
如果上一步的回答为【是】,则继续于相对时间 +2100 检查当前波次倒计时是否 <= 200 或停滞。如果回答仍为【是】,则向 (2, 8.7) 和 (5, 8.7) 补发第二对炮。
20 波运行完毕后,记录本次已发射的炮的数量,将其除以 9 并取余数记为 k,下次运行脚本时跳过前 k 门炮,从第 k+1 门炮开始发射。
效果演示:
