Salvo · 思考的食粮
在点击格子这一简单动作之下,是一台确定性的引擎:它模拟隐藏的舰队、按概率加权的推理,以及隐藏与发现之间的经典对决。3
本文以英文撰写和编辑。此中文版本由机器翻译生成;凡涉及准确性之处,以英文原文为准。 阅读英文原文 →
游戏的核心是一对棋盘:一个代表你的隐藏布阵,另一个代表对手的隐藏布阵。每块棋盘上都有一支舰队,部署在划好格线的网格上,但舰船的位置对另一方是保密的。你向敌方网格开火,AI 则向你的网格开火,每一发炮弹要么击中舰船,要么落入空荡的海水。这种双棋盘架构确立了隐藏舰队对决中根本的信息不对称:每一方都完全了解自己的棋盘,却只能从自己射击的结果模式中推断对方的布局。3
正是这种设置的对称性赋予了游戏独特的性格。双方都无法直接看到对方的舰船。相反,双方都必须根据命中与未命中这些稀疏的反馈,在脑中构建隐藏网格的模型。每一发炮弹都成为数据,每一次命中都缩小可能性的范围,每一次落空都把一片区域排除在考虑之外。引擎的游戏协调器负责管理这两块棋盘,确保射击被记录、命中被正确归属,并且只有在一方的整支舰队全部被击沉时游戏才会结束。3
开局之前,引擎会以随机方式布置 AI 的舰船。这种随机并非毫无章法;它是有种子的,也就是说,给定的种子值总会产生相同的布局。这种基于种子的确定性是一项设计选择,让游戏可以复现、可以测试。如果你用同一个种子运行游戏,就会得到相同的舰船位置、相同的 AI 决策序列,而且只要你走出同样的着法,还会得到相同的结果。这一特性对于调试、对于理解 AI 在不同条件下的行为都很有价值。3
舰队一旦布置完毕,支配对局的规则就是固定且确定的。在 AI 确实需要随机选择的地方——在同样好的格子之间打破平局,或决定是否用声呐扫描——它取数的也是同一个带种子的生成器,因此没有任何东西交给外部的偶然。AI 做出的每一个决定都源于它所维护的概率模型,你射出的每一发炮弹都会被记录和分析。除了你自己的选择之外,唯一的变数来源是决定初始舰队布置的种子。这意味着游戏归根结底是一道谜题:在规则的约束和射击反馈的基础上,你能否在 AI 推断出你的布局之前,推断出它的隐藏布局?3
当你开火时,引擎会把这一发记录在目标棋盘上,并判断它是命中还是落空。这由引擎的一个步骤完成:它更新棋盘状态并确定结果。命中会把该格标记为有舰船占据,落空则把它标记为空荡的海水。随后,引擎会检查包含该格的舰船的所有格子,判断这艘船是否已被完全击沉。如果一艘船的所有格子都被击中,这艘船就被击沉,这一信息会同时告知双方。3
获胜条件简单明了,却影响深远。当对手的舰船全部被击沉时,一方获胜。引擎会检视对手棋盘上的每一艘舰船是否都已被完全击中,以此进行判断。一旦满足这个条件,游戏立即结束。获胜条件这种全有或全无的性质意味着每一发炮弹都至关重要。每一方会暴露什么,是由规则决定的:每次击沉都会公布沉没舰船的名称,因此对方能确切知道还剩哪些舰体;而一艘受伤的舰船若借助每局一次的重新部署溜走,也会留下痕迹,因为它原先格子上的命中记录会变回普通的落空。3
这个游戏里的对手不是简单的随机射手。它是一个按概率瞄准的 AI,会权衡每个隐藏格子藏有舰船的可能性有多大。AI 维护着一个关于敌方网格的概率模型,随着射击进行和反馈到来而不断更新。由于剩余舰船的放置约束而不可能藏有舰船的格子会被标记为不太可能,而为了容纳剩余舰船的放置必须藏有舰船的格子则被标记为很可能。然后,AI 会向概率最高的格子开火,把盲目猜测变成有依据的搜索。3
这个概率模型建立在可能性的数学之上,在那里,事件用介于零和一之间的数字来描述2。概率为零意味着事件不可能发生,概率为一则意味着事件必然发生。AI 利用这些数值描述来指导射击,优先选择找到舰船概率最高的格子。正是这种方法把这个 AI 与纯粹的随机射手区分开来,并赋予它标志性的搜猎行为。
AI 的行为可以分为两个阶段:搜寻与锁定。在搜寻阶段,AI 向尚未发现的舰船最可能所在的格子开火,以寻找舰船。这是一种大范围搜索,目的是首次接触敌舰。一旦记录到命中,AI 就转入锁定阶段,集中攻击命中格的相邻格子,把那艘船彻底击沉。这种两阶段方法与人类玩家的思路如出一辙:先找到舰船,再击沉它们。3
搜寻与锁定之间的切换取决于上一发是命中还是落空。如果上一发落空,AI 就回到搜寻模式,寻找概率最高的格子。如果上一发命中,AI 就进入锁定模式,向命中格的相邻格子开火。这条简单的规则与概率模型相结合,形成了一套在探索与利用之间取得平衡的连贯策略。AI 通过探索网格来寻找舰船,并利用对命中位置的了解来高效击沉那艘船。3
AI 有三档难度强度,用来调节它的行为。这些强度会影响 AI 权衡概率和做出决策的方式。在较低强度下,AI 可能会犯更多错误,或者在锁定目标时不那么激进。在较高强度下,AI 的概率计算更加稳定,锁定目标时也更加无情。多档强度让玩家能够找到适合自己的挑战水平,从休闲游玩到严肃对抗皆可。
这些强度的具体实现位于引擎的 AI 组件之中。难度等级会改变 AI 解读概率模型的方式,以及它在探索与利用之间取得平衡的方式。这种设计让 AI 既能让休闲玩家轻松上手,又能给有经验的玩家带来挑战,而无需改变游戏的基本机制。3
引擎是纯粹的、基于种子的确定性引擎,由它自己的带种子随机数生成器驱动。这意味着游戏的每个方面都由开局时提供的种子值决定。给定相同的种子,游戏总会产生相同的事件序列,从最初的舰队布置到最后一发炮弹。这一特性让游戏可以测试,因为同一场景可以被复现和检视。3
基于种子的确定性对理解游戏也有意义。如果你想了解 AI 在某个特定场景中的行为,可以用特定的种子运行游戏并观察结果。如果你想测试某种策略,可以用同一个种子多次运行游戏,看看它的表现如何。这种可复现性对玩家和开发者来说都是一项宝贵的特性。