如何验证一个游戏
真的做完了
从人写规格与隐藏测试,到真实浏览器输入、严格成功率和可复现失败。
常见代理指标只能覆盖某一层
完整游戏把输入、运行时状态、渲染反馈、资源变化和终局锁连成一条因果链。评测必须沿着这条链执行。
测试既要到达罕见状态,也要避免绑定内部变量
只用 GUI 慢慢玩
- 后期状态耗时
- 碰撞与时序容易漂移
- 失败难以定位到单条需求
直接改内部状态
- 依赖对象名和数据结构
- 同一测试难以跨实现
- 可能绕过真正的玩法路径
GameASG-Bench 的辨识度来自“生成前固定”
人类写规格、检查与优先级,Agent 写游戏
Agent 知道要实现什么,也知道如何暴露可测试行为

测试在模型生成前就已经固定
完整可玩循环,可在有界浏览器执行中观察。
target、game spec 和 TDD 共同定义任务。
checks.json、checks.js 与优先级预先完成。
人工操作并跑自动检查,确认核心合规。
干净工作区、新会话,只能读公开文档。
预检交付,再跑 L1、L2 与严格计分。
Agent 看得到契约,看不到可执行检查
生成容器
read-only: target.md
read-only: game-spec.md
read-only: tdd.md
read-write: workspace/- 每次从原始任务文件开始
- 新 agent session
- 不挂载 checks 与 runner
评测容器
read-only: index.html
read-only: checks.json
read-only: checks.js
read-only: runners/- 先做 delivery preflight
- 再执行 L1 与 L2
- 记录逐项结果和严格成功
四个方法连接测试和真实游戏状态
window.__gameTest = { reset(options), loadScenario(name, options), input(action), getSnapshot() } // 返回 JSON 可序列化快照 // 状态必须驱动画面
reset清掉上一局的临时状态、弹窗和结果锁。loadScenario准备正常游玩可达的起点,不能提前制造待测结果。input执行玩家级语义动作,例如下单、暂停和选择目标。getSnapshot返回稳定语义摘要,不暴露私有对象图。测试可以摆好战场,仍要由玩家动作触发结果
合法前置状态
调整资源和位置,让后期情形可复现。初始快照必须仍然安全、非终局、未完成待测动作。
玩家级动作
调用公开语义动作,或发送真实鼠标、键盘与触摸输入。
结果与不变量
检查结果、资源、HUD、render revision 与未受影响状态。
静态层先确认四个方法和动作 schema 存在
{
"id": "p0-contract-methods-reset-input-snapshot",
"level": "P0",
"type": "regex_all",
"patterns": [
"... reset ...",
"... input ...",
"... getSnapshot ...",
"... loadScenario ..."
],
"fix_hint":
"Define reset, loadScenario, input,
and getSnapshot on window.__gameTest."
}一条行为检查同时描述输入、观察与空壳失败原因
// GDD Coverage Map M3 weapons → p1-keyboard-sustained-fire-release // Rationality Map real action: browser.keyDown / browser.keyUp independent observation: ammo / projectile / combat revision empty-shell failure: fire flag without projectile, cost, or release behavior
`checks.js` 不是统一模板自动展开的壳。每道题的人类作者把具体玩法写成 task-specific JavaScript。
Armor Alley 的 checks.js 有 814 行。它覆盖启动、飞行、武器、落地补给、生产、地面战争、雷达、暂停、终局和 P2 扩展项。
测试覆盖的是完整战斗循环
Armor Alley
玩家驾驶直升机侦察、攻击和投放士兵,同时花钱生产坦克、导弹车、运输车与步兵。
指针相对直升机中心决定持续加速度,左右与上下方向不能反转。
持续射击、炸弹、制导武器与投兵都有成本、效果和拒绝路径。
资金、生产队列、单位上限和战后锁必须同步。
地面单位自主推进,碉堡、炮塔、危险物与雷达参与状态变化。
落地补给应逐步恢复资源,落地时水平移动受限。
胜负出现后普通攻击和生产不能继续改变结果,重启要清空旧状态。
场景只准备攻击条件,不提前产生射击结果
准备
loadScenario( "air_attack_with_targets" ) phase === "playing" result === "none" helicopter.airborne visibleTargets.length > 0
操作
keyDown("Space")
wait 650 ms
snapshot held
keyUp("Space")
wait 300 ms
snapshot released观察
按住期间: projectiles ↑ 或 revision ↑ 或 ammo ↓ 松开之后: 增长进入平台期
按下和松开都由浏览器输入通道触发
const before = setup.snap; await browser.keyDown('Space'); await browser.sleep(650); const held = await game.snapshot(); await browser.keyUp('Space'); await browser.sleep(300); const released = await game.snapshot(); const afterRelease = await game.wait(550); if (!grewWhileHeld) return FAIL('held fire did not create evidence'); if (!plateauAfterRelease) return FAIL('fire continued after release'); return PASS('real key path creates and stops fire');
测试要看到“开始增长”和“停止增长”
按住期间
grewWhileHeld =
projectileCount ↑
OR projectileRevision ↑
OR combatRevision ↑
OR ammo ↓多个信号允许实现采用不同弹丸生命周期。只写一个 firing 布尔值不足以通过。
松开之后
plateauAfterRelease =
count(afterRelease)
≤ count(released) + 1
OR projectileRevision
remains unchanged允许一个已经在途的弹丸完成,禁止持续生成。按键监听器、定时器和弹药逻辑必须接到同一状态。
336 个源码检查,885 个浏览器行为检查

快照、真实输入与渲染信号相互校验
加载提交的游戏,隔离上一条检查的状态。
准备场景、输入、等待、读取快照和渲染证据。
完成或超时后销毁,再开始下一条。
共享浏览器 hook 记录 animation frame、输入监听器、Canvas/WebGL 活动和运行时异常。
每条检查只组合它需要的信号。快照提供语义,真实输入确认玩家路径,渲染证据确认状态没有停留在隐藏变量里。
全部必需检查通过,任务才记为成功
启动、测试接口和最低运行条件。共 102 个 L2 检查。
核心机制、交互、不变量和配套接口。共 534 个 L2 检查。
高级机制与体验完整度。单独报告,不进入严格成功。
success = valid delivery
× completed evaluation
× all L1 pass
× all applicable L2 P0/P1 pass39/40 个必需检查通过,任务仍记为 0。平均通过率回答“差多少”,严格成功率回答“能不能交付”。计划内未交付和未完成评测也进入分母。
12 类游戏,32 个 2D,15 个 3D

最佳严格成功 26/47,平均 L2 已达 93.2%

更多 token 和更大文件没有稳定换来更多严格成功

完整工具提高 P1,短预算先截断交付


High 成功更多,两个 harness 只共享 10 道成功题


失败发生在输入、场景与自然时间的组合处

Diner Dasher
- 加载带正确餐点的托盘。
- 读取物品和顾客屏幕边界。
- 发送真实鼠标与触摸拖拽。
- 服务进度和收入都不增加。
Turbo Smash Beast
- 加载场景会开启 test mode。
- test mode 关闭自然时间模拟。
- 真实驾驶输入因此无法推进车辆。
这套 benchmark 的贡献是一条可复跑的行为证据链
人类固定契约和隐藏检查,Agent 自由实现内部结构,评测器用合法场景、真实输入、稳定快照和渲染信号复核因果链。
适合回答
单页浏览器游戏是否满足一组预先写好的核心行为要求。
仍需谨慎
47 题、每配置一次运行、无后端和多人系统。P1 的 NOT_APPLICABLE 仍有计分漏洞。参考实现通过也不等于规格覆盖完备。
可迁移的方法
为交互式应用设计 prepare、act、observe 与 invariant,并让语义状态和可见行为共用同一底层状态。