Designing a Game Around a Target Nobody Will Hit: The Arithmetic of 38-0-0
38-0-0 Serie ADev.to (EN Zone)
1 views
Most sports games ask you to win a league. 38-0-0 asks you
to win every match of a Serie A season — 38 out of 38, where a single draw ends the run.
That constraint sounds like a difficulty slider set to maximum. It is not. It is a
different kind of game, and the reason is arithmetic that anyone can check on a napkin.
One number decides everything
If your XI wins any given match with probability p, and the run needs all 38, the
probability of finishing is p^38. That exponent is brutal in a way that is genuinely
unintuitive:
p per match p^38 roughly
0.99 0.68 two runs in three
0.98 0.46 every other run
0.95 0.14 one in seven
0.90 0.018 one in fifty-five
0.85 0.0021 one in four hundred eighty
0.80 0.00021 one in forty-eight hundred
Look at the gap between 0.95 and 0.90. In a normal league that difference is barely
visible — one is a 90-point season, the other is an 85-point season, both win the title.
Under a perfect-season constraint, one is a coffee break and the other is a weekend.
This is the single most important fact about designing this kind of game: small changes
in per-match strength produce enormous changes in run length. Your difficulty knob is
not linear, it is exponential, and a player cannot feel that from the inside.
What that does to the failure screen
In a normal season game, losing match 12 is information: you are mid-table, adjust. In a
perfect-season game, losing match 12 is the end, and the player has just spent ten minutes
drafting.
So the failure screen carries a load it does not carry in other games. If it says "You
lost. Try again," you have wasted the player's time. It has to answer why, and the
honest answer is usually one of:
the draft was weak in a specific position, and the sim knows which one
the draft was fine and the run died to variance — at 0.93 per match only one run in
sixteen survives all 38, so most good drafts still end early
Those are completely different messages, and the second one is the harder one to write.
Telling a player "you did nothing wrong, the dice ended it" is unsatisfying, but the
alternative — implying they made a mistake they did not make — teaches them a false
lesson and makes the next run worse.
Drafting blind is what makes it a game
If you could see every rating while drafting, this would be a solved optimisation: take
the highest number available at each position, and the only remaining variance is the
sim. The interesting version hides some of that.
Once ratings are hidden, drafting becomes inference under uncertainty. You know the club.
You know the season. You know roughly what a Milan squad from the early nineties looks
like. You are reconstructing a rating you cannot see from context you do have — and
because it compounds 38 times, a systematic bias in that inference is far more expensive
than a single bad pick.
The rules panel is where a player picks which game they are playing:
Every club vs. locked to one club — locking is a much harder constraint, because
you inherit that club's weak positions with no escape hatch
Ratings visible vs. hidden — turns it from inference back into optimisation
Formation — decides which positions you are forced to fill, which decides which
spins are wasted
Those are not difficulty presets. They change what skill the game is testing.
Why 38 and not 10
A shorter perfect run would be more achievable and much less interesting. The reason is
that at 10 matches, 0.90^10 = 0.35 — a third of decent drafts get through. The target
stops being a target and becomes a formality.
38 is the real Serie A season length, and it happens to sit at exactly the point where
strong play is visible but not sufficient. A great draft moves you from one-in-fifty
to one-in-seven. That is a large, felt improvement that still does not guarantee
anything. A number that rewards skill without promising success is the hardest thing to
find in this kind of design, and here it came free with the real-world fixture count.
What I would tell someone building one
Compute p^n for your constraint before you tune anything else. If the curve is too
flat, the game is boring; too steep and skill stops mattering.
Make the failure screen distinguish "bad draft" from "bad luck." You need the sim to
report which one it was, which means logging more than the final scoreline.
Hide information deliberately, not accidentally. Hidden ratings turn optimisation into
inference; hidden rules just annoy people.
Resist shortening the season to make the game winnable. The impossibility is the
product.
If you want to see the curve from the inside rather than in a table,
a run takes about ten minutes — spin a club, draft an XI
from real historic squads, and watch 38 matchdays decide whether the arithmetic was on
your side.
Commit counts measure activity. They do not measure whether any of it is still there.
I found this out while trying to describe my share of two private codebases in a way a stranger could check. Commits were the obvious number and the wrong one. On the frontend my share of surviving lines was highe
Today I'm launching Docgrity — a tool for finding where your documentation disagrees with itself, before it confuses you or the next AI agent working on your codebase.
TL;DR
Docgrity is a documentation integrity tool for repos and Confluence. It finds duplicate or contradictory documentation, surf
Code: Megapixel99/lambda-language
lm is a small low-level language I wrote: static types, explicit memory, no closures, no garbage collector, and four independent backends that emit C, WebAssembly, ARM64 and bytecode for a VM. Its compiler is about 4,400 lines of JavaScript. The obvious next quest