技术:栈位理论

版本差异

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
技术:栈位理论 [2023/12/11 22:37] – ↷ 页面攻略:栈位理论被移动至技术:栈位理论 OTZzzz技术:栈位理论 [2025/02/25 08:53] (当前版本) – [植物栈位相关] OTZzzz
行 34: 行 34:
 </callout> </callout>
 ===== 前言 ===== ===== 前言 =====
-pvz中并<wrap hi>没有真正的栈,有的只是类似栈的结构</wrap>。底层逻辑介绍参见文末,以下为叙述方便可能仍用到“栈/栈位”的表述。+栈位,也称编号、序号。pvz中并<wrap hi>没有真正的栈,有的只是类似栈的结构</wrap>。底层逻辑介绍参见[[攻略:dataarray|DataArray]],以下为叙述方便可能仍用到“栈/栈位”的表述。
  
-栈位显示相关工具和展示视频可见[[https://www.bilibili.com/video/BV1oE41157SY/|PvZ 栈位理论]]+栈位显示相关工具和展示视频可见[[https://www.bilibili.com/video/BV1oE41157SY/|PvZ 栈位理论]]
 ===== 基本介绍 ===== ===== 基本介绍 =====
 <wrap em>**以下内容仅作为解释用,而非内存真实情况。**</wrap> <wrap em>**以下内容仅作为解释用,而非内存真实情况。**</wrap>
行 44: 行 44:
 对植物而言,场上的植物都会有一个序号,直接对应植物在数组中的位置。初始化游戏(比如重新开局)同时会有一个栈被初始化,用以分配植物序号。刚初始化的栈只有一个元素0,而当我们种下了第一株植物,发生了以下事情: 对植物而言,场上的植物都会有一个序号,直接对应植物在数组中的位置。初始化游戏(比如重新开局)同时会有一个栈被初始化,用以分配植物序号。刚初始化的栈只有一个元素0,而当我们种下了第一株植物,发生了以下事情:
  
-  栈顶元素(就是0)出栈成为序号赋予植物-->判断栈是否为空-->空,出栈的元素+1后(这里是变成1)再入栈。+  栈顶元素就是0出栈成为序号赋予植物-->判断栈是否为空-->空,出栈的元素+1后这里是变成1再入栈。
  
 植物消失(包括被铲除、被碾压并过了一段时间((还在场上的扁植物也是有序号的))、灰烬植物爆炸、被丑炸等)后,其序号会入栈,成为栈顶元素,将分配给下一次种植。 植物消失(包括被铲除、被碾压并过了一段时间((还在场上的扁植物也是有序号的))、灰烬植物爆炸、被丑炸等)后,其序号会入栈,成为栈顶元素,将分配给下一次种植。
行 54: 行 54:
  
 “低栈位”可与“序号小”等同,反之亦然。 “低栈位”可与“序号小”等同,反之亦然。
 +==== 序列号 ====
 +<wrap hi>此概念仅在蹦极和舞王的相关现象中用到,了解它并不是必要的。</wrap>
  
 +事实上,游戏通过栈位和序列号共同确定一植物或僵尸(只不过大部分现象仅依赖栈位)。序列号有时也被称为<fc #008080>mRank计数</fc>,但在内存中被称为<fc #008080>mNextKey</fc>。游戏内部存在初值为0的计数器,植物、僵尸、子弹等各有一个,植物/僵尸/子弹/…生成时将被给予计数器当前值,即为序列号,之后对应计数器自增1。((此段初值与自增为经过简化的表述,实际情况请参阅[[攻略:dataarray|DataArray]]))
 +
 +重进关卡时,计数器将被重置为初值,这将可能使蹦极抓取植物、舞王区分伴舞过程产生错误。
 +
 +对于让植物/僵尸拥有特定序列号以达成的操作是否应该归入“栈位理论”范畴,存在些许争议。
 ===== 现象 ===== ===== 现象 =====
 ==== 植物栈位相关 ==== ==== 植物栈位相关 ====
行 60: 行 67:
 海豚因植物间栈位高低有可能发生越过高坚果的现象。 海豚因植物间栈位高低有可能发生越过高坚果的现象。
  
-{{:攻略:230116115446.png?nolink&200}}+{{:攻略:230116115446.png?nolink&100}}
 == 静态(全过程无操作) == == 静态(全过程无操作) ==
 请注意,此现象只发生在下水即跳跃的海豚中(也就是八列有植物)。<wrap lo>经典十炮高坚果带套会被海豚跳可认为是谣传了</wrap> 请注意,此现象只发生在下水即跳跃的海豚中(也就是八列有植物)。<wrap lo>经典十炮高坚果带套会被海豚跳可认为是谣传了</wrap>
行 66: 行 73:
 发生的条件是: 发生的条件是:
  
-  八列有高坚果,是否带套不影响; +  * 1、八列有高坚果,是否带套不影响; 
-  -  a.七列有空南瓜(b.或高坚果或高坚果套南瓜); +  * 2、a.七列有空南瓜(b.或高坚果或高坚果套南瓜); 
-  -  a.七列空南瓜(b.或高坚果或高坚果套南瓜)栈位低于八列高坚果。+  * 3、a.七列空南瓜(b.或高坚果或高坚果套南瓜)栈位低于八列高坚果。
  
 对应的情况是:同时满足1,2.a,3.a,海豚跳过八列,落在七列更左的位置;同时满足1,2.b,3.b,海豚跳过八列,被七列高坚果阻挡而落在七列较右的位置;除此二种皆会被八列高坚果阻拦。 对应的情况是:同时满足1,2.a,3.a,海豚跳过八列,落在七列更左的位置;同时满足1,2.b,3.b,海豚跳过八列,被七列高坚果阻挡而落在七列较右的位置;除此二种皆会被八列高坚果阻拦。
行 78: 行 85:
 在海豚跳跃时种植,可以有更大的<del>作死</del>操作空间。 在海豚跳跃时种植,可以有更大的<del>作死</del>操作空间。
  
-对于n列高坚果,1≤n≤7,只需在一小段时间内于n+1列种植一栈位低于<fc #008000>__此高坚果__</fc>的非高坚果植物,那么海豚将会越过高坚果。而这段时间,上界不晚于跳跃后123(124触发碰撞判定),下界约为海豚半个头处在n+1列与n+2列交界时((早于此下界海豚落水后仍会不断啃食高坚果,只是不会因被拦而落在高坚果前面))。+对于n(1≤n≤7)列高坚果,只需在一小段时间内于n+1列种植一栈位低于<fc #008000>__此高坚果__</fc>的非高坚果植物,那么海豚将会越过高坚果。而这段时间,上界不晚于跳跃后123(124触发碰撞判定),下界约为海豚半个头处在n+1列与n+2列交界时((早于此下界海豚落水后仍会不断啃食高坚果,只是不会因被拦而落在高坚果前面))。
  
-类似地,其实还可以令海豚做出越过n列高坚果(或南瓜)的动作,却被n+1列高坚果阻挡。仅需在海豚做出跳跃动作后、跃后124之前于n+1列迅速种植荷叶与低栈高坚果,海豚就会被拦在n+1列高坚果前。注意,此操作对n列普通植物无法复现。+类似地,还可以令海豚做出越过n列高坚果(或南瓜)的动作,却被n+1列高坚果阻挡。仅需在海豚做出跳跃动作后、跃后124之前于n+1列迅速种植荷叶与低栈高坚果,海豚就会被拦在n+1列高坚果前。注意,此操作对n列普通植物无法复现。
  
 === 对植物判定顺序 === === 对植物判定顺序 ===
行 91: 行 98:
  
 === 蹦极 === === 蹦极 ===
-利用此原理可以做到一些神奇的事情:蹦极偷炮、炮后轮悬空、植物下方无花盆荷叶而悬空。 <del>用于满足日益发展的审美观</del>+蹦极依靠栈位和序列号来确定将要偷的植物,若设法将目标植物拥有与蹦极选定的植物相同的栈位和序列号,则目标植物会被偷取。此原理又名栈位偷,尽管这并未完全体现背后的机制。利用此原理可以做到一些神奇的事情:蹦极偷炮、炮后轮悬空、植物下方无花盆荷叶而悬空((悬空植物也可以通过投篮僵尸实现,示例视频www.bilibili.com/video/BV16v411w7Mh))。 <del>用于满足日益发展的审美观</del>
  
 复现方法: 复现方法:
-  * 在蹦极产生标靶到手开始收拢的时间内,退出重进一次,并且此阶段过后,蹦极所在格存在植物(即种植物时间可远先于或稍晚于蹦极落下);  +  * 1、在蹦极产生标靶到手开始收拢的时间内,退出重进一次,在蹦极所在格种下任意植物,之后直到蹦极手完全收拢前的时间段前,挑一时刻退出重进一次; 
-  * 在蹦极手开始收拢到完全收拢(摸到植物)的这段时间,铲除蹦极所在格植物,并于任意位置种下计划被偷的植物; +  * 2、在蹦极手开始收拢到完全收拢(摸到植物)的这段时间,铲除蹦极所在格植物,并于目标位置种下计划被偷的植物; 
-  * 此时计划被偷植物在所种格子仍存在,蹦极所在格也会有该植物的贴图。悬空炮或植物的种植需要将花盆或荷叶选为被偷对象,并在此阶段完成炮或植物的种植; +  * 3、此时计划被偷植物在所种格子仍存在,同时蹦极所在格也会有该植物的贴图。制造后轮悬空炮或悬空植物需要将花盆或荷叶选为计划被偷对象,并在此阶段完成炮或植物的种植; 
-  * 蹦极手完全收拢(视觉上碰到了植物)后,被偷植物将从所种格子消失并且贴图随蹦极上升,此阶段对荷叶花盆也不再能于其上种植植物。 +  * 4、蹦极手完全收拢(视觉上碰到了植物)后,计划被偷植物将从所种格子消失并且贴图随蹦极上升,此阶段对于被偷的荷叶花盆也不再能于其上种植植物。 
  
-<callout type="default" title='注意' color="green">这里所应用的不仅仅是传统的栈位理论更重要的是游戏中的“Rank”((现在通常称作“序列号”))机制。游戏部存在一个计数器,每个物(僵尸/子弹/…… 同理)出生时,游戏将计数器值作为植物的Rank并将计数器自增1。重进游戏的作用是重置计数器。游戏通过同记录栈位和Rank来确定植物(即栈位+Rank是植物的“身份证”)通过上述操作,控制新植物的栈位与Rank均与原来蹦极抱住相同可使游戏误认植物为原植物,达成目的。该原理在IZE中的应用珍珑《移接木》。不过通常意义上讲该原理似乎并不属于栈位理论范畴+<callout type="primary" title="解释" icon="true"> 
 +  * 步骤1时间内蹦极未锁定植物序号与序列号,第一次退出重进使得蹦极所植的第一株植物序列号为0第二次退出重进为种植下一株0序列号植物准备; 
 +  * 步骤2所在间,蹦极锁了本格植物的序号和序列号(为0),铲除该格植物让序回归栈顶种植的植物便拥有了被铲除植物的栈位和值为0序列号被蹦极误认成被偷植物; 
 +  * 蹦极手完全收拢前,目标植物仍可交互荷叶、盆,应在此时间段内种植好负载植物; 
 +  * ps:若能够保证蹦极偷取植物的位置,则第一次退出重进与第一次植物种植可以早早地完成,毕竟只是为了产生0序列号植物
 </callout> </callout>
 +
 +一个使炮后轮悬空的实例是[[https://www.bilibili.com/video/BV1Rq4y1N72a|水母十四炮]]。
 +[{{:技术:抱得玉米归.png?nolink&200|偷炮演示}}][{{:技术:水母14炮.jpg?nolink&273|水母十四炮}}]
 +
 +== 陆地荷叶/陆地猫 ==
 +[{{ :技术:陆地荷叶.png?nolink&100|偷取猫留下荷叶演示}}]
 +
 +在有水路的地形中,使蹦极选定一株陆地上被套在南瓜中的植物,并用上述方法更换为猫尾草,则蹦极偷取猫后会在南瓜下放置荷叶,则实现了陆地荷叶,在荷叶上种植猫尾草就实现了陆地猫。
 +
 +也称作飞贼荷叶skip、蹦极荷叶skip、Bungee Lilypad Skip(BLS)。
 +
 +除陆地放荷叶和猫外,利用此特性可以做到:
 +
 +  * 陆地或水上无限叠种荷叶;
 +  * 给海蘑菇和缠绕海草套南瓜;
 +  * 在同一格叠种任意数量荷叶与至多一个海蘑菇/猫;
 +  * 在同一格叠种一个荷叶与一个缠绕海草;
 +  * 浮空南瓜套;
 +  * 荷叶与花盆、地刺、土豆地雷等叠种;
 +  * ……
 +
 +<callout type="warning" title="注意" icon="true">
 +制造陆地猫的条件不仅仅是蹦极靠栈位和序列号判断植物,它还包含了至少以下几点:
 +  * 1、蹦极依靠自身所在格来决定偷猫后补种荷叶的格子,而非猫原来在的格子;
 +  * 2、补荷叶的过程不涉及额外的合法性判断;
 +  * 3、种猫的过程并没有判断需要水。
 +</callout>
 +参考贴:[[http://tieba.baidu.com/p/8961868805|飞贼荷叶skip]],参考视频:[[http://www.bilibili.com/video/av1952695412|原版逆天bug:飞贼荷叶skip]]
  
 === Ice3失效 === === Ice3失效 ===
行 113: 行 152:
 已知僵尸的啃食判定是出生后时间每为4的倍数造成一次4hp的啃食伤害,蹦极下落时间为375~394cs。如果空降僵尸恰好落在植物上,此时: 已知僵尸的啃食判定是出生后时间每为4的倍数造成一次4hp的啃食伤害,蹦极下落时间为375~394cs。如果空降僵尸恰好落在植物上,此时:
  
-1、若地时间为4的倍数,空降僵尸栈位低于蹦极,则过4cs才造成伤害;空降僵尸栈位高于蹦极,则在落地时就造成啃食伤害;+1、若地时间为4的倍数,则僵尸间栈位关系影响首次啃食时间——空降僵尸栈位低于蹦极,则过4cs才造成伤害;空降僵尸栈位高于蹦极,则在落地时就造成啃食伤害;
  
-2、若地时间不为4的倍数,则到下一个4的倍数的时间造成伤害,栈位高低无影响+2、若地时间不为4的倍数,则栈位高低无影响,统一到下一个4的倍数的时间造成伤害。
 === 垫材 === === 垫材 ===
 当多个僵尸对植物造成碾压、跳跃、举锤等判定时,判定会从栈位最小的僵尸进行。 当多个僵尸对植物造成碾压、跳跃、举锤等判定时,判定会从栈位最小的僵尸进行。
行 122: 行 161:
  
 2、屋顶地形车底垫花盆,可观察到一部分撑杆尝试越过花盆,一部分继续行走。垫花盆后的1cs内,栈位较冰车低的撑杆先进行了飞跃判定,栈位较冰车大的撑杆飞跃判定比冰车碾压判定晚,正常行走。 2、屋顶地形车底垫花盆,可观察到一部分撑杆尝试越过花盆,一部分继续行走。垫花盆后的1cs内,栈位较冰车低的撑杆先进行了飞跃判定,栈位较冰车大的撑杆飞跃判定比冰车碾压判定晚,正常行走。
-[{{:攻略:车底垫.png?nolink&200|九列噬碑藤种下被立即碾压,部分巨人举锤}}][{{:攻略:车底垫2.png?nolink&200|花盆种下被立即碾压,部分撑杆跃过}}]+[{{:攻略:车底垫.png?nolink&200|九列噬碑藤种下被立即碾压,部分巨人举锤}}][{{:攻略:车底垫2.png?nolink&220|花盆种下被立即碾压,部分撑杆跃过}}]
 由于僵尸的栈位在正常游戏中不可控制,故采用上述“车底垫”的方式来垫巨人消除砸率的操作是不严谨、不被接受的((可以使用地刺、窝瓜来车底垫全部巨人,因为地刺、窝瓜免疫碾压,且地刺在种后26cs才扎车))。 由于僵尸的栈位在正常游戏中不可控制,故采用上述“车底垫”的方式来垫巨人消除砸率的操作是不严谨、不被接受的((可以使用地刺、窝瓜来车底垫全部巨人,因为地刺、窝瓜免疫碾压,且地刺在种后26cs才扎车))。
  
 === 撑杆 === === 撑杆 ===
-越过植物方面,撑杆拥有与海豚相似的特性,具体见[[攻略:栈位理论#海豚|上文]]。  +越过植物方面,撑杆拥有与海豚相似的特性,具体见[[技术:栈位理论#海豚|上文]]。  
  
-撑杆与土豆地雷间亦存在一bug:土豆地雷遍历本行((简化的表述,非同行僵尸会直接跳过不造成影响))僵尸序号,每一个无杆撑杆会使本行土豆地雷的触发判定右移40px(即0.5格),而已出土的土豆地雷会处于霸体状态((免疫啃食,但车系碾压、巨人敲击、小丑爆炸、植物子弹、辣椒僵尸、篮球攻击仍然会对土豆地雷造成伤害))。这意味着,最少<wrap hi>两个__低栈位__</wrap>的无杆撑杆可以产生一个无敌土豆地雷;当撑杆数量足够多,使得地雷触发判定在僵尸出生点右侧时,土豆地雷将完全免疫本行僵尸啃食。相关应用有伪和平22炮。((www.bilibili.com/video/BV1nq4y1k7i6))。[{{:攻略:invinciblemine.png?nolink&200|左侧为三个最高序号为48的撑杆,右侧为序号93的铁桶和序号131的橄榄}}][{{:攻略:4xbuq-hoqgk.gif?nolink&200|四杆引雷}}]+撑杆与土豆地雷间亦存在一bug:土豆地雷遍历本行((简化的表述,非同行僵尸会直接跳过不造成影响))僵尸序号,每一个无杆撑杆会使本行土豆地雷的触发判定右移40px(即0.5格),而已出土的土豆地雷会处于霸体状态((免疫啃食,但车系碾压、巨人敲击、小丑爆炸、植物子弹、辣椒僵尸、篮球攻击仍然会对土豆地雷造成伤害))。这意味着,最少<wrap hi>两个__低栈位__</wrap>的无杆撑杆可以产生一个无敌土豆地雷;当撑杆数量足够多,使得地雷触发判定在僵尸出生点右侧时,土豆地雷将完全免疫本行僵尸啃食。相关应用有[[http://www.bilibili.com/video/BV1nq4y1k7i6|伪和平22炮]] 
 +[{{:攻略:invinciblemine.png?nolink&190|左侧为三个最高序号为48的撑杆,右侧为序号93的铁桶和序号131的橄榄}}][{{:攻略:4xbuq-hoqgk.gif?nolink&200|四杆引雷}}]
  
 多个撑杆可以将地雷判定引至足够右的位置使得爆炸不伤僵尸,如[[攻略:解谜模式|IZ]]中常用的四杆引雷。  多个撑杆可以将地雷判定引至足够右的位置使得爆炸不伤僵尸,如[[攻略:解谜模式|IZ]]中常用的四杆引雷。 
  
-单个撑杆也可以触发被南瓜套住的土豆地雷爆炸,这点在[[攻略:萌新向_改版冲关技巧与经验#栈位与判定|改版过关]]中有所应用。+单个撑杆也可以触发被南瓜套住的土豆地雷爆炸,这点在[[攻略:改版通略#栈位与判定|改版过关]]中有所应用。
  
 关于此bug的演示及解析,参见: 关于此bug的演示及解析,参见:
行 142: 行 182:
 === 拦截bug === === 拦截bug ===
 (以灰烬激活投掷为时间参考,单位为cs)已知Ice3的生效时间是原速激活后105(减速210),但正常可拦截时间是原速107+(减速212+)。这是因为激活后106(减速211)时存在拦截bug,在这一cs内拦截可能导致拦截失败,甚至出现炸黑巨人没炸掉小鬼的情形(如图)。该bug与小鬼和巨人间的栈位高低有关: (以灰烬激活投掷为时间参考,单位为cs)已知Ice3的生效时间是原速激活后105(减速210),但正常可拦截时间是原速107+(减速212+)。这是因为激活后106(减速211)时存在拦截bug,在这一cs内拦截可能导致拦截失败,甚至出现炸黑巨人没炸掉小鬼的情形(如图)。该bug与小鬼和巨人间的栈位高低有关:
-[{{:攻略:106拦截1.png?nolink&400|核弹触发拦截bug}}][{{:攻略:106拦截2.png?nolink&400|巨人炸黑,小鬼存活}}]+[{{:攻略:106拦截1.png?nolink&290|核弹触发拦截bug}}][{{:攻略:106拦截2.png?nolink&400|巨人炸黑,小鬼存活}}]
 若小鬼栈位高于巨人,则此时小鬼存在时间为1cs,该cs内必定成功拦截; 若小鬼栈位高于巨人,则此时小鬼存在时间为1cs,该cs内必定成功拦截;
  
行 148: 行 188:
  
 === 舞王 === === 舞王 ===
 +舞王通过<fc #008000>栈位和序列号</fc>来确认自己的伴舞,若设法使另外的僵尸拥有与某伴舞相同的栈位和序列号,则该僵尸会被舞王错误识别为伴舞。
 +
 +在生存无尽中,新舞夜惊魂将魅惑伴舞替换为敌对僵尸,在不使用女仆秘籍的情况下构建了永动曾。
  
-===== 现实运用 ===== +僵尸中,相用有珍珑[[https://www.bilibili.com/video/BV1ev4y1k769|《移花接木》]]
-实际上,栈是一种数据结构.它是一种特殊的线性表,只能一个表的一个固定端进行数据结点的插入和删除操作。人们多用栈来进行分配和访问计算机内存,保存命令行参数和函数参数,解析表达式,反转数据项,保存和回溯URL等操作。 +
-==== 实际算法 ==== +
-一个项目的有序集合,既可以向栈的一端添加一个项目,又可以从同一端删除一个项目,但一次只能添加和删除一个项目。可以添加和删除项目的一端称为栈顶,相一端称为栈底。给定了栈顶和栈底之后,栈顶附近的项目停留在栈中的时间要少于栈底附近的项目。另外,从栈中删除项目的顺序和向栈中添加项目的顺序是相反的,这个特性称为LIFO(last in, first out, 后入先出)。 +
-==== 游戏内内存 ==== +
-当游戏调CALL召唤植物或僵尸时,会从栈里取个值,从0开始,然后+1后跳转走,跳走之后,会取出刚刚栈里的那个值,作为索引去一个结构拿出一个值,值和edx关,来寻找FFFFFFFF,如果没找到,就再来一遍召唤植物或僵尸并且给栈里那个值+=1,然后再次索引找值+
  
  • 最后更改: 16月前
  • OTZzzz 修改