PlayPendium
Bulwark · 思考的食粮

军阀如何思考

单人游玩时,四座城堡中有三座由机器守卫。每个电脑军阀都在跑同一段短短的循环:找出值得畏惧的那颗球,猜它会在哪里越过你的墙,滑过去迎上它——而软柿子与劲敌之间的差别,归结为四个数字。

简单 · 瞄准抖动 0.18 以轨道长度为单位的误差
对阵
困难 · 瞄准抖动 0.015 近乎完美的落位

本文以英文撰写和编辑。此中文版本由机器翻译生成;凡涉及准确性之处,以英文原文为准。 阅读英文原文 →

01 · 选择该怕什么

并非每颗球都是威胁

军阀的第一项工作,每秒一百二十次,是分诊。场上最多有两颗球在飞,AI 必须决定哪一颗配得上它的护盾。它会给每一颗处于活动、未被握住的球打分,分值是该球到自家国王的距离,然后从任何确实正朝着自己那个角飞来的球的分值中,减去固定的 250 单位奖励——一颗正在远离的球,会被当作比实际距离远 250 单位来对待。1 分值最低的那颗赢得护盾的注意。

效果是一个不会为擦身而过、毫无威胁的球惊慌,却会猛地咬住一颗更近正在逼近的球的防守者。这是对人类不假思索之举的一个粗糙模型:盯住朝你来的东西,无视正在离开的东西。整个判断只是球的速度与指向国王的方向之间的一个点积,为正即表示“冲我来的”,这就够了。

02 · 猜它会落在哪里

领着球落到轨道上

选定威胁之后,军阀必须决定自己该待在它那条斜向轨道的哪个位置。它并不求解完整的弹跳路径:不做反射追踪,不预测撞墙。它取球的当前位置,沿其当前速度向前推一小步(0.12 秒的提前量),再把那个未来的点直接投影到轨道上,得到一个介于 0 和 1 之间的目标分数。1

这是刻意为之的浅层预测,也正是这个 AI 可以被击败的原因。因为它只提前八分之一秒,且从不预判折射,一颗要经由撞墙才会到来的球就能骗过它;它押的是球此刻所指的方向。懂得让球撞击场地边缘反弹的人类,正是在利用这个盲点。机器以一丝丝前瞻回应当下;它并不谋划。

电脑并不计算球的未来。它向前倾八分之一秒,把护盾指向“若无事发生,球将会在的位置”,然后把一切“有事发生”都留作你的机会。

03 · 三个档位,四个旋钮

难度是一张表,不是一次重写

三种难度共用同一段代码本体。在简单、中等和困难之间改变的,是一行四个调校数字。1 抖动为护盾的目标位置添加随机误差,于是简单档军阀的瞄准会偏离将近其轨道的五分之一,而困难档几乎分毫不差。反应距离规定一颗球必须靠得多近,军阀才肯去追踪它:简单档会无视任何距其国王超过 420 单位的东西——略小于棋盘宽度的一半;困难档则在整片场地上全程追踪。接球概率是它抓住一颗足够靠近其护盾、可被接住的球的几率。而“瞄准对手”是一个开关,它决定这个军阀到底会不会进攻。

AI 调校表——各档位之间的全部差别
旋钮简单中等困难
瞄准抖动(轨道分数)0.180.070.015
反应距离(单位)4207002,000
接球概率0%25%55%
是否瞄准对手?

这四个数值全部来自 Bulwark 游戏引擎内部一张小小的调校表,每个档位一行。困难档的反应距离写作场地宽度的两倍,而场地是 1,000 单位见方,所以 2,000 单位意味着“永远在追踪”。1

04 · 当机器发起进攻

让困难档军阀变得危险的那一个开关

简单档或中等档的军阀从不为了打击而接球。简单档根本不会接球,中等档也只是偶尔接上一次,而且球一旦到手,它对该拿它怎么办并没有任何计划。拨动“瞄准对手”这个开关——只有困难档才会这么做——AI 就不再是纯粹被动反应的了。当它握住球时,它会环顾棋盘,挑出伤得最重的对手(剩余砖块最少的那个),然后瞄准它。1

它做这件事不用任何寻路。它沿自己的轨道采样十一个候选位置,对每一个都复现引擎的释放运算,看那一击会朝哪个方向飞出,然后保留出射向量最直接指向所选猎物的那个位置。1 这是在少数几个选项上的暴力穷举,而非什么聪明才智,但它很有耐心:选定位置之后,军阀会一直握着球,直到护盾真的滑到那里,只有在抵达之后、或是握得够久以至于再等下去比这一击本身更划不来时,才会松手。这份意图无疑是战略性的,正是一个人类在猎取一个唾手可得的人头时会做的事。以“砖块最少”来挑选目标,意味着三个各自为战的防守者会一齐指向本来就已经落后的那一个。

05 · 每一次都是同一个军阀

可以重放的随机

军阀所做的每一件“随机”的事——瞄准中的抖动、要不要接球的抛硬币——都取自一个带种子的生成器:一段名为 mulberry32 的紧凑例程,它把一个起始数字变成一长串可重复的伪随机值。2 给它同一个种子,它就永远产生同一串序列。实战对局的种子取自时钟,所以没有两局的开场是一样的;但把同一个种子交回去,这一局就会分毫不差地重演:同样的发射角度,同样的偏摆,同样的接球。

这种确定性不是装点门面的细节。它让这款游戏可被测试——它的测试套件会从固定的种子出发,打完整局电脑对电脑的比赛,并期待每次都得到相同的结果;它也让整个模拟(连同生成器的游标)可以被打包成 JSON 再重建,于是在线对战时主机可以流式传送自己的状态,而其他每一位玩家都能重建出一模一样的棋盘。军阀们之所以显得活生生,是因为他们的失误看起来很像人;而在底下,他们的“本能”不过是一段短短的算术递推,任何人都能把它倒回起点。事实证明,一台守卫城堡的机器,只需要少数几个数字和一股可复现的运气。2

Sources & notes
  1. Bulwark game engine: the warlord AI. Threat scoring (distance from a ball to the king, minus a 250-unit bonus for inbound balls), the 0.12-second lead used to project the intercept point, the tuning table that holds jitter, react distance, catch chance and the aim-at-rivals switch for each tier, the “most wounded rival” target selection, and the eleven-sample search over release positions. Read from the game's own source.
  2. Bulwark game engine: the deterministic random generator, an implementation of mulberry32, the compact public-domain algorithm by Tommy Ettinger that maps a 32-bit seed to a repeatable stream. Its own comment notes that it seeds ball launches and AI jitter so that games are reproducible and testable, and it can save and restore its cursor so the state round-trips through JSON. Read from the game's own source.
    Algorithm origin: Tommy Ettinger, “Mulberry32 PRNG” (public domain).
Was this worth reading?
Play Bulwark
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Classic arcade games · © 2026