Screeps 夹击战术
Screeps Arena 正式上线一段时间了,笔者主要玩的是SAS模式,这个模式下,地图布满沼泽,高速单位因为能够灵活拉扯,受到很多玩家的欢迎。很多玩家都喜欢出满速的远程单位,通过放风筝消耗来击杀近战单位。本文将详细介绍一种反风筝的方法——夹击,用来终结满速的远程单位,原理来源于Screeps歼灭战战术。战术的实际应用还需要经过适当的战力评估、战场分析,本文不做讨论。本文中使用到的一些参数,并不代表最优解,仅作参考。
名词解释
在开始之前,先对下文中将会频繁使用的一些名词做一下解释:
-
满速:move部件数至少是其他部件数的5倍,这种配置的单位,在沼泽上不会产生疲劳,如履平地
-
红球:attack(红色)+move组成的单位
-
蓝球:ranged_attack(蓝色)+move组成的单位
-
一体机:ranged_attack+heal+move组成的单位,一边奶一边打,俗称一体机
-
锁定:通过移动己方单位,尽可能让敌方单位保持在我方单位的某个方向上,举个例子:”让己方单位在↑方向锁定敌方单位“,表示通过移动己方单位,让敌方单位始终处于己方单位的↑方向上
蓝色为己方单位,红色为敌方单位 -
代价矩阵:costmatrix,自定义寻路时使用的参数,地图上的每个格子都可以设定不同的代价(cost),代价越高的格子,寻路时越不容易经过他们
应用场景
己方:两个满速的红球(至少不能比敌方慢)
敌方:一个蓝球或一体机
这是最简化的模型,实际战斗中,通过合理的配置,2v2,2v3都是可行的。
战术的最终目标
让己方红球贴住敌方单位,就达成了“反风筝”的目的。
战术细节
先思考一个问题
在什么情况下,己方单位能够确保在n tick内贴住对方?
最直觉的想法:当敌方单位走进死胡同,或者被己方单位包围的时候。
死胡同.png包围.png
再进一步,为什么我们会觉得这种情况下,能够贴住敌方单位?这种想法的本质是什么?
当敌方单位的“活动空间”被我方单位的“活动空间”完全覆盖时,即敌方单位在n tick内所有的去处,都能被我方单位在n tick及更短的时间内抵达,就可以认为“合围”已经完成了。
对付被“合围”的单位,只要锁定+逼近,就能达成贴住对方的目的(一些极端地形除外),详见Screeps歼灭战战术
img合围机会的嗅探
在实际战场中,随着战斗的推进,合围的机会转瞬即逝,如果能抓住这些机会,取得击杀,那就再好不过了。然而常规方法计算合围机会的复杂度相当高,笔者提供一种O(n)复杂的算法,来嗅探这些机会。
- 首先设定一个机会嗅探参数n,这表示n tick内的合围机会
- 找出己方所有可以参与合围的单位,给这些单位进行二进制编号:1,2,4,8 ....
- 新建一个空的代价矩阵,轮询这些单位
- 仿真出该单位n-1tick内所有可抵达的位置(用n-1是增加机会的可靠性)
- 在代价矩阵中,将这些位置上的代价加上该单位的编号数值
- 找出敌方所有你想合围的单位
- 轮询这些单位
- 仿真出该单位n tick内所有可抵达的位置
- 查询代价矩阵中这些位置的代价值:如果所有位置代价值都>0,说明该单位已经被合围
- 如果单位已经被合围,可以通过代价值反查出参与合围的己方单位,比如 3 = 2 + 1, 这就表示该位置,第一个和第二个己方单位都可以抵达
实际运用中,可能会出现互相冲突的机会,这时候需要评估目标的优先级,再决定如何利用这些机会,这里不做展开。
达成合围
1 v 1情况下的合围,基本要依靠对方的走位失误,自己走进死胡同,这种机会一旦出现,就可以嗅探出来并加以利用,但是在大多数情况下,要完成合围,至少需要 2 v 1。像钳子一样,压缩敌人的活动空间,并完成合围,笔者将其称之为夹击战术。
合围过程中的注意点
-
条件允许之前,不要和敌方的远程单位靠得太近,尽量不被消耗血量,保持速度
-
己方单位尽量分开行动,分开才能更好压缩敌人的活动空间
-
如果对方头也不回地逃跑,那也是追不上的
这里需要先介绍一种实用的锁定技巧:通过设置代价矩阵,来引导单位在特定方向上锁定敌人
合围1.png上图中,蓝色代表己方单位,红色代表敌方单位,如果希望蓝球在←方向上锁定敌方单位,可以这样设置代价矩阵:调高安全边界内,非锁定方向上的cost,让creep寻路时更倾向于找到该方向的路。
合围2.png当己方单位处于安全边界内,即有受到伤害的风险,也可以用类似的方法,边逃离,边锁定方向。
合围3.png在掌握了这种技巧之后,接下来讲讲如何确定锁定的方向
确定锁定的方向
首先考虑最简单的情况,敌方单位在我方两个单位的连线附近,这种情况可以近似认为是合围成功,直接按照当前方向锁定并推进即可:
合围4.png其他的情况,都需要将当前的方向进行适当的旋转,作为锁定的方向。这里推荐是都旋转45度。
合围5.png值得注意的是:锁定的方向不是固定的,他是根据实际的位置关系旋转后实时计算得来的,相对位置发生变化后,锁定的方向也会跟着变。通过不断旋转锁定的角度,最终促使合围完成。
在己方的单位比较靠近的时候,容易出现这种互相交叉的锁定方向,需要避免这种情况的发生。
合围6.png如果过程顺利,敌方单位要么提前被嗅探到合围的机会(因为地形的原因),要么处于己方单位的连线中间(两个锁定方向的夹角为180°),形成近似合围。
如果敌方头也不回地逃跑,两个锁定方向的夹角则无法增大到180°,合围也就无法完成。
因此,在实战中,这种战术对付蓝球的效果要比对付农民等非战力单位的效果好,因为前者总是回头想反杀,但这往往会加速合围的过程。
结语
整个战术从灵感发展成可执行的方案是最有意思的部分,而代码的实现和调参相对乏味枯燥(所以也鸽了很久),所以笔者把思考的过程分享出来,希望能对大家有所启发。