用途
本技能用于在 React Native 游戏开发中对游戏进行平衡性调优。它让带种子的无头机器人在纯 Node 环境中反复游玩游戏,用模拟数据测量难度曲线、技巧是否起作用、首次获胜时刻是否够早、转折点是否出现。再用一个 bands(平衡区间)文件定义“平衡”的含义,所有平衡数值集中在一个调优文件中。
主要能力
- 搭建一次性测试框架,包括 trace-bot、bot-policies、sim-stats、balance-bands、run-sim-bot 等模块及其测试。
- 为每个游戏编写机器人钩子:evaluate、scoreOf、tag 事件、合理玩家策略。
- 编写模拟测试文件
balance.sim.test.ts和平衡合约balance-bands.json。 - 运行
npm run test:sim执行模拟,生成reports/sim/<game-id>.json报告。 - 运行
check-balance.mjs检查模拟配置、框架、种子、机器人钩子、调优文件和区间,并判定每份报告。 - 支持回合制游戏、实时游戏(固定 tick)、有平局抽取的游戏(需非偷看的合理玩家)、有无尽模式(endless)的游戏。
使用方式
- 先搭建框架:从 templates 复制
src/core/game-balance/*、test/sims/write-sim-report.ts、jest.sim.config.js,并在 package.json 中加入"test:sim": "jest --ci --config jest.sim.config.js"。 - 编写调优文件
rules/<game-id>-tuning.ts,难度用 0..100 的整数,通过knobsFor(difficulty)配合rowFor和 reduce 查找;有无尽模式时增加 endless 行。 - 复制机器人模板并改写为当前游戏,放在
testing/<game-id>-bot.ts。游戏在游玩中有随机抽取时,合理玩家必须写成不偷看下一抽的规则。 - 复制模拟模板到
test/sims/<game-id>/,网格取每个调优行的下界,命名策略,有无尽模式时替换"endless": null。 - 运行模拟:
npx jest test/sims/<game-id> --ci --config jest.sim.config.js。首次运行即使区间不通过也会写出报告。 - 先修复明显问题(达到移动上限、回放不一致、无早期回报、无转折点),再一次只调一个旋钮,每次重跑模拟并看 lossReasons。
- 根据调优后的数字写 bands,每个区间带余量和原因,status 保持
"proposed"。 - 运行
npm run test:sim和node ${CLAUDE_SKILL_DIR}/scripts/check-balance.mjs .,直到输出RESULT: PASS。 - 发布前用
--release运行检查,把HUMAN CHECK (not blocking)行复制到发布报告。 - 人工在 iPhone 和 Android 手机上试玩,同意后把 bands 的 status 改为
"approved"并填写approvedOn。
适用场景
- 平衡调整:测得难度曲线、技巧差距、首次回报时间。
- 节奏调优:判断前几回合/几秒内是否有回报,转折点是否出现。
- 早期验证游戏创意:在最低难度下运行 3–5 步,若合理玩家和前瞻机器人都无法在 1–3 步内达到首次回报,或转折点无法触发,应停止并告知开发者。
- 有无尽模式、随机抽取、实时 tick 的游戏。
限制
- 机器人只能通过纯引擎契约(create、listMoves、applyMove、outcome)游玩,不能通过 UI。
- 每次运行必须确定:种子 1…seedsPerCell、机器人自带种子随机数,不得使用 Math.random、Date、performance.now、重试、跳过或 focus;报告不含时间戳。
- 每次运行有硬性移动上限,且任何运行不得达到上限(capHits = 0)。
- 模拟每个单元格至少断言 100 个种子的性质,不能只测单个结果。
- 平衡是分布,不能靠手玩几局或单一阈值判断。
- 不得放宽区间、降低 minStep、裁剪种子或调机器人来通过检查;应改游戏规则或调旋钮。
- 不得在失败后重命名 payoff 标签;标签应在首次运行前决定。
- 平衡数值不得散落在规则中,应集中在调优文件里。
- 模拟不得依赖 React Native、时钟或 Math.random。
- 规则变更后报告指纹会失效,必须重跑模拟。
- 难度不能用表索引,100 不能出现在网格中;用
rowFor和无尽块。 - 不得使用
table[index] ?? table[0]这种不会执行且导致分支覆盖率不达标的回退。 - 人工试玩是最终判断,但不阻塞流程;bands 在人工试玩前保持 proposed。
- 通过运行可能打印与 game-rules-engine 尚未安装相关的 SKIP 行;无游戏的 App 会打印 NOT APPLICABLE。
- 文档未提供具体收费、价格或平台兼容性细节,相关内容暂未提供。