我在《土豆兄弟》里寻找那条"绝对安全路径"——一个数学问题引发的游戏模组
我在《土豆兄弟》里寻找那条”绝对安全路径”——一个数学问题引发的游戏模组
事情的起因说出来你可能不信。
不是想做外挂,不是想让 AI 替我肝,而是一个数学问题。
那段时间我不知道抽什么风,脑子里突然蹦出一个念头:《土豆兄弟》和围棋,是不是同一种游戏?
别笑,你听我说完。
围棋的核心是什么?用棋子围住空间。你落子不是为了吃掉对手,而是为了确保自己有一块”活棋”——一块对方永远无法侵入的区域。对手的棋子一圈一圈围上来,你要在这些包围圈合拢之前,找到那个能让你活下来的形状。
《土豆兄弟》呢?敌人从四面八方围过来,弹幕像雨一样洒下来。你要做的,就是在这些威胁之间走位,找到那条能让你活到下一波的路线。本质上,也是在用空间换生存概率。
围棋有”最优解”吗?有。AlphaGo 证明了,在任意给定的盘面上,存在一条胜率最高的路径。
那《土豆兄弟》呢?
在任意给定的敌人配置下,是不是也存在一条路径——一条近乎 100% 安全的路径,只要沿着它走,就不会掉血?
理论上应该存在。但我翻遍了全网,没有人算过。连讨论的人都没有。
行吧,那就自己来。这就是我写这个模组最初的动机。
我需要一把手术刀,所以先造了一把
要验证这个问题,我需要三样东西。
第一,游戏内部的所有数据。敌人的坐标、血量、移速、弹幕的方向和速度,我的位置,墙在哪里。第二,能够控制角色走位的接口。第三,能够反复实验、记录、分析的环境。
说白了,我需要一个可编程的沙盒。但游戏本身不提供这些东西。
那就自己造。
《土豆兄弟》是用 Godot 引擎做的,Godot 支持模组加载。我在游戏里嵌入了一个 HTTP 服务器,用 REST API 暴露所有游戏数据,同时接受外部控制指令。请求走 localhost,延迟不到 16 毫秒,数据全用 JSON 传输。
结构很简单:
GET /api/enemies→ 所有敌人的位置、血量、伤害GET /api/player_pos→ 角色的精确坐标和速度GET /api/stats→ 血量、等级、金币POST /api/move→ 告诉角色往哪走POST /api/release→ 把控制权还给键盘
有了这把”手术刀”,我就能像一个实验员一样,在游戏运行的时候读取每一个变量,在毫秒级别下达指令。
从围棋到《土豆兄弟》:那个数学直觉是什么
围棋和《土豆兄弟》的数学本质,可以用同一个词概括:可行域收缩。
在围棋里,你的安全区域被对手的棋子逐渐侵蚀。每一步,对手都在缩小你的”眼位”,直到你的区域小到无法做出两个眼,你就死了。
在《土豆兄弟》里,安全区域被敌人和弹幕逐渐侵蚀。每一秒,新的敌人刷新,弹幕飞过来,你的可移动空间在缩小。一旦空间小到你的碰撞体积逃不出去,你就掉血。掉到零,你就死了。
围棋中的”活棋”,对应《土豆兄弟》中的”安全位置”。
AlphaGo 找到最优解的方法,是计算每一条可能路径的胜率期望。那我能不能做一件类似的事——在《土豆兄弟》的每一帧,计算空间中每个点的”危险度”,然后找到那条穿越危险区域但总代价最低的路径?
这听起来像是一个连续空间中的路径积分问题。有敌人的碰撞伤害,有弹幕的飞行轨迹,有地形边界的约束。如果能把它们抽象成一个统一的危险度函数,那”绝对安全路径”就是这个函数梯度下降的积分曲线。
当然,这是理想情况。实际情况是弹幕是随机的,敌人的移动模式有噪声,我的走位也有误差。所以”绝对安全”做不到,但”以极高概率安全”可能是存在的。
我需要数据来证明。而我现在有工具了。
把接口文档丢给 AI,它真的玩起来了
写模组的时候我脑子里全是公式,根本没想过 AI 的事。
但写完以后,我忽然意识到:我做的这个东西,不就是一个完美的 AI 沙盒吗?
我把 API 文档丢给 Claude Code,说:”写一个 Python 机器人,每个决策周期查询敌人位置,向最近敌人的反方向移动,保持存活。”
它真的写出来了。100 毫秒一次轮询,计算距离,反向移动,最后释放控制权。连 finally 块都自己加上了。
我看着屏幕上的土豆自己走位、躲怪、活到了第 15 波。
说实话,那一刻比我手动通关还兴奋。但兴奋的点不一样。我兴奋的不是 AI 能玩游戏,而是我亲手搭建的这座桥梁——让一段代码变成了屏幕上活生生的行为——它真的通了。
从数学问题到开源模组
我把这个模组打包上传了。
Steam 创意工坊:https://steamcommunity.com/sharedfiles/filedetails/?id=3753990805
GitHub 开源:https://github.com/s1yle/Brotato-HTTP-server
模组目录里还附带了一个 python_example 文件夹,里面有可以直接跑的 Python 脚本,方便你交给 AI 去改。完整的 API.md 也在里面,所有接口都有说明和示例。
至于最初那个数学问题——那条”绝对安全路径”到底存不存在——我现在还没有答案。但这个模组至少让我有了探索它的工具。
如果你懂数学、做强化学习、或者单纯对这个命题感兴趣,欢迎拿去玩。说不定你能比我先算出来。
一个小小的感悟
以前我觉得,”探索一个数学猜想”和”写一个 Steam 模组”是两件完全不搭界的事。
后来发现,它们本质上是同一件事:你对世界的某个部分感到好奇,于是你动手造了一个工具去看清楚它。
不管这个工具是代码、是模组、还是一个 HTTP 服务器,它的价值不在于技术有多难,而在于它能让你靠近那个你最初想知道的答案。
所以,如果你脑子里也有一个奇怪的问题,别让它留在那里。
造一把手术刀,切开看看。
GPLv3 开源,基于 Godot Mod Loader。如果你用这个模组做了什么研究或整了什么活,记得告诉我。那条路径,说不定是你先找到的。