Skip to content

Repository files navigation

NumPairs

NumPairs is a native Android arithmetic deduction puzzle.

Players complete hidden expressions on a board by using numbers from a strip. The project is built iteratively through documented product milestones.


Current Status

Current implemented product baseline: v12

NumPairs now provides five persistent color-only themes: Warm, Frost, Obsidian, Terminal, and Ember. Typography, shapes, spacing, elevation, layout, controls, and gameplay meanings remain shared across them.

v11 groups normal generated play into Quick and Classic while preserving the stable internal 3 Pairs, 4 Pairs, and 8 Pairs challenge identities. Quick exposes Low and Medium and selects the matching 3 Pairs challenge 35% of the time and 4 Pairs challenge 65% of the time. Classic exposes the original full-board 8 Pairs Medium and 8 Pairs Hard challenges. Generated feedback continues using subtle accepted-assignment haptics, newly-correct tile motion, a brief completion celebration, and a successor-ready replay transition.

Daily Challenge selects one deterministic 4 Pairs Low puzzle for each device-local calendar date. Its exact progress and local completion history use a separate versioned aggregate, so one normal generated session and one Daily Session may remain resumable at the same time. The state-aware Menu action, monthly completion calendar, and non-spoiling textual share result work without accounts or a server.

Delivered milestone: v11

  • The documentation-first product and architecture contract is implemented.
  • Quick and Classic are delivered through dependency-ordered atomic issues and Pull Requests.
  • Daily Challenge retains its deterministic v10 recipe and independent persistence boundary.

Historical milestone snapshots:

PRDs preserve the product requirements and planning context for each milestone. Current generated-mode and profile behavior is also documented in puzzle-generation.md.

The generated catalog contains six implemented profiles, including the v11 3 Pairs Medium profile. Normal generated play stores one exact resumable session shared by every generated challenge, restores committed progress after process death, and keeps the current puzzle visible until a validated successor is stored and ready. Daily progress and completion history remain independently persisted in their own aggregate.


Tech Stack

  • Kotlin
  • Jetpack Compose
  • Gradle Kotlin DSL
  • Android Studio

Domain Modeling

The puzzle core uses a small domain layer guided by the project's ubiquitous language and DDD-inspired modeling.

Current core concepts:

  • Puzzle
  • Board
  • Tile
  • Expression
  • Operator
  • Strip

Project Structure

app/
├── src/main/java/org/cescfe/numpairs/
│   ├── domain/
│   ├── feature/
│   ├── data/
│   └── ui/
docs/
├── product/
├── technical/
│   ├── adr/
│   ├── code-quality.md
│   └── delivery-workflow.md
├── game-rules.md
└── ubiquitous-language.md

Core responsibilities:

  • domain: puzzle model, rules, validation, assignments, and generated puzzle logic.
  • feature: Menu, Tutorial, Quick, Classic, Daily Challenge, generated modes, and reusable Game behavior.
  • data: seed puzzle, persistence-backed preferences, generated-session snapshot, and Daily aggregate.
  • ui: app navigation, theme, and shared visual defaults.

Documentation


Run Locally

  1. Open the project in Android Studio
  2. Sync Gradle
  3. Run on emulator or Android device

Testing

# Run unit tests
./gradlew testDebugUnitTest

# Run instrumented UI tests on a connected emulator/device
./gradlew connectedDebugAndroidTest

Code Quality

# Check all formatting
./gradlew spotlessCheck

# Apply formatting
./gradlew spotlessApply

# Run all quality checks
./gradlew check

License

MIT License

About

A cleanly designed Android number puzzle game focused on product, UX, and robust domain-driven architecture.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages