I wanted to see how far a local open-weight model could get on a full playable game in one prompt, no follow-ups. Flappy Bird is a good test: simple, but the pipe gap and spacing tuning is what makes or breaks it.
Smaller local models love to hand you an impossible version: gaps too tight, pipes too close, gravity way too heavy. So I over-specified the exact numbers (gap size relative to the jump arc, horizontal spacing in terms of reaction time) rather than trusting it to 'balance' anything. It one-shotted a genuinely playable build.
No answers, just documenting that the trick with local models is to leave nothing to their judgment.
Build a Flappy Bird clone in a single HTML canvas file, vanilla JS, 60fps, no assets (draw with shapes). Space/click flaps: sets vertical velocity to a fixed upward impulse; gravity pulls down. Pipes scroll left; passing a pipe scores +1; hitting a pipe or the ground/ceiling ends the run.
Tune for FAIR difficulty using these exact relationships (do not improvise the balance):
1. Choose gravity and flap impulse so a flap raises the bird about 25% of the screen height, and the bird takes ~450ms to fall that distance (comfortable, not twitchy).
2. Vertical pipe gap = 4.5x the bird's height (roomy enough to react but still tense).
3. Horizontal pipe spacing = scroll_speed * 1.6s, so the player always has ~1.6s between pipes at the current speed.
4. Gap vertical position varies smoothly (limit how much consecutive gaps can differ, e.g. no more than 30% of screen height between neighbors) so you never get a jump you cannot physically make.
5. Scroll speed starts gentle and increases only slightly with score, capped.
Game feel: bird tilts toward its velocity (nose up on flap, nose down when falling), a small flap 'poof', screen flash + shake on death, a best-score stored in localStorage, and a 'tap to start' idle bob. Framerate-independent. Print the chosen gravity, impulse, gap, and spacing numbers as comments so the balance is auditable.