植物大战僵尸吧 关注:529,898贴子:4,910,709

再谈曾守底:你说的微伤,有多“微”?

只看楼主收藏回复

现已加入《底线那些事儿》下篇


IP属地:湖北来自Android客户端1楼2022-11-03 19:48回复
    楼主打至比角慢,希望带伙给点面子,不要插楼


    IP属地:湖北来自Android客户端2楼2022-11-03 19:49
    收起回复
      因为$β百度发图限宽,所以建议前往B站翻阅专栏网页链接


      IP属地:湖北来自Android客户端3楼2022-11-03 19:52
      收起回复
        前置声明:
        1.本文仍将针对“曾守底线”这一板块做详细讨论,故默认读者已理解上一篇专栏的内容( https://www.bilibili.com/read/cv18345473
        2.指定游戏版本为英文原版(1.0.0.1051),不保证结论对其他版本仍然有效;
        3.为简化问题,本文涉及的概率计算与伤害分析均只演示场上仅存在单一矿工的情况,实战中不乏同路多矿的情形,概率有增无减,请读者自行把握;
        4.程序演示视频见BV1HR4y1R7of,代码链接见评论区置顶;
        5.太长不看省流版:直接跳Part 2;
        6.本文如有错误还请指出,本人在此表示感谢;
        7.当凡事都以直觉为界定准则时,说明你离真相越来越远了。


        IP属地:湖北4楼2022-11-03 19:53
        收起回复
          Part 0.前情提要
          长话短说。对这一问题,上一篇专栏中详细探讨了各常见构型的真伪,直截了当地指出何种布置是缜密的,何种布置是破绽的。然而现实情况就像拿到练习册翻到最后一页被告知此题最终答案不唯一一样,事实告诉我不应止步于此。如果说先前的讨论是在做简单的判断题,那么在解析了整个流程的此刻,我确实应该考虑一下怎么完备地解出这道综合大题了。


          IP属地:湖北5楼2022-11-03 19:54
          回复
            Part 1.过程抽象
            概率,pvz里无处不在的东西。它的存在使游戏变得纷繁复杂,同时也让计算过程变得难上加难。由于众所周知的原因,要求解这类概率性问题,最省事的办法就是把整套流程抽象出来,编程交给计算机实现。


            IP属地:湖北6楼2022-11-03 19:55
            回复
              抽象并不难,只要理解了这个过程的运行机制,还是很好提炼出头绪的;至于程序怎么写,主要还是把握以下几个方面:
              随机数
              曾的攻击是浮动的,所以很明显需要生成一串范围是186~200的随机数,充当曾的攻击间隔;矿工出土的时刻是未知的,所以也可以将其看作是范围是1~200的随机数,模拟矿工出土时曾对应的倒计时刻。
              对象属性
              能动的无非是曾和矿工。简单掰扯一下:后者我们只关注血量和啃食时机,这俩都是常量所以没什么好说的;至于出土时刻,可以把它变相映射到曾的倒计时上。曾的几个属性分别是攻击间隔(倒计时)、子弹命中时刻和矿工的那一份出土时刻,因为测试不止一个曾,所以将上述属性统统装入数组,长度由你的键盘决定;还有一个临时数组记录曾每轮的攻击间隔,是否为命中时刻就是以它为基准计算的,为避免名字冲突,暂且叫它“gCD”。
              流程实现
              实质上就是个双层循环,外层循环次数即测试次数;啃食计算和游戏刻加减这类每cs都会运行的判定写在内层,噢,能动的还有游戏时间。
              当一次测试被执行时,曾的攻击间隔数组首先会初始化为随机值,获得初值后被送入内层循环。在这里,游戏刻会从0自增;属性倒计时则会自减,并每减一次就做如下判定:若本轮循环内倒计时减为0,程序会从186~200内随机取值并同时赋给攻击间隔倒计时和gCD(gCD拿到本轮倒计时后就可以做攻击判定了);若本轮循环内倒计时等于该倒计时时刻下四个命中时刻的其中之一,则将攻击次数+1。如此循环直至攻击次数加至15,退出,比较当前游戏时刻与矿工啃食时刻的大小。若前者≤后者,则矿工还未来得及开啃就已暴毙;反之,说明底线植物有损。
              这样就完成了一轮测试,参数调大一点跑跑就可以拿去计算四曾的失败概率了。不过像上面这种写法只能测静曾,另有一些组合情况仍然逍遥法外。引入动曾的方法也很容易,照着静曾再复刻一个一毛一样的过程就行了;只不过动曾是没有状态转变这个过程的,这意味着哪怕在矿工出土时roll到了一个小于攻击间隔的数也要判断是否攻击,相比静曾而言麻烦了点但并不是没法处理。我的解决办法是让动曾在参与判定前先跑两秒,拿到下一轮的攻击间隔,这样就能顺理成章地当成静曾处理了。
              功能完善
              主体部分写完后剩的就是一些无所谓的东西了,比如加点输入输出。最新一版的程序已经支持将测试中遇到的有伤结果按格式输出至文本文件,方便后续的数据整合与分析。代码已上传至gitHub,有需要者自取。
              需要说明的是,本程序虽然在理论机制上还原了真实场景,但与实际情况可能仍存在一定区别,问题出在矿工出土倒计时的设定上。拿三静曾守底举例:通常情况下的游戏内实测,是先放置三个曾,然后修改器放矿工一只一只试。如果打开ShowMe,你会发现在短时间内,三个曾的倒计时虽有区别但差量相对固定;而程序模拟则是简单粗暴地从1~200内随机挑三个数塞给倒计时。二者的区别就像……前者是一个玩家开游戏一次种三个曾测很多只矿工,后者是很多个玩家打开游戏同时种三个曾但只测一只矿工。关于曾的攻击间隔的选取,由不在宝前的数据,选取概率都是相等的。之前多多有跟我讨论过,这种情况看似可以安排曾的相位,但实际上一段时间后差量是多少、偏到哪都是有可能的,很难说它的走向就一定是什么样。故此,认为只要测试时间够长,在长出一定范围之后,二者在纸面数据上就应该是差不多的。


              IP属地:湖北7楼2022-11-03 19:56
              回复
                Part 2.概率计算
                废话了这么多,终于轮到重头戏了
                现将各有伤构型守底失败概率罗列如下(数据均由上述程序得出):
                四静曾:0.1%~0.2%,百万次测试1.688‰;
                三静曾:50%~55%,十万次测试51.916%;
                两动曾:40%~45%,十万次测试42.142%;
                两静曾+一动曾:约5%,二十万次测试5.034%;
                另外除了有伤构型,先前论证过的无伤构型也被我私底下跑了个遍且失败概率均为0,再次佐证了理论计算所得结论的正确性。


                IP属地:湖北8楼2022-11-03 19:57
                回复
                  第三部分,想了想还是发图片吧


                  IP属地:湖北9楼2022-11-03 20:01
                  收起回复
                    第二点。
                    关于本人之前提到的其他还没填完的坑,有时间就填,没时间就算了,比如小偷测试。说到小偷测试我不得不提一嘴,今年二月份的那个合集是有问题的,当中很多构型都没验证,但我敢肯定它一定有错,当时的水平敢发那玩意放现在多少有点愧疚了(,后面有空会考虑删掉一些分集。
                    跑题了。其实它俩都相类似的,方法不能说完全一致也大差不差了,一通百通,到头来就是个体力活。这种类型的模拟测试,我电脑的速度大概100次每秒,看着很快,但规模一大就歇b了。代码倒是可以抠一抠优化一下,我不想做(绝不是因为懒),但我始终支持广大玩家扫清灰色地带。


                    IP属地:湖北11楼2022-11-03 20:03
                    回复
                      第三点。
                      说说我自己吧,从开始发现这个小坑到后来一鼓作气扎进其中不能自拔,再而衰三而竭连水两篇专栏后爬出泥潭,回望整个过程,可以说是相当享受的。不过好景不长,种种因素加持下本人即将进入半退坑的边缘状态。蓦然回首,四年来与SE的各式“羁绊”有如放电影一般在脑海中闪过,仍旧意犹未尽。但人总还是要向前走的,不能因为半山腰的景致凑合而就此停下脚步。一味地怀念过去永远无法成长,这一点我希望自己能明白。
                      当然,这也并不代表我就此与这个小游戏诀别了。我还有些话想讲,思索一阵后还是决定以后再讲。道路依然漫长,路两旁埋伏着不可预知的变数。如果我哪一天没动静了,,
                      那就没动静了


                      IP属地:湖北12楼2022-11-03 20:04
                      收起回复
                        Ref.
                        感谢各位对此问题的有益讨论。
                        全文完


                        IP属地:湖北13楼2022-11-03 20:05
                        回复
                          前排,膜


                          IP属地:河北来自Android客户端14楼2022-11-03 20:10
                          回复
                            前排膜


                            来自手机贴吧16楼2022-11-03 20:18
                            回复


                              IP属地:广东来自Android客户端17楼2022-11-03 20:31
                              回复