| name | game-ai-strategy-design |
| description | BoardGame 策略型 AI 设计/重构流程。用于优化打法、评分器、英雄/派系/卡组画像、掷骰/出牌/选技能策略。 |
Game AI Strategy Design
目标
把“能动的 AI”升级成“像会玩的人”的 AI。默认先理解游戏目标、局势评价和玩家反馈,再把策略拆成可解释、可测试、可逐步调参的模型;不要靠继续堆单点 if 解决“AI 蠢”的反馈。
先锁定前提
动代码前必须说清四件事:
- 问题对象:具体是哪款游戏、哪个阶段、哪类决策,例如王权骰铸的掷骰追击、选技能、打改骰牌。
- 真相来源:玩家反馈、现有测试、源码、攻略/规则资料、成熟游戏 AI 对比,哪些已经命中症状。
- 目标入口:本地 AI、远程 AI、移动端表现、线上 OTA 版本还是测试环境。
- 验收口径:用哪些回归场景证明更聪明,例如“不改掉三个 6”“小顺子继续追大顺子”“普攻不抢低阶技能”。
缺任一项时,先补证据或向用户问最小问题,不要直接改。
设计流程
1. 先复盘真实反馈
- 把玩家说法翻译成决策失败模式:短视、拆好牌、不会追大招、不会留资源、不会阻止对手、不会看胜负点。
- 找到对应动作入口:legal actions、评分器、投影函数、局势估值、阶段推进或卡牌交互。
- 写出反例场景:当前骰面/手牌/资源/回合数/可选动作,以及好玩家通常会做什么。
2. 再读成熟参照
- 优先对比仓库里已成熟的同类 AI,例如大杀四方的局势评分、VP swing、阻止对手、派系标签、局部模拟。
- 只迁移思想,不硬搬数值。先问:这个游戏的“赢分”是什么,当前行动如何改变胜率。
- 输出差距结论:当前 AI 是阶段专家、全局局势评估器、资源管理器,还是只是一组动作偏好。
3. 拆成三层模型
- 打法画像:英雄、派系、卡组或角色偏好。说明它偏爆发、控场、资源、抢节奏还是防守。
- 局势/期望模型:用可计算指标表示好坏,例如伤害期望、得分差、成功率、缺口、风险、剩余机会、资源消耗。
- 行动执行模型:把评分落到真实合法动作,例如锁骰、重投、打牌、选技能、弃牌、结束阶段。
任何新策略都应能落到这三层之一。落不进去的 if,通常需要重新设计。
4. 给每个策略写反例测试
至少覆盖:
- 玩家反馈中的原始坏例子。
- 高收益但需要忍住低阶收益的例子。
- 没有资源/机会不足时不硬追的止损例子。
- 与旧合同相邻的稳定性测试,避免修聪明后又卡死或非法动作。
测试名用中文描述玩家能听懂的行为,不只写内部函数名。
5. 重构优先级
优先做:
- 把上下文、候选生成、评分、动作优先级拆开。
- 把“当前已成技能”和“更高目标追击”分开评价。
- 把资源牌/改骰牌/重掷机会作为概率加成或成本,而不是写死必追或不追。
- 保留可调权重的集中位置,方便后续按英雄/难度调参。
暂缓做:
- 在一个评分器里继续加长条件分支。
- 为单个反馈写死某个骰面或技能 ID。
- 为了通过一个测试牺牲大部分普通场景。
验证口径
每轮策略改动至少跑:
npx eslint <改动的 ai.ts 和测试文件>
- 相关游戏的新增策略测试。
- 至少一个相邻合同测试,确认合法动作、响应窗口或阶段推进没有回退。
如果涉及线上反馈,最终汇报要区分:
- 策略优化:AI 会更倾向于好玩家打法。
- 不是 bug 修复:除非原来违反规则或产出非法动作。
- 仍需调参:玩家水平反馈会继续暴露权重问题。
DiceThrone 经验
王权骰铸的掷骰 AI 不应只看“当前能发动什么”,还要看:
- 剩余投掷次数。
- 已匹配骰子数量和缺口。
- 小顺子、大顺子、五同、大招之间的收益差。
- 当前已成技能的保底价值。
- 手牌里可负担的改骰/重掷牌。
- 失败后是否还能保住当前收益。
“继续追大招”不应写死成有改骰牌才追;改骰牌只是显著提高追击倾向。像三个 6 这种接近大招的局面,即使没有牌,也应保护关键骰并继续评估追击价值。
与 game-ai-adaptation 的分工
- 用本技能处理“AI 怎么变聪明、怎么像会玩的人、怎么设计评分模型”。
- 用
game-ai-adaptation 处理“AI 能不能合法动、会不会卡死、响应窗口/watchdog/隐藏交互怎么收口”。
- 两者同时涉及时,先用
game-ai-adaptation 保证动作合法闭环,再用本技能优化策略质量。