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.
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.
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.
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:
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 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
}
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.
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.
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.
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}
}