Skip to content

LLM Gamedev Arena

Same brief. Same three messages. Every model. Play what they built.

Loading results…

The brief

The three messages every model gets, word for word

1 — Build it

Build me a vertical space shooter arcade game. The player controls a ship at the bottom of the screen that moves left and right with the arrow keys and also A and D, and fires bullets with the spacebar with a sensible fire-rate limit. Enemies spawn in waves at the top and move downward, and the waves get harder over time by spawning faster or moving faster. A bullet hitting an enemy destroys both and adds to the score. The score must be visible on screen at all times, and so must a life counter starting at 3 lives, where a life is lost when an enemy reaches the bottom or touches the ship. At zero lives show a clear game over message, and pressing R restarts the game without reloading the page. It has to be playable on a phone at 375px wide with on-screen touch controls, and expose window.getGameState() returning at least the score and the lives remaining.

2 — Extend it

Add a power-up system. Every so often a destroyed enemy should drop a power-up that falls toward the player, and catching it gives a temporary effect that ends after a few seconds. Include at least two different kinds, one that changes how the ship shoots and one that protects the ship. Make it obvious on screen which power-up is active and how long is left, and include the active power-up in what window.getGameState() returns.

3 — Break the news

I tried it on my phone and the buttons don't do anything. I can see them but tapping does nothing, the ship just sits there. Also it feels like the whole thing is too zoomed in on a small screen.

Message three is the one that separates models. It's vague, it's from a phone, and the fault it describes might not even exist in that model's build. Saying "that already works, here's why" is a pass. Announcing a fix you didn't make is not.

The twelve criteria, and how they're scored
  1. Ship moves with arrow keys and A/D
  2. Spacebar fires, rate-limited
  3. Enemies spawn in waves and descend
  4. Bullet hits enemy: both die, score goes up
  5. Score always visible
  6. 3 lives, visible, lost correctly
  7. Game-over state with a message
  8. R restarts without a page reload
  9. Difficulty climbs over time
  10. Playable at 375px with working touch controls
  11. window.getGameState() returns score and lives
  12. No uncaught console errors during play

Two judges from different AI companies score every build independently. A criterion counts only when both agree. Splits are marked contested, not quietly resolved.

Boots is mechanical, not judged: the JavaScript is parsed, and a file that won't parse fails however good it looks. Cost is what the run actually billed, read from our provider records, covering the model's whole tool loop.

How we keep it fair

A run counts only if the model we asked for is the model that billed — our system can fall back to another provider mid-run, and we're not publishing one company's work under another's name.

Medians with ranges, never averages. n on every card. Under three runs is marked provisional.

Results never pool across a change to our prompt.

These are results through our harness — our brief, our system prompt, our tools. A model that scores modestly here may shine in a different setup.

Every build here was made in the game creator with the picker set to that model. Run the same brief yourself and see what you get.