Inspiration
Typing of the Dead — the arcade shooter where you kill zombies by typing the words floating over them. It's the only game I know where typing genuinely feels like aiming, and it works because the words aren't a quiz bolted on top. They're the trigger.
I wanted my child to get quicker at mental arithmetic without it feeling like homework, and swapping the words for sums was the obvious move. But doing it in a tower defence adds something Typing of the Dead never needed: with six towers each showing a different sum, the answer has to route somewhere. The number you type picks its own target.
That turns out to solve the fiddliest thing in a mobile tower defence — tapping a small tower accurately while something walks towards your base. Here you never tap a tower at all.
What it does
A portrait tower defence. Six slots flank a single lane, and every tower you place floats a sum beside it. You type the answer on the number pad and it fires whichever tower matches. No aiming, no selection. Ten waves, four defenders that each answer something nothing else does, five enemy types, and a boss at the end.
The decision the whole game rests on: towers fire slowly on their own, so answering is never required to survive — a correct answer is an overcharge burst on top. Someone slow at mental arithmetic still has a working game, and a child is never punished for thinking slowly. Upgrading a tower raises its damage and its question difficulty together, so harder arithmetic is the price of a stronger economy.
How we built it
Vanilla canvas 2D and WebAudio. No libraries, no network, no build tooling beyond a 300-line zero-dependency Node script that concatenates the source into one readable index.html. It ships as a single 137 kB file that zips to 41 kB and runs offline.
The part that made it possible to build quickly is the deter never calls Math.random() and never reads a clock — all randomness comes from a seeded RNG, and real time enters in exactly one place. A s actions therefore reproduces a run exactly, which let us drive the game with a headless bot at configurable accuracy and answer speed, and with 180-run sweeps instead of guesswork. 259 tests back it, plus a Playwright suite that boots the real build over http and asserts zero c zero off-origin requests.
Built with Claude Code, with a build log kept as we went rather than written up afterwards.
Challenges we ran into
The best one: the boss was unkillable, and we didn't know. I against a wave-ten enemy's 251 — more than any board can chew through in the 23 seconds it takes to cross the lane. Every wave-ten "win" data had been achieved by surviving the boss walking through the gate rather than by beating it. The test suite never caught it because i "did the run end in a win?", and the answer was yes.
Twice the balance sweep refused to move and we blamed the game. Both times the measuring instrument was wrong. Our bot ran one answer timer six-tower bot answered six times faster than a one-tower bot. And its accuracy didn't drop on harder sums, which made the hardest difficult as EASIER than normal.
Then an import alias that worked perfectly in Node and threw a ReferenceError in the browser: 203 unit tests passed and only the browser s
Accomplishments that we're proud of
The routing mechanic works. You stop thinking about towers a about numbers, and the fiddliest interaction in the genre simply isn't there.
All three balance targets landed: a player who answers nothing loses on wave four, a 60%-accuracy player loses around wave seven, and a f wins with hearts to spare. 259 tests with nothing pending. And it's one dependency-free file that runs with the network switched off
What we learned
When a sweep won't move, suspect the measuring instrument be being measured. Three of our worst bugs were in the test harness, and every one of them made the game look like it needed tuning.
And a test that asks whether a run was won is not a test of works. The three worst problems in the build — the unkillable boss, overlapping menus, and shots that were invisible on half the found by ten minutes of someone actually playing. The harness made it safe to move fast. It never told us whether the game was any good.
What's next for MathBlast TD
Multiple maps and defender sets. A tier system spanning the arithmetic range. And a parent view showing which operations a child has practised and where they're getting faster.

Log in or sign up for Devpost to join the conversation.