大家好,这次给大家带来的题目是“多少弓箭手可以杀死一只龙?”。
首先说明一点,作者并非标题党,这个题目自己也是琢磨了许久。我的上一篇技术贴被热心网友转载到多玩COC论坛并推荐至首页,给了我很大的鼓励,同时也引发了我的一些思考:后面究竟写点什么比较好呢?
几经踌躇,最后还是决定写一篇面向大众的,具有一定使用度和参考价值的命题。
【引子】为什么要选择这个题目?
众所周知,在7月3日更新之后,双王防御机制的修改再一次把攻防领域的话题推向了风口浪尖,引发了爆炸性的吐槽与争论;相应的,在部落对战领域,传统的进攻流派也受到了冲击:纯野猪流受到了极大的限制、龙流的应用倍加推崇以及气球野猪等混合流派的研发等等。
但是!有一点非常重要:除去纯龙流,其他任何一个流派,勾杀部落城堡的防守援军仍然是进攻时必须完成的第一步。
在高本的部落对战中,现在主流的配置依然是(少量法师+大量弓箭)的填充模式;但是在以6-8本为中坚力量的部落中,使用龙作为防守援军还是比较常见的。相信到了9本以上的玩家,对于如何击杀弓法混合援军都会有一定的心得,技术也相对成 熟;同时我本人目前也只能算个新手,就不在这里班门弄斧了。
因此,本文面向的读者主要是:发展中部落的、以6-8本为主体构成的初中阶COC玩家。
下面进入本文正文部分。(如果大量篇幅给您造成阅读困难,请直接移步至第三部分查看最终结论)
【一】模型的建立
首先描述一下这个模型的建立环境:
1、本文不包含如何引出援军龙以及控制其的走位等等前置工作,只单纯讨论击杀过程;
2、考虑到混合兵种计算的复杂性,进攻兵种选择为单纯的弓箭手,进攻对象为龙;
3、由于龙的攻击为范围0.3的溅射AOE,此时考虑弓箭手的布局为理想状态(扇形或圆形包围,且彼此间隔>溅射半径,也就是说龙一次攻击只能杀死一个弓箭手);
4、不考虑手速,假设弓箭手为一次性全部投放完毕。
5、所有攻防兵种在第一时间(t=0)的时候都未进行攻击,而是进入攻击准备期(攻击前摇);
6、不考虑战场周围建筑对于进攻兵力的目标影响,即所有弓箭手能第一时间锁定龙进行攻击(实战中这一点并不难做到,只要将龙引到空旷的地方例如角落即可)
以上多点假设都是完美状态,与实际操作略有出入,请勿着急。得出结论后,在第四大点补充说明的部分会对依照实际操作环境进行一定的修正。
【二】推导
为了便于读者方便参看初始数据,在这里先引用两个数据表格
★随机选择3级飞龙和3级弓箭手作为第一次推导的对象。
★推导目标是以最少的代价杀死这条飞龙。换句话说,杀死这条龙最少需要多少弓箭手。
也许有人会问,这有什么意义?我放个二三十个弓箭手,再不行三四十个肯定能杀死一条啊!?
话虽如此,但是部落对战的胜负往往就在于毫厘细节之间,这也是这个游戏的魅力所在。考虑到更多的细节,意味着你比别人多了一个赢取胜利的筹码。
因为有的时候,我们主力进攻方向被大量AOE火力覆盖,弓箭手无法铺开,并不适合清理一条防守的龙。此时我们有两种选择:
第一,强行在该位置击杀援军。可以想象,稍有不慎就会被迫击炮砸死或者被箭塔射死位置不好的弓箭手,同时也增加了龙溅射攻击的可能性,增加了无谓的兵力消耗;
第二,另外方向选择一个角落清理援军,而后大部队照原路线进攻。
一般情况下,我们多数人会选择后者,那么这个模型的意义就体现出来了。因为这些杀龙的弓箭手并不是跟在主力部队肉盾后面,如果投放过多,击杀完龙之后在没有肉盾的掩护下,很快会被防御塔或者陷阱清理掉,这又是一种资源量费,结果和第一种选择如出一辙。
如果你知道大概需要多少个弓手可以解决当前的飞龙,那么你完全可以做到精确投放,然后你可以从容地把注意力转移到主力部队的猪、胖子、炸弹人等等,节约了大量的观察和等待杀死援军的时间。
举例说明,见下图。
假设用天胖攻打此阵型(假设援军只有1条龙),经过一番思考,决定A点为主力进攻方向。那么首先从A点放1个野蛮人引出龙,接下来在地点B和C都可以杀龙。如果单纯考虑时间成本,B点距离较近,可能更好;但是B点的大部分都被迫击炮的防御范围覆盖,因此很难有效铺开弓箭手,因此C点是更为理想的选择。
如果在C点投放大量弓箭手,是可以短时间消灭飞龙,但是由于主力胖子从B点投放,那么C点击杀完龙之后,剩余兵力可以说基本浪费了。所以,我们对于投放多少援军既能准确杀死这条龙,又不至于造成兵力浪费,做到心中有数,可以说是非常必要的。
回到数据模型,接下来我将我四次推导的过程全部写下来,其中前三次都不同程度地犯了一些错误,结果全部推翻重来。但是正是由于前三次的错误,为后续的正确论断提供了非常好的思路,所以我将全过程回顾一下。
▲第一次推理(错误)
假设需要投放的弓箭数量为x,当前弓箭手数量为y,杀死龙需要的时间为t,则有如下:
① y=x-2/3t (龙的攻击间隔为1.5,即每1.5秒杀死一个弓箭手)
②12yt=2300 (12为三级弓箭手基础攻击力,2300为三级龙的生命值)
错误分析:这是我首次列出的两个方程,并想当然地认为将①代入②,得到的二元一次方程组的坐标曲线的某个极值(或者可能是切线、导数)就是要求的x值。
但是这个假设很快就被推翻,因为这两个方程式中的t并不是等同的概念,①中的t是一个变量,是从投放兵力开始到“现在”进行了多少秒,②中的t是一个定量,是整个杀死龙的过程需要的时间。
▲第二次推理(错误)
依然审视第一次推理重的两个方程式并对其概念进行修正,得到一个新的方程:
① y=x-2/3ta (a=0,1,2,3……n) ta为开始攻击到杀死龙之间的任意时刻
② 12yt=2300
将二式结合可得:12[(x-2/3t1)+(x-2/3t2)+(x-2/3t3)…+(x-2/3tn)]t=2300
此时考虑是否使用:多玩数学帝:告诉你多少弓箭手可以杀死一只龙
求0到n秒区间的定积分?
错误分析:想象一下弓箭手与龙的互搏过程,可知不论是弓箭手还是龙,总是在特定的时间节点进行攻击,整个进攻过程是一个 攻击-准备-攻击-准备 的过程,而非连续。
相应的,龙的生命值也仅在整数秒时扣除,并非平滑持续下降。如果使用积分计算,则等同于视作弓手每时每刻都在持续攻击,与实际情况恰恰相悖。
▲第三次推理(正确)
由此我们得到了一个大致的坐标图形:
轴(n)为时间,Y轴(x)为弓箭手的数量
由于弓箭手是每1.5秒消失1个,因此弓箭手数量的递减是一个准线性的过程(黑色斜线),斜率为-30度。但是由于弓箭手是相对独立的单位,不存在小数的概念,因此实际弓箭手的数量是一个阶梯状(蓝色折线)。
以弓箭手攻击间隔1秒为单位,取若干个瞬时的x值(瞬时弓手数量,图中红线表示),这些取值之和乘以弓手的基础攻击力12,应该等于龙的生命值2300。
接下来,我们做一个相对直观的时间轴图示。由于龙的攻击间隔为1.5秒与弓箭手的1秒并不同步,因此取二者的最大公约数0.5秒为一个参照单位,并假设弓箭手数量为100。
PS:这里我们根据经验,在龙和弓箭同时出手的时间节点(例如第3秒),考虑到飞行弹道的问题(龙的火焰实际为攻击动画,不存在飞行过程,这一点和弓箭的飞行弹道有本质区别),龙的伤害是瞬时生效的,而弓箭必须经历一个飞行过程,接触到目标才造成伤害。
因此,此时默认弓箭先死(下同)。请不要过于纠结这个问题!(因为游戏系统也有可能判定“同时出手”,即弓箭手死的一瞬间箭已出手,这一点我们无法求证,所以不展开讨论,只取想定的情况进行讨论,3秒时默认弓箭死亡未造成伤害)。
删除弓箭手作攻击前摇的时间节点(0.5的单数倍节点),此外由于开始建模时想定t=0的时候攻防双方都未攻击,因此第一节点也未造成伤害,删除。接下来观察时间轴末端,最后一个时间节点,由于剩下最后一个弓箭手,也是没有进行攻击的,删除。(具体参照上一段的想定)
OK,接下来我们看看剩下来的一组数字:
100,99,98,98,97,96,96,95……3,2,2,1
不难发现这是由两个等差数列构成的一个符合序列。分别为
①100,99,98,97,96,95……3,2,1
②98,96,94,92,90……6,4,2
去除常数,还原未知数x, 两个序列的公式分别为
①x,x-1,x-2,x-3,……3,2,1 (共x项)
②x-2, x-4, x-6,……4,2 (共x/2-1项)
这些若干节点的弓箭手数量乘以12的攻击力,等于龙的生命值2300,根据等差数列求和公式,得到如下方程式:
12[(x+1)x/2+(x-2+2)(x/2-1)/2]=2300
》 x=(2300/9)^(1/2)=15.9861050
向上取整,得x=16,这就是我们最终需要的数值。
【三】结论
为了方便查证,将1-6级弓箭对应1-4级飞龙需要的个数做成了表格图片。
【四】补充说明及修正
1、建模时,环境设置为所有弓箭手一次性投放到位,此为理想状态。实际操作中根据每个人手速及游戏习惯不同,可能需要数秒完成整个兵力的投放。
若手速较快(3秒内所有兵种投放完毕)可在所有结果后+1进行修正,若手速较慢(3-6秒投放完毕)可在所有结果后+2进行修正。实际测试结果略有出入,不过影响不大。
2、弓手位置在实际操作中很难把握0.3的空间间隔防止飞龙溅射,可以根据实时战况增加弓箭手投放数量,这一点有一个经验积累的过程,故在此不展开讨论。
【后记】
这篇帖子酝酿许久,也写了许久。从思路到完成,包括中间推导制图的过程,耗时超过12小时。因为数学是作者读书时最差的功课,而今离开学校也很久很久,很多公式、思维方式更是记忆模糊。因此,这篇帖子完成后依然深感不安,总是觉得哪里会有错误……如果确有不妥之处,希望大家谅解并及时给予批评指正,我将虚心接受。
上一篇:《部落战争》更新后及时调整杯打法
相关评论
还没有任何留言,赶快来抢先发表吧!