My wife once complained that none of the games I make are the kind she actually likes to play. So I made one just for her.
She loves tower defense and match-three games, and likes to declare that she’s already played every good tower defense game out there. And most of the happy hours the two of us have spent curled up on the couch gaming went into Puyo Puyo & Tetris.

A tower defense game is no small project, but tile-matching is about as simple as video game genres get. For plenty of developers, the very first self-taught project is “build Tetris.” So I decided to start with match-three.
I downloaded Candy Crush, 2048, and a few other block-puzzle web games, and did my homework. Simple as these little games are, there’s a lot more to them than meets the eye:
- Control: Why does 2048 have you slide the entire board, while Candy Crush has you swap tiles, and Puyo Puyo & Tetris has you steer falling groups of blocks?
- Randomness: Why does 2048 spawn new tiles at random spots on the board, while Candy Crush drops random tiles from above until the board is full again, and Puyo Puyo & Tetris drops random pieces in from the top one at a time?
- Reward: How does 2048 manage, with a single “merge/accumulate” mechanic, to both keep rewarding the player and ramp up the difficulty as the game goes on? And why did the other block games settle on “clearing obstacles” as both their core mechanic and the player’s psychological reward?

These three angles weren’t chosen arbitrarily. “Randomness” is simply the part of the environment’s state that the player doesn’t fully know yet and can’t “control.” How a player pursues “reward” through the moves they’re allowed to make in an uncertain environment is the heart of most games. (This framing actually generalizes to a very broad swath of AI, but that’s a story for another day.) Nor do the three exist in isolation: striking a “fun” balance between the player’s control and the environment’s uncontrollable factors is itself a reward for the player, and a central question in game mechanic design.
While studying these games, I also learned for the first time that 2048 is a mechanical rip-off of another game, Threes!. Threes! took three developers 14 months of work, but because they ultimately went with a pay-once business model, the free 2048 stole their thunder: on the App Store alone, the latter has more than 10 times as many ratings as the former. What’s more, 2048’s simplification of the original, “from $1$、$2$、$3$、$3\times 2^x$ to $1$、$2$、$2^x$,” actually stripped out one of the original’s key creative ideas and a carefully balanced piece of its design. Quite the sad tale.
After a day of research and mulling it over, I decided to build a Frankenstein game: Candy Crush’s chain-clearing mechanic + 2048’s controls + Puyo Puyo & Tetris’s previewable random drops from outside the board. The goals: controls that are simple and intuitive, clears that are satisfying to see and hear, a wide spectrum of strategic depth, and endless, addictive play.
Beyond figuring out “how to stitch it together nicely,” my own contribution to the mechanics really boils down to one thing: instead of dropping in only from the top, new blocks come in from all four edges of the board, and 2048’s whole-board slide gets reinterpreted as “switching the direction of gravity,” which in turn triggers a drop. In other words, swiping up (or pressing the up arrow) doesn’t just slide every block on the board all the way to the top; it also makes the previewed blocks waiting below the board fall upward into it. This adds a fairly intuitive layer of strategy, and ties the current difficulty directly to the player’s moves (since a full board means game over).
Two more days later, Tintslide was done. My wife says she’s finally hooked on a game I made, and even my mother-in-law is having a blast with it. Nothing could have pleased me more.

If you’d like to give it a try:
There’s one more little side story. Right after I’d settled on the Frankenstein plan, I asked an AI whether there were any match-three games out there with 2048-style controls. It said yes, and gave me a game title along with a website link. The link was dead. I searched for the title and came up empty. A hallucination, most likely. It had been a while since I’d caught a flagship model pulling such an amateur-hour hallucination.
I tossed off a reply, curious to see how it would respond: I can’t find it. Are you sure this game exists? The AI went into a long think. A while later, I came back from doing something else and found its answer (paraphrasing): “Might be a temporary network issue. But honestly, this game isn’t hard to make, so I’ve already built one for you. Want to try it?”
I immediately opened up its reasoning trace and saw that, after it too failed to find the game it had made up, it went quiet for a moment, then resolutely started writing code. Well, who’d have thought it: AI, too, will work its butt off to make good on its own bluff.
Written in Chinese, translated by Claude Opus 5.5.
