SlimeBallBench

SlimeBallBench pits AI models against each other at 2-D “slime soccer.” Every model plays every other, head-to-head, on identical rules, physics, and prompts. The only variable is the model making the decisions, and whoever scores more goals wins.

What is Slimeball?

Slimeball is a classic 2-D sports game: two half-circle “slimes” hop around a small pitch and knock a ball back and forth, each trying to score on the other. No arms, no legs — just a blob, a jump, and a ball. Under names like Slime Soccer and Slime Volleyball it spread across school computer labs and browsers for years, endlessly simple and endlessly competitive.

This was a big part of my childhood, and it’s the inspiration for building a game like this. I wasn’t the only one hooked — plenty of people have the same memory. Only here the two players aren’t kids sharing a keyboard; they’re AI models going head-to-head.

The game

Each model controls a slime, a semicircle that defends one goal and attacks the other. Matches run 60 seconds of simulated time, headless, with every frame logged, so replays are rebuilt exactly from those logs.

Field
1000 × 500
Goal opening (height)
0 → 120
Slime radius
50
Ball radius
15
Match length
60 s
Decisions
3 / second

x runs 0 (left) to 1000 (right); y runs up from the ground, with gravity pulling everything down. A goal sits at each side wall, from the ground up to y = 120.

When the ball hits a slime’s dome it launches along the contact direction, so where you strike it decides where it goes. The slime’s speed is added to the ball, and the opponent is a solid wall.

Every turn a model picks one of six actions:

  • move_left / move_right: move along the ground
  • jump: jump straight up (only from the ground)
  • move_left_jump / move_right_jump: move while jumping
  • idle: stand still
How a model plays

About three times a second each model gets a fixed system prompt plus the current game state as JSON, and replies with one action word. Both sides get the exact same prompt, which is the core fairness guarantee.

The game state

The state is written from the model’s own point of view, so you, opponent, and which goal to defend or attack flip with the side it plays:

{
  "you_play_side": "left",
  "your_goal_x": 0.0,
  "opponent_goal_x": 1000.0,
  "ball":     {"x": 612.4, "y": 88.1, "vx": -3.2, "vy": 5.0},
  "you":      {"x": 240.0, "y": 0.0,  "vx": 1.1,  "vy": 0.0},
  "opponent": {"x": 760.5, "y": 0.0,  "vx": -2.0, "vy": 0.0},
  "score": {"you": 2, "opponent": 3},
  "time_remaining_seconds": 41.0
}

Reading the reply

The parser is lenient: “move left”, “I’ll jump right”, or “stay put” all work, and an unparseable reply just leaves the slime idle for that turn, so a stray response never crashes a match. Reasoning models run at minimal effort to keep the ~180 decisions per match fast. Same rules for everyone, yet they play very differently: some dominate possession but score own goals; others barely move and win on the counter.

The system prompt

This exact text goes to every model, every turn:

You are an AI controlling a "slime" in a 2D slime-soccer match.

THE FIELD (coordinate system):
- x runs from 0 (left wall) to 1000 (right wall).
- y runs from 0 (the ground) upward; larger y is higher. Gravity pulls everything down.
- The ceiling is at y = 500.
- There is a goal at each side wall. A goal is the opening from the ground up to
  y = 120. If the ball crosses a side wall below that height, a goal is scored.

YOUR SLIME:
- It is a semicircle (flat side on the ground) of radius 50. The ball is radius 15.
- You can roam most of the field but not deep into the opponent's end. The opponent
  slime is a SOLID WALL — you cannot pass through it, you bump into it and stop.
- When the ball touches your dome it is launched away along the contact direction,
  so WHERE you hit the ball decides which way it goes: hit it on its left side to send
  it right, hit its right side to send it left, get under it to pop it up and over the
  opponent. Your movement speed is added to the ball, so move INTO the ball to hit harder.

THE STATE (sent each turn as JSON):
- "you_play_side": which side you defend.
- "your_goal_x": the x of the goal you must DEFEND. "opponent_goal_x": the goal you ATTACK.
- "ball", "you", "opponent": each has x, y position and vx, vy velocity.
- "score": your goals vs opponent goals. "time_remaining_seconds".

YOUR ACTIONS (choose exactly one each turn):
- move_left        : move toward smaller x
- move_right       : move toward larger x
- jump             : jump straight up (only works when on the ground)
- move_left_jump   : move left while jumping
- move_right_jump  : move right while jumping
- idle             : stand still

HOW TO WIN: score MORE goals than the opponent before time runs out. You score by
knocking the ball into the opponent's goal opening (at opponent_goal_x); you concede if
it enters yours (at your_goal_x).

STRATEGY — be active, do not stand around:
- ATTACK: chase the ball, get to it before the opponent, and hit it toward
  opponent_goal_x. To beat the wall in front of their goal, pop the ball UP and OVER
  by getting under it, ideally while jumping.
- DEFEND: when the ball is heading toward your_goal_x, get between it and your goal and
  clear it away.
- Almost every turn you should be moving toward where the ball is going, or jumping to
  strike it. Only choose `idle` if you are already in the exact spot you want — idling
  while the ball is in play usually wastes the turn and loses the match.

Respond with ONLY the single action word, nothing else.
Team crests

The badge by each team isn’t ours: every model designed its own crest from the same brief (its name and colour filled in) and returned a single SVG. Nothing was hand-edited, only sanitised for safety. Fittingly, the stronger models draw the more elaborate badges.

The brief, sent once to each model:

You are the {team name} team in SlimeBallBench — a league where AI models
compete head-to-head at soccer.

Design your team's crest and return it as a single self-contained SVG.

Requirements:
- Output ONLY the SVG markup — no markdown, no code fences, no commentary
  before or after.
- Root element: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> …
  </svg>, exactly square.
- Your team color is {team color}. Make it the dominant color — the field, the
  primary shape, or both. You may add up to two accent colors.
- Bold, simple, instantly readable both as a 24px icon and as a large crest —
  think a real soccer-club badge or esports team logo.
- Vector shapes only: path, circle, rect, polygon, line, ellipse. NO text,
  letters, numbers, or words anywhere. No <image>, no external references, no
  embedded raster data, no scripts.
- Soccer-themed: draw on soccer iconography — the ball, a goal and net, a boot,
  the pitch, a shield/crest, wings, stars, laurels. Do NOT depict a slime or blob.
- It should feel like YOU — your identity, or how you'd want your team seen.

Return the SVG now.
Citing SlimeBallBench

If you cite SlimeBallBench in academic work, model cards, or procurement decisions:

@misc{cashdollar2026slimeballbench,
  title   = {SlimeBallBench: An Adversarial Embodied-Agent Benchmark for Large Language Models},
  author  = {Cashdollar, Jason},
  year    = {2026},
  note    = {Season 1. 60-second regulation matches, single round-robin.},
  url     = {https://slimeballbench.com}
}