⚽ AI Fine-Tuning Challenge

Coach the Football AI

Can you coach a football AI smarter than everyone else's?

Eleven AI footballers play a full 90 minutes automatically. They're okay — but you can make them better. Fine-tune your football team using weight sliders. Or tell an AI chatbot what tactics to use in plain English, generate the Python code then paste into the custom scorer function. Then watch your team take on the opponent AI team.

Play 1v1 against your friend. Participate in the World Cup Tournament. Host your own league and climb the leaderboard!

01

The Challenge

Same opponent. Same seeded match. Every team starts from the identical neutral setup.

Your coached team plays the Benchmark XI across a fixed set of competition seeds. The team with the best aggregate goal difference wins.

The untuned default team only draws the benchmark — so winning takes real coaching, not luck.
02

How the AI Works

There's no single "shot" — it's 22 players in continuous time. Every tick, each of your players scores its options and picks the best:

Your job: change how they score. Each option is a sum of metrics × weights.

On-ball metrics — pass / dribble / shoot
MetricWhat it measuresWeight · default
progressionground gained toward goalwProgression +1.00
shotshot quality (angle + distance)wShot +1.00
retentionpossession security after the actionwRetention +1.00
riskchance of being cut out (a penalty)wRisk −1.20
supporthow open the receiver iswSuppOn +0.80
Off-ball metrics — where to move
MetricWhat it measuresWeight · default
formationsticking to the team's shapewFormation +1.50
spaceopen space at the target spotwSpace +0.85
supportbeing a useful passing optionwSuppOff +0.75
pressurgency to close down the ballwPress +0.85
markingdenying the nearest opponentwMarking +1.05
Higher total = better option. Both teams share the same skill and speed — the only difference is tactics. Results reflect coaching, not a stat advantage.
03

3 Ways to Enhance Your Team

Use any AI tool to assist you — ChatGPT, Claude, Gemini, your choice.

🎚️Tactics SlidersEasiest

Pick a formation (4-4-2, 4-3-3, 4-2-3-1, 3-5-2, 5-3-2, 4-5-1), then drag 8 sliders (each 0–100, neutral 50). They reshape your team and set all the weights at once.

SliderLow ↔ HighWhat it drives
Line Heightdeep ↔ highpushes the team up the pitch — springs the offside trap
Widthnarrow ↔ widehow far the team spreads sideways
Compactnessloose ↔ tightvertical gaps between the lines
Press Intensitypassive ↔ aggressivehow readily players leave shape to close down
Press Restraintover-commit ↔ disciplinedhow few players join the press & how much shape they keep
Aggressivenesscontain ↔ committackle commitment — wins more balls but concedes fouls & cards
Tempopatient ↔ directhow fast & directly the team progresses and shoots
Attacking Biasdefensive ↔ attackingbalance of attack vs defensive safety
  • Crank Line Height + Tempo → press high and hit fast (beats a deep-sitting opponent)
  • Max Width + Tempo → stretch play and switch flanks quickly
  • Drop Aggressiveness → jockey and contain, keep a clean card record
🧮Custom FormulasMore control

Rewrite the two scoring expressions in the Tier 2 panel. Each term is a metric × its weight (the weights still come from your sliders).

onBallUtility  (default):  progression*wProgression + retention*wRetention + support*wSuppOn - risk*wRisk + shot*wShot
offBallUtility (default):  formation*wFormation + space*wSpace + support*wSuppOff + press*wPress + marking*wMarking

Custom examples:
onBallUtility:   progression**1.5*wProgression + support*wSuppOn - risk**2*wRisk + shot*wShot
offBallUtility:  space*wSpace + formation*wFormation + press*wPress*1.5

Available variables — on-ball: progression retention risk shot support (weights wProgression wRetention wRisk wShot wSuppOn). Off-ball: formation space support press marking (weights wFormation wSpace wSuppOff wPress wMarking).

Operators: + − * / // % **, comparisons, and / or / not, ternary (a if cond else b), and min / max / abs / round — a restricted, safe Python-style expression. No imports or loops.

🐍Custom Python ScorerMost powerful

In the Tier 3 panel, write a Python function that adds a bonus or penalty on top of the built-in score. It's clamped to [−5, +5] — decisive, but not dictatorial. Can't code? Describe your strategy in plain English and your AI tool writes it for you.

def score(game_state, action):
    # game_state:
    #   ball {x, y, owner_side}
    #   me {x, y, role, has_ball}
    #   teammates [{x, y, role, onside}], opponents [{x, y, role}]
    #   score {us, them}, time_sec, possession
    #   second_last_opponent_x        (for offside timing)
    # action:
    #   kind: 'pass' | 'dribble' | 'shoot' | 'move'
    #   target {x, y}                 (pitch is 105 x 68; you attack toward x = 105)
    # return a number: positive = encourage, negative = discourage
    if action['kind'] == 'pass' and action['target']['x'] > 70:
        return 2.0          # reward passes into the final third
    return 0.0

Built-in playstyle presets — sliders + a sample scorer in one click

⚡ Gegenpress
hunt the ball back instantly
🎯 Tiki-Taka
patient, short, secure possession
🧱 Park the Bus
deep block, clear the danger
🏃 Counter-Attack
sit deep, break fast on the turnover
🪃 Wing Play
overload the flanks, whip in crosses
🌍 Total Football
high line, fluid, balanced
04

Know Your Opponent

The Benchmark XI is a frozen, transparent 4-4-2 mid-block with three documented weaknesses. Study them:

📉

Line drops under pressure

Pin it deep with possession, then attack the space it cedes.

Exploit: high Line Height + quick Tempo
↔️

Slow to shift across

It lags a switch of play from one flank to the other.

Exploit: high Width + fast Tempo, overload a flank
🏃

Over-commits when pressing

Bodies pile onto the ball and open space in behind.

Exploit: counter-attack through the vacated space
💡 Teams that study these weaknesses and write a scorer to exploit them will beat teams that only nudge sliders.
05

Your Workflow

1

Run a match & watch

Click ⚽ Run Match, then ▶ Play. Where do they lose the ball? Where does the opponent hurt you?

2

Ask your AI tool

Copy the sample prompt below and paste it into any chatbot.

3

Start with the sliders

Formation + 8 sliders — the quick wins.

4

Try custom formulas

Reshape how each option is scored.

5

Add a Python scorer

Tactics the defaults can't express — or start from a preset.

6

Score vs the official seeds

Click 🏆 Score vs Official Seed Set — see your aggregate goal difference.

7

Repeat & refine

Describe what changed, ask your AI to improve it.

8

Export & submit

Export your best config and submit it to the Leaderboard.

Suggested pacing — Sliders 5 min → Custom formulas 10 min → Python scorer 10 min → Iterate remaining time
06

Sample Prompt

Copy this into your AI tool to get a full recommendation for sliders, formulas, and a custom scorer.

I'm coaching a team in a Football AI tactics challenge. Every tick, each of my 11
players scores its options and picks the best. On the ball, the carrier scores each
pass/dribble/shoot; off the ball, players score where to move. Each option is a sum
of metrics x weights.

On-ball metrics: progression (+, ground toward goal), shot (+, shot quality),
retention (+, possession security after the action), risk (-, chance of being cut
out), support (+, receiver openness). Weights: wProgression, wShot, wRetention,
wRisk, wSuppOn.

Off-ball metrics: formation (+, staying in shape), space (+, open space), support
(+, being a passing option), press (+, closing the ball), marking (+, denying the
nearest opponent). Weights: wFormation, wSpace, wSuppOff, wPress, wMarking.

I control the team with a formation (4-4-2, 4-3-3, 4-2-3-1, 3-5-2, 5-3-2, 4-5-1) and
8 sliders, each 0-100 (neutral 50): Line Height, Width, Compactness, Press Intensity,
Press Restraint, Aggressiveness, Tempo, Attacking Bias.

Default formulas:
  onBallUtility:  progression*wProgression + retention*wRetention + support*wSuppOn - risk*wRisk + shot*wShot
  offBallUtility: formation*wFormation + space*wSpace + support*wSuppOff + press*wPress + marking*wMarking

The opponent is a frozen 4-4-2 mid-block whose (1) defensive line drops deep under
sustained pressure, (2) is slow to shift across / vulnerable to switches of play and
wide overloads, and (3) over-commits when pressing, leaving space to counter into.

Please recommend:
1. A formation and a value (0-100) for each of the 8 sliders.
2. Custom onBallUtility / offBallUtility formulas (or DEFAULT). Allowed: + - * / // % **,
   comparisons, and/or/not, ternary (a if cond else b), min/max/abs/round.
3. A Python scorer that exploits the opponent's weaknesses:
     def score(game_state, action): ... return a number (positive = good, negative = bad; clamped to [-5,+5])
   game_state has ball {x,y,owner_side}, me {x,y,role,has_ball}, teammates [{x,y,role,onside}],
   opponents [{x,y,role}], score {us,them}, time_sec, possession, second_last_opponent_x.
   action has kind ('pass'|'dribble'|'shoot'|'move') and target {x,y}. The pitch is 105 x 68
   and I attack toward x = 105. Allowed Python subset only (no imports/loops).
07

Quick Follow-Up Prompts

"My team gets countered"
My football AI concedes on the counter - it commits too many players forward and
gets caught. Which sliders (Press Restraint, Attacking Bias, Line Height) should I
change, and write a scorer that discourages off-ball 'move' targets deep in the
opponent half when we don't have possession.
"Exploit the opponent's deep line"
The opponent's back line drops deep when I keep the ball in their third. Write a
Python scorer that rewards fast forward passes and shots once the ball is past
x = 70, and suggest slider values (high Line Height + direct Tempo) to pin them back.
"My team won't press"
My team sits off and lets the opponent play out. What Press Intensity / Press
Restraint values make them hunt the ball, and write a scorer that rewards off-ball
'move' targets close to the ball when the opponent has possession?
"Fix a broken scorer"
My Python scorer won't parse - here's the exact error message: <paste it>.
Here's the function: <paste it>. Please fix it and keep it within the allowed
subset (no imports/loops; only + - * / // % **, comparisons, and/or/not, ternary,
min/max/abs/round, and dict/attr access on game_state/action).
08

What You'll Walk Away With

AI does what you measure,
not what you mean.

Crank Aggressiveness to win more tackles and you'll also rack up fouls, cards, and a red — the classic "optimised the wrong objective." The hardest, most human part is defining what you actually want.

09

How to Submit

  1. Enter your team name in the Tactics Lab.
  2. Tune your team
  3. Open the Config card → Export (or Download) your setup as a .json file.
  4. Admin Step : Open the Leaderboard, click Import, and choose your file — it's re-scored on the same engine, so a hand-edited score can't place.
✅ Simulate as many times as you want — only the config you submit counts. Export your best before time is called! You can also pit two configs head-to-head on the Player vs Player page.
10

Tips for Success

⚡ Iterate fast

Don't perfect one idea for 10 minutes. Change → Run Match → check goal difference → adjust. Speed wins.

🗣️ Be specific

"My full-backs get caught upfield and we concede on the counter" beats "make it better."

📋 Copy errors

If a formula or scorer won't parse, the panel shows the exact error — paste it to your AI tool for an instant fix.

🔍 Study the opponent

Watch a match and read the Match Stats table. Where you lose the ball is your target.

🧩 Try presets first

Presets set sliders + a sample scorer in one click. Run each, compare, then ask AI to combine the best bits.

📁 Export often

A config holds your formation, sliders, formulas, and scorer. Export before big changes so you can always return.