























16 tylearymf 5 月 26 日可以,接着你可以这样讲,语气偏“技术分享”,但不至于太论文味: --- 接下来我就把坦克拆成了一个真正的 agent 系统。 它不是每一帧简单判断“敌人在不在前面,在就开火”。如果这么写,前期确实能赢一些弱对手,但很快就会遇到问题:敌人在草丛里看不见、子弹 1 帧飞两格、星星比击杀更重要、地图边缘看起来能走但下一帧必死。 所以我把它拆成三层。 第一层是**感知层**。 每一帧开始时,我先把游戏状态整理成一个 `ctx`。这个 `ctx` 里面有我的位置、方向、敌人的位置、敌人的方向、星星位置、比分、地图、子弹、技能状态。 同时还有一个跨帧记忆 `AG_MEM`。 ```text 这一步其实就是把“游戏画面”变成“可计算的战场状态”。 --- 第二层是**风险评估层**。 这个阶段我不是马上决定动作,而是先问几个问题: ```text 这个地方是后期变强的关键。 比如有一局我以为代码里已经判断了“死路”,但还是跑到了地图边缘被打死。后来复盘发现,那一格从地图几何上看不是死路,因为它还有好几个出口;但从战术上看,它是死路,因为敌人下一步一移动,就能跟我同线,然后一转头开火,而我从那个格子逃走需要两帧。 所以后来我加的就不是简单的 `safeExits <= 1`,而是类似: ```text 如果敌人开火比我脱离更快,那这个格子就算不是墙,也应该判成危险格。 这就是从“地图判断”升级成了“战术预测”。 --- 第三层是**优先级仲裁层**。 也就是 `choose()`。 我后来发现,很多坦克代码的问题不是没有策略,而是策略之间会互相抢优先级。 ```text 我想草丛反击 我想追杀敌人 所以我把整个决策链排成了优先级: ```text 这里有个很重要的思想: > 最强的 agent 不是每次都选最激进动作,而是每一帧都知道当前最不能犯的错是什么。 比如子弹来了,那就不要想击杀。 --- 然后我会讲一个具体例子。 比如草丛反击那一版,最开始的问题是:敌人藏起来后,我的坦克会进入一种“反伏击”逻辑,试图横向脱离或者预判敌人位置。但有时候星星就在附近,这时候最重要的不是躲草丛,而是抢星线。 所以后面我加了一个 `nearStarContestAct`。 它的作用不是“无脑吃星”,而是判断: ```text 如果满足条件,就优先抢星位。 这就是一个很典型的迭代: --- 然后再讲隐身。 我这辆坦克是 cloak 技能,但我后来发现,隐身不能当万能保命按钮。 很多时候原地隐身其实没用,因为敌人已经知道你上一帧在哪里。你如果隐身后不移动,子弹照样打到你。 所以现在隐身逻辑里面有几个不同模块: ```text 也就是说,隐身不是一个动作,而是一段战术流程: ```text 这个也是后面从失败里磨出来的。 --- 最后我会讲整个训练闭环。 我每次不是凭感觉调参数,而是这样做: ```text 比如一次失败可能最后变成一个新规则: ```text 这些规则单独看都不大,但叠起来之后,坦克就从“会打架”变成了“会做战术决策”。 --- 最后收束可以这样说: > 所以我觉得这件事最有意思的地方,不是 AI 一次性帮我写出了最强坦克,而是 AI 帮我搭了一个 agent 的思考框架。后面真正变强,是我不断用真实对局去撞这个系统,把每一次输局都转成一个更精确的判断。 |
34 tylearymf 5 月 26 日## 几个有意思的设计点 ### 1. 未来一帧死亡预测器 早期我只判断“当前位置有没有危险”,后来发现不够。 所以我加了一个短期预测: - 我走到这个格子 如果敌人击杀我的时间更短,这个格子就被视为危险。 这个点最有意思的是: --- ### 2. 隐身不是按钮,而是状态机 这辆坦克有隐身技能,但我很快发现,原地隐身没有意义。 所以我把隐身拆成几步: 1. 判断是否值得开隐身 隐身的核心不是“消失”,而是制造位置差。 --- ### 3. 草丛反击和抢星会打架 有一类局面很有意思:敌人藏起来,我的系统会进入反伏击模式。 早期有一局就是这样:系统为了处理隐藏敌人,错过了更重要的星位。 > 在关键星位附近,控星优先于反伏击。 这不是说反伏击不重要,而是说不同规则之间必须有优先级。 --- ### 4. 躲子弹本质是时间竞速 子弹一帧飞两格,所以不能只看“子弹现在在哪”。 - 子弹几帧后到我这里 如果子弹到达更快,我就不能选择那个动作。 这让躲弹从简单坐标判断,变成了一个时间问题。 --- ### 5. 星星不可达时,先创造条件 有些地图里星星被土堆挡住,直接寻路会失败。 后来我加了一个目标分解逻辑: - 如果星星当前不可达 这其实就是从“追目标”变成了“先创造追目标的条件”。 --- ### 6. 每次输局都变成一个窄规则 我不是一次性写一个大而全的智能体。 - 看失败回放 每条规则都尽量窄。 窄规则的好处是副作用小,也更容易验证。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。