Play it: tick-tac-card.netlify.app — runs in
any modern browser, no install.

Tic-tac-toe is a solved game. Two competent players draw, every time, forever. That is
usually where the conversation ends — which is a shame, because the problem isn’t the
board. It’s that we keep asking the board to decide who wins.
Tick Tac Card takes the win condition away from it. The opponent has HP, and the
nine cells are just the machine you use to hurt them.
Every line is a poker hand
A tic-tac-toe line is exactly three cells. A deck is 52 cards. Those two facts fit
together with no seam at all: play cards into the grid, and every completed line gets
scored as a three-card poker hand.
| Hand | Chips | Mult |
|---|
| Straight flush | 80 | ×6 |
| Three of a kind | 60 | ×5 |
| Straight | 45 | ×4 |
| Flush | 40 | ×3 |
| Pair | 25 | ×2 |
| High card | 15 | ×1 |
Damage is (hand chips + the cards' own chip values) × mult. So 7♠ 8♠ 9♠ is
(80 + 24) × 6 — 624 before anything else gets involved.
Note that a straight beats a flush. That’s correct for three-card poker, where
three to a run is rarer than three to a suit, and it is the exact opposite of the
five-card ranking everyone already has memorised. It’s a small thing that quietly pays
out to players who know the difference.
Suits carry their own trigger, so a flush stacks three of the same one:
| ♠ | ♥ | ♦ | ♣ |
|---|
| +1 Mult | Heal 2 | +$1 | Draw 1 |
Every card in your hand now pulls in two directions at once: where it goes, which is
the tic-tac-toe game, and what it makes, which is the poker game. Those two answers
are rarely the same cell, and that tension is the whole design.
The fork is the bridge
Here’s the part that makes the fusion work rather than just co-exist.
Because three-by-three is a draw under perfect play, a decent opponent blocks every
single threat you make. One line at a time gets you nothing. But a fork — one card
completing two lines simultaneously — scores both, applies a global ×2 on top, and is
the one thing a perfect blocker has no answer to.
That’s not a bonus mechanic bolted on. It’s the same double-threat that has always been
the only way to actually beat someone at tic-tac-toe, except now it’s also your biggest
damage spike. The old game’s one real tactic became the new game’s signature combo.
Nothing ever stalls
Completing a line detonates it: the line scores, deals its damage, and those three
cells clear. The board empties as fast as it fills, so it can never lock into the
nine-cell stalemate that makes tic-tac-toe boring — and cells are a renewable resource,
not a countdown.
The opponent, meanwhile, doesn’t score hands at all. Their lines deal flat damage by
tier, scaled by a per-opponent pressure multiplier. You’re a scoring engine; they’re a
clock. Keeping those two on separate scales means their difficulty can be tuned without
touching your power curve.

The board does the arithmetic for you
Pick up a card and every legal cell answers three questions at once: what it would
score, where it sets up a fork, and — the red ! — which cell the opponent
completes into next turn and the worst it could cost you.
Those numbers aren’t estimates. They run through the same scoreLine the real hit uses,
charms and enhancements included, so the figure on the cell is the figure the count-up
lands on. In the screenshot above the held 10♠ shows 74 on the centre cell:
(15 high card + 9 + 10 + 3 chips) × (1 + 1 for the spade). That’s arithmetic you could
do yourself with everything already face-up, which is exactly the kind worth handing over.
The run
Eight rooms of four fights — 32 in all. The same four archetypes keep turning up deeper
in the building, scaled each room, and every room’s boss breaks one rule outright: sealed
corners, a centre that keeps slamming shut, scorched earth, a short hand, a hot cell worth
double, a bleed, a double dealer, a tax on every line they land.
The scaling is steep. The first boss has 2,000 HP, hits at ×1.5 pressure, and blunders 6%
of the time. The last has 19,063 HP, hits at ×3.99, and blunders 0.4%. So your ceiling
has to climb with theirs: clearing a room grants max HP and a full heal, charm and hex
slots open on a schedule, and there’s a shop between fights selling charms, card
enhancements and consumable hexes. The interesting ones carry a real cost — Glass Cannon
triples your mult and doubles the damage you take — because a charm with no drawback isn’t
a decision, it’s just a number going up.
Two build notes
There are no image assets in the project. Not one. Every card, every suit glyph, the
felt, the trapezoid board, the opponents’ portraits — all drawn procedurally with Phaser
Graphics and Unicode. Sound effects are synthesised too: oscillators and noise buffers
with envelopes, no sample files. A scoring run climbs a semitone per beat, which is most
of why a count-up feels good.
The rules don’t know Phaser exists. Everything in src/game/ — cards, board, hand
evaluation, scoring, charms, hexes, the AI, fight resolution — imports no engine code at
all. That one boundary buys two things that would otherwise be painful: 164 unit tests
that run in milliseconds with no canvas, and a balance harness that plays whole runs
headlessly through the real Fight and the real AI, off a seeded RNG so the same seed
reproduces the same numbers exactly.
That harness is the reason I trust the tuning at all. It runs three scripted policies —
one that builds forks, one that greedily takes the best line it can see, one that places
blindly — and the gap between the first two is the number that matters. It reports the
share of turns on which any placement would have completed a line, which is the
difference between an opponent who is genuinely hard and one who is merely slow at
losing. Balance changes get measured there before they get written into the game.
It started as a joke about the most solved game there is. It turns out that if you stop
asking tic-tac-toe to decide the winner and start asking it to decide the damage, the
nine cells have quite a lot left to say.