Screeps 夹击战术

作者: masterkeze | 来源:发表于2022-06-21 23:43 被阅读0次

    Screeps Arena 正式上线一段时间了,笔者主要玩的是SAS模式,这个模式下,地图布满沼泽,高速单位因为能够灵活拉扯,受到很多玩家的欢迎。很多玩家都喜欢出满速的远程单位,通过放风筝消耗来击杀近战单位。本文将详细介绍一种反风筝的方法——夹击,用来终结满速的远程单位,原理来源于Screeps歼灭战战术。战术的实际应用还需要经过适当的战力评估、战场分析,本文不做讨论。本文中使用到的一些参数,并不代表最优解,仅作参考。

    名词解释

    在开始之前,先对下文中将会频繁使用的一些名词做一下解释:

    1. 满速:move部件数至少是其他部件数的5倍,这种配置的单位,在沼泽上不会产生疲劳,如履平地

    2. 红球:attack(红色)+move组成的单位

    3. 蓝球:ranged_attack(蓝色)+move组成的单位

    4. 一体机:ranged_attack+heal+move组成的单位,一边奶一边打,俗称一体机

    5. 锁定:通过移动己方单位,尽可能让敌方单位保持在我方单位的某个方向上,举个例子:”让己方单位在↑方向锁定敌方单位“,表示通过移动己方单位,让敌方单位始终处于己方单位的↑方向上

      蓝色为己方单位,红色为敌方单位
    6. 代价矩阵:costmatrix,自定义寻路时使用的参数,地图上的每个格子都可以设定不同的代价(cost),代价越高的格子,寻路时越不容易经过他们

    应用场景

    己方:两个满速的红球(至少不能比敌方慢)

    敌方:一个蓝球或一体机

    这是最简化的模型,实际战斗中,通过合理的配置,2v2,2v3都是可行的。

    战术的最终目标

    让己方红球贴住敌方单位,就达成了“反风筝”的目的。

    战术细节

    先思考一个问题

    在什么情况下,己方单位能够确保在n tick内贴住对方?

    最直觉的想法:当敌方单位走进死胡同,或者被己方单位包围的时候。

    死胡同.png
    包围.png

    再进一步,为什么我们会觉得这种情况下,能够贴住敌方单位?这种想法的本质是什么?

    当敌方单位的“活动空间”被我方单位的“活动空间”完全覆盖时,即敌方单位在n tick内所有的去处,都能被我方单位在n tick及更短的时间内抵达,就可以认为“合围”已经完成了

    对付被“合围”的单位,只要锁定+逼近,就能达成贴住对方的目的(一些极端地形除外),详见Screeps歼灭战战术

    img

    合围机会的嗅探

    在实际战场中,随着战斗的推进,合围的机会转瞬即逝,如果能抓住这些机会,取得击杀,那就再好不过了。然而常规方法计算合围机会的复杂度相当高,笔者提供一种O(n)复杂的算法,来嗅探这些机会。

    1. 首先设定一个机会嗅探参数n,这表示n tick内的合围机会
    2. 找出己方所有可以参与合围的单位,给这些单位进行二进制编号:1,2,4,8 ....
    3. 新建一个空的代价矩阵,轮询这些单位
      1. 仿真出该单位n-1tick内所有可抵达的位置(用n-1是增加机会的可靠性)
      2. 在代价矩阵中,将这些位置上的代价加上该单位的编号数值
    4. 找出敌方所有你想合围的单位
    5. 轮询这些单位
      1. 仿真出该单位n tick内所有可抵达的位置
      2. 查询代价矩阵中这些位置的代价值:如果所有位置代价值都>0,说明该单位已经被合围
      3. 如果单位已经被合围,可以通过代价值反查出参与合围的己方单位,比如 3 = 2 + 1, 这就表示该位置,第一个和第二个己方单位都可以抵达

    实际运用中,可能会出现互相冲突的机会,这时候需要评估目标的优先级,再决定如何利用这些机会,这里不做展开。

    达成合围

    1 v 1情况下的合围,基本要依靠对方的走位失误,自己走进死胡同,这种机会一旦出现,就可以嗅探出来并加以利用,但是在大多数情况下,要完成合围,至少需要 2 v 1。像钳子一样,压缩敌人的活动空间,并完成合围,笔者将其称之为夹击战术。

    合围过程中的注意点

    1. 条件允许之前,不要和敌方的远程单位靠得太近,尽量不被消耗血量,保持速度

    2. 己方单位尽量分开行动,分开才能更好压缩敌人的活动空间

    3. 如果对方头也不回地逃跑,那也是追不上的

    这里需要先介绍一种实用的锁定技巧:通过设置代价矩阵,来引导单位在特定方向上锁定敌人

    合围1.png

    上图中,蓝色代表己方单位,红色代表敌方单位,如果希望蓝球在←方向上锁定敌方单位,可以这样设置代价矩阵:调高安全边界内,非锁定方向上的cost,让creep寻路时更倾向于找到该方向的路。

    合围2.png

    当己方单位处于安全边界内,即有受到伤害的风险,也可以用类似的方法,边逃离,边锁定方向。

    合围3.png

    在掌握了这种技巧之后,接下来讲讲如何确定锁定的方向

    确定锁定的方向

    首先考虑最简单的情况,敌方单位在我方两个单位的连线附近,这种情况可以近似认为是合围成功,直接按照当前方向锁定并推进即可:

    合围4.png

    其他的情况,都需要将当前的方向进行适当的旋转,作为锁定的方向。这里推荐是都旋转45度。

    合围5.png

    值得注意的是:锁定的方向不是固定的,他是根据实际的位置关系旋转后实时计算得来的,相对位置发生变化后,锁定的方向也会跟着变。通过不断旋转锁定的角度,最终促使合围完成。

    在己方的单位比较靠近的时候,容易出现这种互相交叉的锁定方向,需要避免这种情况的发生。

    合围6.png

    如果过程顺利,敌方单位要么提前被嗅探到合围的机会(因为地形的原因),要么处于己方单位的连线中间(两个锁定方向的夹角为180°),形成近似合围。

    如果敌方头也不回地逃跑,两个锁定方向的夹角则无法增大到180°,合围也就无法完成。

    因此,在实战中,这种战术对付蓝球的效果要比对付农民等非战力单位的效果好,因为前者总是回头想反杀,但这往往会加速合围的过程。

    结语

    整个战术从灵感发展成可执行的方案是最有意思的部分,而代码的实现和调参相对乏味枯燥(所以也鸽了很久),所以笔者把思考的过程分享出来,希望能对大家有所启发。

    相关文章

      网友评论

        本文标题:Screeps 夹击战术

        本文链接:https://www.haomeiwen.com/subject/vjjevrtx.html