oneshotlm
Compare all models on this prompt →

Snake · muse-wonder

Output generated Cost / run $0.6368 Runtime 136.9s

Prompt for this run

Build a playable Snake game on a canvas with a 20 by 20 cell board. Use HTML, CSS, and JavaScript as needed. Write it to `index.html` in the current working directory using your file tools. Inline your own CSS and JavaScript. Do not use external assets, CDNs, or network requests. No third-party libraries are provided. Required behavior: - Use arrow keys to turn a snake that advances one cell at a time. Ignore a direction that would immediately reverse into its own neck, including rapid inputs before the next movement step. - Place one food item in an unoccupied cell. Eating it grows the snake by one segment, increases the score, and spawns new food in another unoccupied cell. - Use solid board boundaries: hitting a wall or the snake's body ends the game. Moving into a tail cell that vacates on that same non-growing step is allowed. - Provide Start, Pause/Resume, and Restart. Restart resets snake length, direction, score, food, and game state. Filling the board shows a win state instead of trying to place impossible food. - Display the controls and score. Prevent arrow keys from scrolling the page. Verify: Start the game and make a few turns to check grid-aligned movement and direction response. Pause and resume, then use Restart and check that snake length and score return to their initial values and food occupies a free cell.

⛨ sandboxed Open in new tab ↗

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelmuse-wonder
vendorMeta
harnesspi 0.87.1 · browser iteration
generated2026-10-15

METRICS

runtime136.9s
tokens in209k
tokens out10k
cached107k
cost / run$0.6368
Transcript · 29 messages
system

user

Build a playable Snake game on a canvas with a 20 by 20 cell board. Use HTML, CSS, and JavaScript as needed. Write it to `index.html` in the current working directory using your file tools. Inline your own CSS and JavaScript. Do not use external assets, CDNs, or network requests. No third-party libraries are provided. Required behavior: - Use arrow keys to turn a snake that advances one cell at a time. Ignore a direction that would immediately reverse into its own neck, including rapid inputs before the next movement step. - Place one food item in an unoccupied cell. Eating it grows the snake by one segment, increases the score, and spawns new food in another unoccupied cell. - Use solid board boundaries: hitting a wall or the snake's body ends the game. Moving into a tail cell that vacates on that same non-growing step is allowed. - Provide Start, Pause/Resume, and Restart. Restart resets snake length, direction, score, food, and game state. Filling the board shows a win state instead of trying to place impossible food. - Display the controls and score. Prevent arrow keys from scrolling the page. Verify: Start the game and make a few turns to check grid-aligned movement and direction response. Pause and resume, then use Restart and check that snake length and score return to their initial values and food occupies a free cell.

assistant
thinking
→ bash {"command":"pwd; ls -la"}
toolResult

/tmp/job-O4vXpT total 12 drwx------ 3 node node 4096 Oct 15 04:09 . drwxrwxrwt 6 root root 4096 Oct 15 04:09 .. drwxr-xr-x 3 node node 4096 Oct 15 04:09 .home

assistant
thinking
Designing a 20x20 snake game with input queuing, collision rules, UI controls, and state reset logic.Adding direction queuing with reversal guards, food placement, loop timing, UI states, and debug hooks.
→ write index.html (14129 bytes)
toolResult

Successfully wrote to index.html

assistant
thinking
→ browser {"action":"inspect"}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPress Start to play\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
→ browser {"action":"click","x":472,"y":695}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPress Start to play\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
Diagnosing a missed click due to coordinate mismatch between viewport and button position.
→ browser {"action":"key","text":"Enter"}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPlaying — good luck!\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
→ browser {"action":"key","text":"ArrowDown"}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nGame over! Final score: 0 — press Restart or Start\n\n▶ Start again\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
Analyzing tool latency causing missed input timing and evaluating deterministic testing options for direction logic.
→ browser {"action":"click","x":735,"y":712}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPlaying — good luck!\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
→ browser {"action":"click","x":598,"y":695}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nGame over! Final score: 0 — press Restart or Start\n\n▶ Start again\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
Evaluating latency impact on pause reliability and balancing tick speed for user experience versus automated testability.Adjusting the tick interval to extend the reaction window and testing queued input before start.
→ browser {"action":"click","x":735,"y":712}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPlaying — good luck!\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
→ browser {"action":"click","x":598,"y":695}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nGame over! Final score: 0 — press Restart or Start\n\n▶ Start again\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
Debugging latency and pause button coordinate shift, and considering slower tick or Node test harness to verify turn logic.Switching to a Node stub for logic verification and evaluating a slower tick rate and pre-queued moves.
→ bash {"command":"node -e \"\nconst fs=require('fs'),vm=require('vm');\nconst html=fs.readFileSync('index.html','utf8');\nconst script=html.match(
toolResult

OK initial len3 score0 OK food free initially OK reverse left ignored OK rapid up+left queued safely OK step up grid-aligned head={"x":10,"y":9} OK then left (no neck reversal) OK pause halts step OK resume OK restart resets len/score/dir/state OK food free after restart OK wall collision ends game ALL LOGIC TESTS PASSED

assistant
thinking
→ browser {"action":"reload"}
toolResult

Frame 1, +0ms

[Browser image supplied to model]

{"console":["warning: An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing."],"dom":"🐍 SNAKE\n\nA classic game on a 20 × 20 grid. Eat, grow, don’t bite yourself.\n\nSCORE\n0\nLENGTH\n3\nBEST\n0\n\nPress Start to play\n\n▶ Start\n⏸ Pause\n↻ Restart\nControls: Use the ↑ ↓ ← → arrow keys to turn the snake. It advances one cell at a time — reversing straight into your own neck is ignored.\nGoal: Eat the ● food to grow by one segment and score a point. Don’t hit the walls or your own body. Moving into the tail cell as it vacates is allowed. Fill the whole board to win!  Space also pauses / resumes.","images":"attached"}

assistant
thinking
→ bash {"command":"ls -lh index.html && grep -c \"http\" index.html || true"}
toolResult

-rw-r--r-- 1 node node 14K Oct 15 04:10 index.html 0

assistant
thinking

Built a complete, self-contained Snake game in `index.html` (no external assets/CDNs). **Features implemented:** - 20×20 canvas board, snake advances one grid cell per tick (140ms) - Arrow-key steering with a direction queue that validates against the last queued direction — immediate reversals into the neck are ignored, including rapid inputs before the next step; arrow keys are `preventDefault`ed so the page doesn't scroll - One food item always placed in a random unoccupied cell; eating grows the snake by 1, increments score, and respawns food in a free cell (win state when the board is full) - Solid walls and self-collision end the game; moving into the tail cell that vacates on a non-growing step is allowed - Start, Pause/Resume, and Restart buttons (Restart resets length to 3, direction, score, and food, and starts a fresh run); Space also pauses/resumes - Score / Length / Best HUD, status messages, on-canvas overlays, controls help text, and touch D-pad on coarse pointers **What I actually checked:** - Browser: initial render looks correct (grid-aligned snake, food, HUD, controls, no console errors beyond a sandbox iframe warning). Started the game (via Enter) and saw grid-aligned movement to the right; letting it run produced the wall-collision Game Over state. Clicked Restart and confirmed score returned to 0, length to 3, and food respawned on a new free cell. - Headless Node harness driving the game's exposed state: verified initial state, reverse-direction rejection, rapid up→left queued turns executing safely, grid-aligned stepping, pause halting movement, resume, restart resetting length/score/direction/state with food on a free cell, and wall collision ending the game — all passed. **Not verified end-to-end:** eating food/growth, the tail-vacation move, and the full-board win state were not exercised in the live browser (food placement is random and manual tool round-trips were slower than the ~1.4s it takes the snake to reach a wall, so live Pause clicks landed after game over); pause/resume behavior was instead confirmed in the headless harness, and the remaining rules are implemented in the step logic but untested live.