Flutter · Offline · Android

SUDOKU NOVA

Neon-styled offline puzzle game with synthesized sound

A fully offline Sudoku game built from scratch in Flutter. The cyberpunk neon UI, all ten sound effects synthesized at runtime in pure Dart, and an AI hint explainer that explains why a number is forced — in plain language, not puzzle jargon.

Fully Offline Synthesized Sound AI Hint Explainer 4 Difficulty Tiers
10
Sound effects
4
Difficulty tiers
4
Architecture layers
0
Audio files bundled

Sudoku Nova is a fully offline Flutter puzzle game for Android. The UI uses a cyberpunk neon aesthetic — dark backgrounds with cyan, green, and purple glows — and includes smooth animations, a hint system that explains its own reasoning in plain language, and a complete game lifecycle from menu through difficulty selection, gameplay, result screen, and history tracking.

All ten sound effects are synthesized as PCM sine-wave tones in pure Dart at runtime — no .mp3 or .wav files bundled. The Sudoku engine is pure Dart with zero Flutter imports, runs on a background isolate, and is fully unit-tested in isolation.

Android primary target Linux desktop for dev Flutter 3.41.8 / Dart 3.11.5 Riverpod state management go_router navigation SQLite game history Dark + light themes

Four-Layer Architecture

Clean separation: engine/ (pure Dart, zero Flutter), data/ (models, DAOs, repos), features/ (screens per route), core/ (theme, router, services). The engine runs on a background isolate so puzzle generation never freezes the UI.

AI Hint Explainer

Hints don't just reveal a number — they explain why it's forced. The explainer detects Naked Singles ("Last Number"), Hidden Singles in box/row/column ("Only Spot Left"), and gives a neutral fallback for chains too long to trace — all in plain language, never formal puzzle terms.

Synthesized Sound System

All 10 effects (correct, wrong, win, lose, hint, undo, erase, select, tap, dismiss) are PCM sine-wave tones built in pure Dart at startup and cached as Uint8List. No audio files bundled. Each pairs with a haptic feedback call (lightImpact / mediumImpact / heavyImpact / selectionClick).

Puzzle Generation & Uniqueness

Every puzzle is generated on a background isolate via recursive backtracking with shuffled digit order. Each cell removal is verified to leave exactly one solution — guaranteeing hints and undo are always valid. Generator targets: remove 38 / 45 / 52 / 57 cells for Easy → Impossible.

Notes Mode & Undo

Toggle pencil mode to enter candidate marks — displayed as a 3×3 micro-grid inside each cell, sized to the cell's actual render dimensions via LayoutBuilder. Undo pops a full grid snapshot. Erase clears notes first, then the digit. Both respect the auto-persist loop.

Game History & Best Times

Completed games — won and lost — are persisted to a SQLite table via sqflite. Best time per difficulty is a single MIN(duration_seconds) query. In-progress games are serialised to SharedPreferences on every move and restored on resume.

Easy

40–45 clues 5 lives · 5 hints Remove 38 cells

Medium

32–39 clues 4 lives · 3 hints Remove 45 cells

Hard

27–31 clues 3 lives · 2 hints Remove 52 cells

Impossible

22–26 clues 1 life · 1 hint Remove 57 cells
Flutter Dart Riverpod go_router sqflite shared_preferences audioplayers (BytesSource) sqflite_common_ffi flutter_animate google_fonts Background isolates Sine-wave PCM synthesis Backtracking solver Android + Linux