【魔塔】《24层魔塔》魔龙不可被击杀的严格证明
中华一条大笨鲟
编辑于 2019年03月18日 08:08

Part1 版本及设定说明

我们在这篇文章中的讨论,使用以下版本与设定:

  1. 《24层魔塔》V1.12,魔龙的血攻防属性为99999生命,9999攻击,5000防御,没有200级隐藏结局。常见的其他版本有《魔塔V1.1》和《魔塔盛宴》,这两个版本中的魔龙都是很容易击杀的。    

  2. 次次暴击,但hp不够则不能开战。勇士在与怪物战斗前,先用常规方法计算出本场战斗的估计伤害,如果hp小于估计伤害则不能开战,但在战斗中,勇士每回合对怪物的伤害,不等于勇士攻击减怪物防御,而是等于这个数值的2倍。使用这样的设定,是因为原版中具有“随机暴击”的因素:勇士hp小于估计伤害则不能开战,但在每次攻击时,有一定的概率(具体数值为等级/200)触发2倍暴击。我们证明,即使在随机暴击发挥到极限,以至于每回合都暴击的情况下,也不可能击杀魔龙。

Part2 证明思路简介

如果想要证明一个魔塔不可能打过boss,应该怎样做?

有一种精确的证明方法,是穷举全部的路线,发现每一条都打不过boss,或穷举一部分路线,发现每一条都打不过boss,同时证明其他的所有路线不可能比已穷举的这些更优。

但是,无论是前者还是后者,想用在《24层魔塔》这种层数多,路线变化丰富的魔塔上,即使借助计算机,现在看来也是几乎不可能完成的。

所幸,这个魔塔的boss过强,使得证明变得容易。

考虑这样一种情况:对于一个没有商店,没有加点,怪物也没有特殊属性的魔塔,我们赋予勇士一种特殊能力,使他可以秒杀除boss以外的任何怪物,从而可以轻易地收集所有血瓶宝石并站在boss面前,如果在这种情况下,勇士的生命都不足以击败boss,那么这个魔塔就是绝对不可能通关的了。

这个证明使用类似的方法:假设除了23层的三个冥灵魔王,地下层的两个灵法师、一个冥灵魔王,以及最终的魔龙之外,其余一切怪物(包括麻衣法师、红衣法师、白衣武士和其他的灵法师),勇士在任意状态下都可以击败,同时自身累计只损失3000点生命 。

实际的损失一定比3000点要大,不提各种实际战斗的伤害,仅从吸血的角度来说,勇士的初始血量加上前16层必经之路上的血瓶,共计3400点,这些生命要被后面数以十计的白衣武士和灵法师多次吸取。

有了这个优势条件,再加上第三部分补充的其他优势条件,我们证明勇士仍然不可能击败魔龙,这就说明,在没有这些条件的原版中,勇士更不可能击败魔龙了。

《24层魔塔》地下层的布局,其中两只灵法师是勇士挑战魔龙的主要障碍

值得指出的是,这里的假设只是为了简化计算,而规划路线时可能忽略这些假设。比如,勇士在吃十字架前,不适合在经验商店升级,十字架也可以认为不增加勇士的生命,因为21层与23层的灵法师实在是太多了。

Part3 其他假设

由于这个魔塔存在钥匙和门、多商店、十字架、卖剑盾的老人和商人、变异和二次变异等众多设定,我们还需要一些其他的假设,其中的一些是给勇士的优势条件,另外一些是对路线的限制。

  1. 除去必经之路上的门以外,勇士开启任何门都不需要钥匙,剩余的所有钥匙可以在12层左上的商人处卖掉换取金币。如果需要打开一扇门获取更多的钥匙,则这扇门也算作必经之路上的门。

  2. 每一枚金币可以选择加血(增加40生命)或加能力(增加0.2能力和),每一点经验可以选择升级(增加100/9生命,2/27攻击与2/27防御)或加能力(增加17/95能力和)。如果在中途几个位置的结算中遇到小数,采用向上取整。这实质上是说,假设所有的金币和经验都可以在11层和13层加点,同时一定能被全部利用,不出现不足以进行一次加点的尾数。

  3. 15层的老人不再卖剑,而是直接增加勇士171经验;商人不再卖盾,而是直接增加勇士100金币。这是因为,如果勇士购买他们的剑盾,相当于额外获得了约170.6经验和100金币。

  4. 所有可以变异的怪物,除必经之路上的之外,20层及以下的都在一次变异后击杀,22层及以上的都在二次变异后击杀。这是因为,由于有十字架的加成,保留20层及以下的怪物,等到二次变异后击杀是不合适的。

  5. 勇士在吃十字架前不使用经验升级。十字架使勇士的能力和提升三分之一,如出现小数则向上取整,不提升勇士的生命。

  6. 勇士会与23层左右两侧的冥灵魔王战斗,同时在与23层的冥灵魔王战斗前,即可获得它们的全部金币经验,并在分配能力后吃掉圣水。在有暴击的情况下,额外击杀左右两侧的两只冥灵魔王是合适的。

Part4 数据的收集

我们统计这个魔塔中的全部资源,为接下来的计算提供数据,由于十字架的存在,分20层及以下和21层及以上两部分统计。

  • 20层及以下:初始属性:1000生命,10攻击,10防御红血瓶:共46个,增加9200生命蓝血瓶:共28个,增加14000生命红宝石:共33块,增加99攻击蓝宝石:共33块,增加99防御剑:共4个,增加300攻击盾:共4个,增加315防御(由于上面的假设,15层的剑盾已不包含在内)小飞羽:共1个,增加1000生命,10攻击,10防御大飞羽:共1个,增加3000生命,30攻击,30防御黄钥匙:共73个黄门:共52个蓝钥匙:共26个蓝门:共17个需要留到后几层的蓝钥匙:共3个红钥匙:共12个红门:共10个需要留到后几层的红钥匙:共2个所有钥匙换取金币数:357金币金块:共1个,增加300金币怪物:增加10895金币,9863经验老人与商人:增加100金币,171经验

  • 21层及以上:红血瓶:共6个,增加1200生命蓝血瓶:共15个,增加7500生命红宝石:共15块,增加45攻击蓝宝石:共15块,增加45防御小飞羽:共4个,增加4000生命,40攻击,40防御大飞羽:共2个,增加6000生命,60攻击,60防御黄钥匙:共3个黄门:共0个蓝钥匙:共6个(包含带上来的3个)蓝门:共6个红钥匙:共5个(包含带上来的2个)红门:共7个所有钥匙换取金币数:-179金币金块:共10个,增加3000金币怪物:增加7220金币,6257经验

Part5 数据的处理

根据以上数据,可以得到这样的结果:

  • 在吃掉十字架后,勇士将拥有一个圣水,34600生命,586攻击,606防御,以及5502点能力和(这些能力和可以自由分配给攻击或防御,或以1:200的比例兑换为生命)。

  • 在准备进入地下层之前,勇士将拥有一个圣水,53300生命,731攻击,751防御,7511点能力和,以及6257点经验。

Part6 变量的引入与复杂的推导

经过一系列的简化,如今只需要证明下面的这个结论,即可证明《24层魔塔》的魔龙不可被击杀:勇士拥有一个圣水,53300生命,731攻击,751防御,7511点能力和,以及6257点经验,此时无论他以何种方式分配这些能力和与经验,进入地下层后都不可能击杀魔龙。

设6257点经验中,x点用来升级,共增加100x/9点生命,2x/27点攻击与2x/27点防御,则剩余(6257-x)点折算为(106369-17x)/95点能力和。

在这种情况下,我们有7511+(106369-17x)/95=(819914-17x)/95点能力和。

再设(819914-17x)/95点能力和中,y点增加攻击,z点增加防御,则剩余(819914-17x-95y-95z)/95点增加生命,共增加(163982800-3400x-19000y-19000z)/95点生命。

于是,在按照上述的方式加点结束后,勇士的生命

H=(169046300-3400x-19000y-19000z)/95+100x/9

攻击

A=731+y+2x/27

防御

D=751+z+2x/27

这里的H,A,D应为整数,若表达式计算出的不是整数,采用向上取整。

当x从0遍历到6257,y从0遍历到(819914-17x)/95,z从0遍历到(819914-17x)/95-y(若有小数则向上取整)时,H,A,D的值将优于一切有可能达到的血攻防数值。换句话说,无论一名玩家以什么样的方式玩《24层魔塔》,无论他能得到什么样的数据,这些数值中,总有一部分比它更适合迎战魔龙。

如果让这些数值逐一挑战魔龙,然后发现它们无一例外地倒在魔龙面前,这个证明就完成了。

挑战魔龙的流程如下:首先吃掉圣水,然后击杀三只冥灵魔王,接着进入地下层,先后击败一只灵法师、一只冥灵魔王和另一只灵法师,最后吃掉4000血与灵杖,以(A+20)点攻击和(D+20)点防御迎战魔龙,此时可以计算出勇士的生命H′与魔龙的伤害Dam。

最终,我们只需要证明

L=H′-Dam<0

Part7 引理的证明与穷举的简化

如果你是一名了解数学软件的读者,看到这里,对于接下来怎么做或许已经很清楚了,但在进行计算前,我们还需要进行最后一步——通过一个引理,对穷举x,y,z的范围进行限制,不然穷举量太大,可能会耗费过长的时间。

引理:L的最大值必然存在于z=0的范围之中。

换句话说,不将任何能力和分配给防御,更有利于勇士在现在的这种场合下击败魔龙(虽然最终我们会看到,还是不可能击败)。

引理的证明,以及最后的计算验证都不困难,就留给读者了。

(全文完)


——喂!就说你呢!别闹!

好吧,引理的证明分三步进行。

  • 首先,证明如果想使L取得最大值,勇士的防御不高于6000。这几乎是显然的,进行简单的计算可以发现,如果防御高于6000,攻击将不可能高于5000,勇士根本无法对魔龙造成伤害。

  • 其次,证明勇士的攻击不低于6000。假设勇士的攻击低于6000,则有以下两种情况:勇士耗费了不少于20的能力和加血,或耗费了不少于1000的能力和加防。若勇士耗费了不少于20的能力和加血,现将4000血换为20攻,容易证明魔龙对勇士的攻击次数将减少至少一次,伤害减少至少4000,冥灵魔王对勇士的伤害不增,而少加4000血的损失,经过圣水与两个灵法师之后就不足4000了。若勇士耗费了不少于1000的能力和加防,现将1000防换为1000攻,容易证明魔龙对勇士的攻击次数将减少到不超过之前的一半,而每回合对勇士的伤害却不足之前的四分之五,总伤害减少至少八分之三,而冥灵魔王的伤害恒小于30000,即使在防御换攻击后增加,也远远不至于填补魔龙的降伤。经过这两个调整,L的值将不断增大,直到勇士的攻击不低于6000为止,这样就证明了使得L取值最大的攻击不低于6000。

  • 最后,证明勇士不用能力和增加防御。在攻击不低于6000的情况下,勇士被魔龙、冥灵魔王攻击的总回合数少于200,如果勇士用能力和增加了防御,则将这些防御全部换成血,不难发现L的值将增大。

引理证毕。

在证明z=0的引理之后,情况变成了这个样子:

H=(169046300-3400x-19000y)/95+100x/9

A=731+y+2x/27

D=751+2x/27

其中x从0遍历到6257,y从0遍历到(819914-17x)/95,实际上,使用引理的证明中所使用的方法,很容易对y的取值范围进行限制,但如今穷举的计算量已经降到了可以接受的范围之内,这就没有必要了。

Part8 计算过程、计算结果与结论

使用Matlab对x和y的各个取值进行穷举。


L=-99999999;

for x=0:6257

    m=ceil((819914-17x)/95);

    for y=0:m

        H=ceil((169046300-3400*x-19000*y)/95+100*x/9);

        A=ceil(731+y+2*x/27);

        D=ceil(751+2*x/27);

        d=damage(A,D,30000,3400,3000);

        H=2*H-3*d;

        H=H*2/3+1;

        H=H-d;

        H=H*2/3+1;

        d=damage(A+20,D+20,99999,9999,5000);

        L=max(L,ceil(6001+H)-d);

    end

end


function f=damage(x,y,a,b,c)

if x<=c

    f=99999999;

else

    if y>=b

        f=0;

    else

        N=max(ceil(a/(x-c)-1),0);

        f=(b-y)*N;

    end

end


如果想依靠手工完成证明,需要更多的引理和更长的篇幅,计算机使证明变得简单


>> main

L =

  -319


可以发现,L的最大值为-319,这说明,经过种种复杂的假设、运算和证明,我们终于得到了一个令人满意的成果。

定理:《24层魔塔》的boss魔龙不可能被击杀,无论使用何种路线,勇士想与魔龙开战的血量差距,不可能小于319hp。

Part9 附录

之前贴吧中有几个魔龙无法击败的“证明”,我也写过一些,但它们都有疏漏之处——引用了一些看似正确,但很难证明的结论,比如升级不合适,或这个魔塔的攻防和max为10088。

从某个角度讲,一个正确率为99%的“证明”似乎已经足够了,但在我看来,无论正确的可能性有多大,只要有一丝一毫错误的可能,也总有种不完美的感觉。因此一直以来,我都想把这个定理的严格证明写出来。

之前我长期认为这个证明非常简单,统计数据结束后随便算算就可以成功,因为如果实际去打一下这个魔塔,可以发现距离击败魔龙的差距是巨大的,而且我以前写过的“证明”中,确实不严格地“证明”了这个差距非常大。

直到开始写之后才发现,很多地方为了保证严谨,都不得不在数据上作出很大的退让,这些退让影响如此严重,以至于我的尝试失败过三次。

在第一次失败前,我假设勇士开所有的门都不消耗钥匙,因为当时猜测这样的精度是够的,结果最终与成功差距巨大,仅仅证明了L的值不超过十几万。

第二次失败前,我假设只有两只灵法师和一只魔龙费血,结果只证明了L的值不超过三万多。这个失败让我被迫考虑了四只冥灵魔王的伤害,从而多花费了不少篇幅去描述击杀冥灵魔王的过程,引理的证明也因此变得复杂。

第三次失败比较倒霉,考虑冥灵魔王之后,我证明了L的值不超过2347,可以说差一点就成功了,不过数据小自有它的好处,从前面随便找出3000血就可以了,实际上即使再多个几千,也不太难找。

证明成功的时候,其实我是激动了一会的,不过现在似乎不激动了,因为我好困

嗯,就这样,如果有人有更大的耐心,或者有更好的想法的话,估计把319这个凄惨的数值优化到六位数不成问题吧。

(全文完)