作为一个多人在线沙盒游戏,和别的玩家发生冲突可以说是不可避免的事情。本文简单介绍一下在 Screeps 中的防御方面,通过这篇文章,你将会了解到什么是最主要的防御手段,以及如何抵抗玩家发动的进攻。
开门见山
其实 screeps 的防御说白了就两方面:刷墙 和 提升硬实力,只要你的墙足够厚,敌人就会丧失进攻你的欲望。而只要你的实力够强,例如 Nuker 已经填充完成,Terminal 里有完备的化合物储备。只要能给敌人造成威慑,也能变相的给你的房间带来安全。
刷墙
咱们首先来看这第一点,刷墙。有很多新手玩家可能会觉得刷墙离自己比较遥远,但是我话就放这了:刷墙是仅次于升级的第二大工作。在你完成了房间的基本运营后,非常推荐第一时间完成刷墙相关的代码实现。哪怕你前期刷墙效率不高,但是只要你能完全围住自己的基地,那就基本上可以杜绝其他新手玩家的进攻了。所以越早的修建起围墙,你的基地就越安全(当然不能本末倒置,升级 Controller 才是最重要的 )。
首先,为了方便大家上手,咱们来了解一下几种修墙的门派:
堵门流:
这种是很多玩家采取的一种修墙策略,但是这种修墙方式有一个缺点,就是你的 creep 移动到墙的距离会很远,这就导致你的刷墙工会在寻路和移动上浪费更多的 CPU。
这种修墙方式的好处就是可以限制敌方进攻单位的展开,例如一些代码不够健壮的玩家在进攻时可能会出现只有攻击单位进来,而治疗单位站在入口开始反复骑墙,从而降低了其治疗能力。并且在高等级玩家的战争中,四人战斗小队是一个非常常见有效的进攻手段,堵门可以迫使进攻者选择其他的拆迁手段。
围家流:
这种修墙方式优点在于刷墙工可以在寻路移动上节省不少的 CPU,并且由于对方的进攻单位想要拆墙需要离你的基地更近,就可以更有效的提升 Tower 的输出效率。缺点在于没办法很好的保护墙外的单位,例如在 Source 或者 Mineral 旁采矿的 Creep。所以这种修墙方式一般都会在资源旁额外点一两个 Rampart 来保护采集单位。
值得注意的是,这种方式切记不可直接贴着你的建筑修墙,因为 拥有 RANGED_ATTACK
的单位可以隔着墙攻击三格以内的单位和建筑。所以要空出两格(加上墙三格)的距离防止敌人不用拆墙就能打到你的建筑。
围家流 plus:
这种是在上面策略的基础上,增加了 Rampart 的数量而成的。这个策略的优点在于给你的 creep 提供了更多的位置(废话),这个优势会在你的拥有主动防御时带来更好的效果。就像古代城墙的垛口一样,你的防御 creep 可以站在 Rampart 里直接攻击到敌方的进攻单位,从而给敌方造成更大的压力。当然,如果你想,你也可以完全使用 Rampart 来修建你的围墙,这可以给你的主动防御 creep 提供更多的攻击窗口。
这种修墙策略会提高城墙的维护成本,但是会更加的便于防御。而且给人一种大佬的感觉。这种修墙方式的应用也非常广泛。需要注意的是,由于 Rampart 有老化时间(100 tick 掉 300 hits),并且由于刚放下时只有 1 滴血。所以会很快消失。因此你需要提前好一些代码来使得你刚修好的 Rampart 可以站得住。
龟壳流:
你说这种方法吼不吼,我肯定给你说吼啊。这种修建方式 向外扩出一格的范围,为你的防御 creep 提供了充足的占位空间,同时 厚 3 格 防止敌方的 RANGED_ATTACK 可以直接越过墙壁攻击到建筑(当然你想全覆盖也完全可以 )。之前我们提到的策略的共同缺点就是:只要敌人可以破出来一个口子,那你的家就没了。而这种方法会使得敌人深陷战争的泥沼,可以说是修墙策略的集大成者。
这种方式唯一的缺点就是会耗费更多的能量来进行维护(其实并不是很多,维护一块 11 * 11 的 Rampart 区块需要 1089 energy / 300 tick ),并且 Rampart 的修建也会成为一个问题,如果上面的策略还可以通过过几分钟摆一个 Rampart 的方法来让新的可以站得住 。那这种方式就只能设计一套可靠的方案来提高其修建效率了。
对关键建筑的保护
如果你选择的不是最后一种修墙策略的话,那么可以在围墙完成后再在自己的关键建筑(例如 Spawn、Storage、Terminal 等)上放置 Rampart 来提高关键建筑的防御能力,这样对方就算破开了围墙也没办法在短时间内彻底摧毁你的基地,并且被对方种 Nuker 之后也可以更轻松的进行防御(或者重建 XD)。
对新手的建议以及墙的厚度
如果你是新手的话,推荐用第二种或者第三种方法,一方面不需要太多的能量用于维护,可以把更多的能量拿来升级。另一方面较少的 Rampart 可以更快的上手建造,从而减少前期的代码投入。在修墙的时候多观察地形,天然墙壁是最坚固的防御,在保证上面要求的情况下利用地形来减少修墙的数量。
在厚度方面,个人 并不 推荐修到一定厚度就不再修了。在刷墙的时候,应该尽可能的保证墙的厚度一直在同步增加,除非你的能量实在短缺。你可以通过给刷墙工添加“每隔一段时间就重新查找血量最小的墙体并缓存”的方式来保证所有墙壁的厚度均衡。在新建 Rampart 时要额外处理一下,保证刷墙工可以第一时间刷到新的 Rampart。
Tower 防御机制
其实相对于上面的围墙来说,tower 的防御逻辑优先级甚至要更低一点,在房间 8 级前用新手教程的 tower 逻辑(攻击最近单位)都没有问题。为什么呢,对于不会 boost 的新手来说,哪怕你只有一个 tower,在你的围墙没有缺口的情况下也很难打进来。而对于可以进行 boost 的大佬来说,你有 6 个 Tower 人家也可以一个 creep 轻松顶下来。
那么当你完成了围墙的修建之后,我们可以做些什么来升级一下 tower 的防御能力呢?下面我列出几个要点,你可以根据它们来升级自己代码的逻辑:
- 分析敌人身体部件:如果你的 Tower 只是简单的攻击最近目标的话,那么很容易被对方的的“高防”单位吸引走仇恨,所以通过分析敌人身体部件的方式,你可以确定哪些是不需要攻击(例如完全没有攻击性身体部件)以及那些是需要优先攻击(防御比较薄弱的奶妈)的。
-
不要进行重复搜索:tower 每 tick 都进行
Room.find
操作是很浪费 CPU 的,特别是对于房间内的多个 Tower 来说,单个 tick 内的重复搜索完全是无意义的,所以你可以通过在房间对象下添加非持久缓存的形式来实现每 tick 每房间只有一个 Tower 会进行搜索,从而节省 cpu 消耗。 - 缓存敌人信息:在 Tower 搜索到敌人后,将敌人的 id 持久缓存至房间内存中,然后多个 tower 进行集火。当发现这个 id 已经获取不到敌人时,重新进行搜索。通过这种缓存,你可以将 Tower 的搜索拉长到 3 tick 一次或者 5 tick 一次,从而在不影响攻击效率的前提下进一步的节省了 CPU。
主动防御
老爹曾经说过:要用 creep 打败 creep。上面提到了满 boost 的 creep 可以轻松的抗下 6 Tower 的全力输出。所以我们的防御不能完全只靠围墙和 Tower。在对方进攻时孵化 creep 来进行防御的行为被称为主动防御。当然,这部分你可以放在游戏中后期来做,毕竟面对满 boost 的 creep,你孵化一个菜鸡 creep 过去防御也基本等同于送。
主动防御分两种:修墙 和 对刚,在你孵化攻击性 creep 也打不动对方进攻单位时,就可以通过孵化大量的刷墙工的方式来减缓对方的拆墙效率。只要你能拖到对方进攻单位死掉,就算是阶段性的胜利。并且对方如果用Creep.dismantle
拆墙的话,那么墙外就会遗留大量的能量,在确保安全的情况下可以捡这些能量来重新刷墙。
对刚就毕竟简单了,如果你能打得过或者对方的进攻单位对 creep 没有处理能力,那么就可以孵化一些进攻性 creep 来进行反击,不一定要杀死它们,只要让它们没办法有效拆墙,你的防御就成功了。
另外,你也可以对 Tower 的逻辑做一些修改,如果发现无法击杀掉敌方 creep 的话,就转而修复对方攻击的那块墙壁。你拆哪个我修哪个。可以通过 Room.getEventLog() 快速找到哪块墙壁受到了攻击。
提升硬实力
虽然这个对于新手来说等于没说,但是如果你上线了新的模块,就尽可能的把它们的效果展示出来,不要怕装填 Nuker 浪费资源,战备化合物生产了不用放着占地方。只要对方能看到,那这就是威慑。另外向外扩张的时候 在保证房间可以相互支援的情况下尽可能的往远处扩张,如果对方没办法第一时间消灭你所有有生力量的话,那么他发起速攻的可能性就小了很多。
另外,提高代码的健壮性也是很有必要的一点,敌人进攻时你的代码出错崩掉是非常致命的。接下来是几个设计提示:
- 注意变量的空值处理,尤其是那些通过
Game.getObjectById()
获取到的对象,在使用之前请务必判断其是否存在。 - 如果你对某段代码(特别是新代码)不放心的话,
try/catch
也是很有用的。但是要注意 catch 里不要什么都不写,防止出了错完全找不到什么地方导致的。 - 如果条件允许的话,可以通过在私服中直接拆除某些关键性建筑的方式来进行冒烟测试,借此来观察代码在缺少关键建筑情况下的运行稳定性。
-
TypeScript
可以有效的减少因为笔误或者重构埋下的隐藏性 bug。但是相应的增加了开发成本,如果你有兴趣的话可以通过 《Screeps 使用 TypeScript》 来了解更多信息。
关于前期是否应该刷墙
目前有不少大佬觉得前期(RCL 1 - 7)是不用刷墙的,理由如下:
- 前期能量应该都用来冲级
- tower 能防住的进攻没墙也能防住,而 tower 防不住的进攻刷墙也防不住。
其实在我看来,前期在保证升级的情况下还是应该及早刷墙的。我从下面三个方面对比一下新老玩家的区别大家就明白了:
- 老玩家:升级策略比较熟悉,可以更快速的升级。
- 新玩家:不熟悉升级流程,没有健全的代码逻辑,前期时间会更长。并且能量利用率不足。
- 老玩家:有其他房间支持,别的玩家进攻时会有顾虑。
- 新玩家:房间比较少,别的玩家进攻会更肆无忌惮。
- 老玩家:开房代码完善,新房被推了重新执行一条命令就可以了。
- 新玩家:代码不够完善,被推了可能会导致要修改大量的代码,成本更高。
所以说,新手开新房被推的成本要远高于老玩家。并且,想象一下这个场景:一个玩家要去进攻另一个玩家,从你家路过,然后顺路拆毁了你家的大部分建筑(并且他甚至都不知道推了你 )。别人路过一下你家就没了,憋屈不憋屈。
现在假设我们修了墙,顺路被干死的情况自然不存在了。就算有老玩家真的要来进攻我们,有墙的存在起码可以拖延一会(可能一个小时也不到,但是对于没有自动开安全模式的玩家来说这段时间足够你上号手动打开安全模式了)。然后呢?别想了打不过的,这时候进群大喊:我被打了!房间在哪哪哪,附近有没有大佬能救救我!对于大佬来说,有可能只是动动手给打你的人发条信息;而对你来说,这如同新生。
那如果我没修墙呢?对面进来两分钟推完走人了,你可以对着一地的废墟呼叫大佬替你报仇,但是,这真的值得么。
所以说,如果你是新手、又想种田、又怕死(像我一样),那么请赶快刷起你的墙,它虽然可能不厚,但是足以给你温馨的小家一点保护。对了,Q 群在这里 Screeps>_编程游戏小组,请。
总结
好了!本篇文章跟大家一起探讨了下 Screeps 里进行防御的几个重点:不影响升级的情况下尽早开始刷墙,其次升级 tower。并且日常开发时注意代码习惯,减少代码崩溃的可能性。接下来,你可以通过 《Screeps 游戏盾与矛 - 进攻》 来更进一步的了解本文中提到的各个要素。
了解更多 Screeps 的中文教程?欢迎访问 《Screeps - 中文系列教程》!