Matt Tuttle

Hanadoku

A logic puzzle for Android that mixes Sudoku and Minesweeper: plant three flowers in every row, column, and box, using number clues that count the flowers around them. I built it in Godot in about a month, with a hint system that walks you through the reasoning instead of just giving you the answer.

Platform
Android, on Google Play
Role
Solo developer: design, programming, art, puzzle generation
Engine
Godot 4, about 7,400 lines of GDScript
Content
700+ generated puzzles across five difficulties, a daily challenge, step-by-step hints, and an interactive tutorial

The game

Every row, column, and 3×3 box needs exactly three flowers. Some cells have a number, and like Minesweeper, it tells you how many flowers are in the cells around it. There's no guessing. Every puzzle can be solved with logic alone, and the hints show you how.

A Hanadoku board with purple flowers and grass markers filling a 9 by 9 grid
A nearly empty medium puzzle with a few number clues and one 3 by 3 area highlighted
The hint screen dimming the board and explaining that column 1 needs one more flower and only has that many open cells
An expert puzzle partway through, with flowers, grass markers, and a highlighted column

From Star Battle to flowers

It started with Meowdoku. I got hooked on it over vacation, played it for several days, and wanted to make a prototype of it, so the first version of this project was Star Battle. While poking around online I found Lime Sudoku on krazydad's site. I loved it, but I couldn't find anything like it on the app store, so I decided to make my own version. I love Sudoku games, so I modeled it after the Sudoku apps I play.

The limes became flowers because placing them felt like planting flowers neatly in a flowerbed. The name comes from me being a Japanese language nerd (somewhere around N3). The word for flower is hana, and merging it with "doku" like a lot of other puzzle apps still made some sense.

Difficulty comes from the deductions

A puzzle's difficulty is about the kind of deductions you need to solve it. Easy puzzles never ask you to make hard connections between cells. Expert puzzles make you figure out a whole sequence of steps before anything can be placed.

So the solver does the scoring. It solves each puzzle the way a person would, trying the simplest techniques first, and a puzzle is rated by the hardest technique it needs. A set of command-line tools generates puzzles, scores them, and removes duplicates, which is how the game ships with over 700 of them. The daily challenge is generated on the phone from the date, so everyone gets the same puzzle, and it gets harder over the week. Expert is left out because it's too slow to generate on demand.

Hints that teach

The hint system was the one thing I couldn't find anywhere for this kind of game. krazydad's site doesn't have one, and I wanted something that could teach someone how to play.

When you ask for a hint, the solver finds the easiest deduction available right now and explains it, like "Column 1 needs one more flower and only has that many open cells." Harder hints are chains: a few smaller deductions you need to see first, each shown as its own step. For expert puzzles, it looks for the shortest contradiction: assume a flower goes here and show why that breaks the puzzle. The hint plays out on a paused copy of your board, so you can page back and forth through the steps before applying it.

I used AI to build the hint solver and some of the puzzle generation tools. It helped me a ton, and it's a big part of how the game came out in about a month.

Shipping on Android

Getting a Godot game onto a phone has its own problems. The one that took the longest to track down: the game finds its puzzles by listing the files in a folder, and that worked in the editor but found nothing on a real device. The exported build renames text resources to .remap stubs, so the code has to strip that extension before loading. Android's back button was another. Godot sends it to every node in the scene, so one manager owns all the screens and decides what back means.

The rest of the work went into the things players expect from a puzzle app: a tutorial that spotlights each part of the board, save and continue, a daily challenge with streaks, Google Play leaderboards, dark mode, and a hint bank that refills over time, with ads if you want more.

Launching into silence

Hanadoku launched as a dud. It's had about 10 installs and not a single review.

It was also my first time putting ads in a game. I don't really like them, but I was trying to at least make back what it cost to get on the store: the Google Play developer fee, plus $12 to get testers, since new accounts have to run a closed test before they can launch. So far it's made 35 cents, so I'm net negative on the whole thing.

There are so many games on the Play Store that a new one just gets lost in the noise. Unless you're willing to spend serious money on ads, you're very unlikely to break out without an already successful game. The store does next to nothing to promote you. There's nothing like Steam Next Fest that puts your game in front of people who might want it. Maybe I could have made it more interesting to look at, I don't know. Marketing isn't my strength, and with no reviews I don't even know what players thought.

What I learned

Hanadoku was a great lesson in shipping a whole product: store listings, privacy consent, ads, the tutorial, and all the little things around the puzzle itself. I'm glad it only took a month. Using AI for the solver and tools is what made that possible, and since the game flopped, I'm glad I didn't spend any longer on it.

The bigger lesson is that finishing a game is only half of it. A good game nobody hears about doesn't get played. I might still try putting it on itch.io, but honestly I was exhausted after launching it to zero reviews.