Perfect Circle — one chance a day to draw a perfect circle.
A daily-challenge iOS game built around a simple, sticky idea: one attempt per day, one geometric scoring algorithm, no ads, no tutorials.
The idea.
I wanted to build something small and shippable in the spirit of the daily-puzzle wave (Wordle, Connections, the New York Times games). One mechanic, one attempt a day, no monetisation pressure, just a thing you might open with your morning coffee.
The mechanic: draw the most perfect circle you can with your finger. The app scores it from 0 to 100. You get one shot per day. That's the whole game.
The interesting bit: how do you score a circle?
The naive answer is to fit a circle to the user's drawn points and measure deviation. That's roughly what I do, but the details matter:
- I capture the touch points as the user drags, then compute the centroid and the mean radius from that centroid
- The mean deviation of the points from that radius is the core measure of "circularity" — a perfect circle has zero deviation, a wobbly one has a lot
- I normalise the deviation against the mean radius so that small circles and large circles are scored on the same scale
- Roundness alone isn't enough — a short, clean arc fits a circle perfectly — so a second term measures coverage: the biggest slice of the circle the stroke never visited. The score is roundness × coverage on a 0–100 scale, and the whole feel of the game lives in two tolerances
The scoring tuning was the part I underestimated. Make the algorithm too forgiving and everyone scores 95+ and the game feels meaningless. Too harsh and players feel cheated. Most of the polish work was iterating on those two tolerances until "I drew a really good circle and got 87" felt fair.
"Most of the polish was iterating on the scoring tolerances until 'I drew a really good circle and got 87' felt fair, not punitive."
The features that mattered.
- One attempt per day. Enforced via local persistence with a calendar-day reset. Scarcity is the whole point — without it, players burn out in ten minutes.
- Streaks. Consecutive-day participation, broken if you skip. Standard daily-puzzle mechanic, and it works.
- History. A stats sheet with best score, average, games played and the last ten attempts, so the daily session has weight.
- Achievements. First circle, 90+, 95+ — the small carrots that keep people opening the app.
What I'd do differently.
- Add a global leaderboard. The single most-requested feature, and the one I cut to keep the scope small. Adding it would have meant a backend, accounts, and moderation — all reasonable, none small.
- Better scoring transparency. Players sometimes don't understand why a circle that "looks fine" scored low. A small post-attempt breakdown showing the actual centroid and radius deviation would help.
- Use it as a CI/CD playground. This was a perfect candidate for setting up Fastlane and proper App Store automation. Instead, I shipped manually each release. Lesson learnt for the next iOS project.
Why it's on this site.
Compared to Orbis, Market Brief or my dissertation, this is a smaller project. It's here because it's the clearest example of a habit I care about: pick a contained idea, build it, get it reviewed and released, and don't abandon it halfway. I build these for fun rather than as a career in apps, but finishing something and putting it in front of strangers is a discipline that carries over to everything else I work on.