A polished, offline Quoridor ("wall chess") board game for Android, built with Flutter and a custom, from-scratch 3D renderer written in pure Dart — no game engine, no Unity, no WebView. Race your pawn to the far side of the board while dropping walls to trap your opponent in the maze.
Three built-in themes: Warm Wood (default), Midnight, and Ember.
- 🎲 Real 3D board — orbit with a drag, pinch to zoom, rendered by a hand-written
software 3D pipeline (perspective projection, painter's-algorithm depth sorting,
flat Lambert shading) drawn through
Canvas.drawVertices. No 3D packages. - 🤖 Three AI difficulties — Easy (greedy), Medium (minimax + alpha-beta), and Hard (iterative deepening under a time budget), each running in a background isolate so the UI never stalls. Measured strength: Hard > Medium > Easy.
- 👥 Pass-and-play — two players share one phone; the board smoothly rotates to face whoever's turn it is.
- 🎨 Runtime themes — Warm Wood, Midnight, and Ember, with the choice saved between sessions.
- 💾 Auto-save & resume — every move is persisted; leave any time and pick up exactly where you left off.
- 📖 In-app How to Play — rules and controls for new players.
- 🧠 100% offline — no accounts, no ads, no network, no tracking.
Quoridor is a two-player abstract strategy game. On your turn you either move your pawn one square or place a wall to slow your opponent. First pawn to reach the opposite edge of the 9×9 board wins. You have 10 walls; a wall can never completely seal a player off from their goal.
Controls: tap your pawn to see legal squares → tap one to move. Tap Wall, drag the ghost wall into place, then double-tap the board (or tap Place) to build it. Drag to rotate the camera, pinch to zoom.
| Area | Approach |
|---|---|
| Game engine | Pure Dart, immutable GameState, exhaustively rule-tested (jumps, wall path-rule via BFS, win detection) |
| 3D renderer | Own Vec3/Mat4 math, orbit camera, code-generated low-poly meshes, ray-cast touch picking |
| AI | Negamax + alpha-beta with a blocking-wall shortlist; isolate-backed so search never blocks the UI |
| State | Plain ChangeNotifier — no heavyweight state-management dependency |
| Testing | ~180 tests including property-based random-playout invariants; visual evidence renders |
The engine, renderer, and AI are all pure Dart with zero Flutter imports, which keeps them fully unit-testable.
Requires the Flutter SDK.
flutter pub get
flutter run # on a connected device or emulator
flutter build apk --release # build an installable Android APK
flutter test # run the full test suiteflutter run -d windows also works for quick desktop iteration — the app avoids
platform-locked APIs.
lib/
core/ immutable game engine (rules, state, path-finding) — pure Dart
ai/ Easy/Medium/Hard AI + isolate service
render3d/ custom 3D pipeline: math, camera, meshes, painter, picking
ui/ screens, HUD, gestures, themes, persistence wiring
persistence/ auto-save + theme storage
test/ mirrors lib/ ; core rules, AI strength, renderer math, widgets
docs/ rules, architecture (HLD/LLD), UX flows, test plan, decision log
- Core rules engine + full test suite
- Custom 3D renderer
- Playable 2-player pass-and-play
- AI opponents (Easy / Medium / Hard)
- Runtime themes (incl. dark modes)
- 4-player variant
- Sound, haptics, interactive tutorial, settings
- Signed release build for the Play Store
© 2026 Dev Panchal. All rights reserved.


