driver: runTapTargets 加 safeOnly(规避/推理族只点 safe===true、确定性避负到 win;安全放置族缺省关、零回归)。题面: saolei.json targets 加 safe x-ray 观测位(勿渲染)+ safeOnly + 断言 result==win。重生成 saolei: flash 一次过九门(revealed 0→71 / all_cleared / win-latch),自产 safe 正确→坐实缺口在题面非模型。回归 tictactoe(X)/invaders(win)全绿。沉淀 L1brief §九 + game-e2e/cheap-model skill 二分法。零碰 L0(boot-game-host/契约/门面)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13 lines
2.9 KiB
JSON
13 lines
2.9 KiB
JSON
{
|
||
"title": "扫雷 Minesweeper",
|
||
"brief": "做一款经典扫雷。竖屏逻辑视口 390×844。\n- 居中网格(建议 8 列 × 8 行或 9×9,格子足够大可点),用受控 random 随机布置若干地雷(如 10~12 颗)。\n- 点击未揭格:若是雷→失败;否则揭示该格并显示其周围 8 格的雷数(0~8,文本居中显示);若周围雷数为 0 则自动洪水填充揭开相邻空格。\n- 揭开所有非雷格 = 胜利;点中雷 = 失败。\n- 顶部文本 HUD:显示剩余未揭格数 / 雷数 / 当前状态。\n- 【终态契约·务必遵守】胜或负即把 _forensicsView().state().phase 置 'gameover' 并【驻留】(显示结果文案 + 「点击重玩」提示);玩家点击重玩前 phase 必须恒为 'gameover',**绝不自动重开 / 不下一帧复位回 playing**(宿主每 500ms 轮询 phase 判结束)。**gameover 状态下对网格的点击一律忽略,不得重置游戏**;仅点击明确的「重玩」按钮才允许重开。\n- 【可测性·务必导出状态】_forensicsView().state() 返回纯只读实时真值,除 phase 外导出:\n · result:null | 'win' | 'lose'(对局中为 null)\n · revealed:整数,已揭开的格数(开局必为 0,每揭开一格 +1,洪水填充按实际揭开数累加)\n · minesTotal:地雷总数\n · targets:当前所有【未揭且可点】的格组成的数组,每元素 { x, y, idx, occupied, safe } —— x/y 为该格中心的逻辑像素坐标(与画面一致)、idx 为格序号、occupied 为该格是否已揭开/已不可点(布尔)、**safe 为该格是否【非雷】(布尔;= 非地雷格,由你按内部布雷真值直接给出,如 !grid[r][c].mine)**。\n **【测试专用·勿渲染】safe 仅经 _forensicsView() 测试通道暴露给 harness,用于确定性「只揭安全格」把核心玩法跑到胜利;渲染层/玩家界面绝不可显示 safe、不得据此给玩家避雷提示(否则游戏失去意义)。**\n harness 依据 targets+safe 自动只点安全未揭格真玩、依据 result/revealed/phase 验证进展与终局,务必准确实时。\n- 反馈(juice):每次揭格触发 getEngine().particles.spawnEmitter 粒子 + getEngine().audio.synth.synthSfx 音效;踩雷时额外给一次明显反馈。\n- 画面:深色背景铺满 390×844;网格线 / 数字 / 文字均用亮色绘制,已揭格与未揭格视觉区分清晰。",
|
||
"play_spec": {
|
||
"driver": { "type": "tap-targets", "safeOnly": true, "steps": 100, "stepMs": 150 },
|
||
"expectedEngineCallPrefixes": ["particles.", "audio.synth"],
|
||
"assertAfterPlay": [
|
||
{ "path": "result", "op": "==", "value": "win", "why": "safeOnly driver 确定性只揭非雷格→揭尽所有安全格触发 win;result==win 证洪水填充/邻数揭示/胜负判定核心循环真跑(而非盲踩雷 lose 的空壳证据)" }
|
||
],
|
||
"expectLatch": true
|
||
}
|
||
}
|