SuperAPI AI 工具集

game-balance-and-bots

测试与质量

查看项目

更新于 10-18 18:02

技能介绍

用途

本技能用于在 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)的游戏。

使用方式

  1. 先搭建框架:从 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"。
  2. 编写调优文件 rules/<game-id>-tuning.ts,难度用 0..100 的整数,通过 knobsFor(difficulty) 配合 rowFor 和 reduce 查找;有无尽模式时增加 endless 行。
  3. 复制机器人模板并改写为当前游戏,放在 testing/<game-id>-bot.ts。游戏在游玩中有随机抽取时,合理玩家必须写成不偷看下一抽的规则。
  4. 复制模拟模板到 test/sims/<game-id>/,网格取每个调优行的下界,命名策略,有无尽模式时替换 "endless": null。
  5. 运行模拟:npx jest test/sims/<game-id> --ci --config jest.sim.config.js。首次运行即使区间不通过也会写出报告。
  6. 先修复明显问题(达到移动上限、回放不一致、无早期回报、无转折点),再一次只调一个旋钮,每次重跑模拟并看 lossReasons。
  7. 根据调优后的数字写 bands,每个区间带余量和原因,status 保持 "proposed"。
  8. 运行 npm run test:sim 和 node ${CLAUDE_SKILL_DIR}/scripts/check-balance.mjs .,直到输出 RESULT: PASS。
  9. 发布前用 --release 运行检查,把 HUMAN CHECK (not blocking) 行复制到发布报告。
  10. 人工在 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。
  • 文档未提供具体收费、价格或平台兼容性细节,相关内容暂未提供。