Croisade — A Competitive Crossword Game Built with React Native & Expo
Building a turn-based French crossword duel game with React Native, SQLite, and an adaptive AI opponent — fully offline.
The Concept
Croisade is a competitive French crossword game. You face an adaptive opponent turn by turn, placing letters onto a crossword grid. Each round you draw 5 letters from the solution. The player with the most points when the grid is complete wins.
It's available as a web demo and is heading toward iOS and Android store submissions.
Stack
React Native (Expo ~55)
TypeScript (strict)
SQLite (expo-sqlite) — 100% offline
Zustand — state management
Expo Router — file-based navigation
React Native Reanimated — smooth animations
Google Mobile Ads (AdMob) — monetization
The fully offline architecture was a deliberate choice: crossword grids are large, definitions need to load instantly, and mobile connections are unreliable. Everything lives in a local SQLite database.
Content: 160 Grids, 3 516 Words
The game ships with 160 pre-generated grids across 8 packs:
- 3 sizes: 9×7 (easy), 11×9 (medium), 13×11 (hard)
- 7 thematic categories: nature, culture, science, history, everyday, language, geography
- Word definitions sourced from Lexique383 + Wiktionnaire (CC-BY-SA)
Grid generation runs offline via a TypeScript script:
npx ts-node scripts/generate-grids.ts
The algorithm fills the grid from a word list, backtracking when no valid placement exists. Pre-generating avoids runtime computation on device.
Adaptive AI Opponent
The AI adapts to the current difficulty pack:
| Pack | Strategy | Letters/turn |
|---|---|---|
| 1–2 (Easy) | Random placement | 1–2 |
| 3–4 (Medium) | 50% optimal / 50% random | 2–3 |
| 5–8 (Hard/Expert) | Always optimal | 3–5 |
"Optimal" means the AI scores the move that maximizes both word completion bonuses and blocks the player from completing a word next turn.
Scoring
- 10 pts per correct letter placed
- Word bonus: 50% of the word's letter value on completion
- The AI can earn points too — first to complete a word gets the bonus
Drag & Drop Placement
Letters are placed via drag-and-drop (or tap-to-select then tap-to-place on smaller screens). React Native Reanimated drives the gesture physics: the letter card follows your finger, snaps to the nearest valid cell, and bounces back with a spring animation if the placement is invalid.
Freemium Model
Packs 1–4 are free. Packs 5–8 are premium. The monetization layer includes:
- AdMob banner + interstitials between rounds
- Rewarded ads for hint reveals
- In-app purchases: hint packs, additional grids, ad removal
Testing: 50 Jest Tests
The core engine is fully unit-tested with 50 Jest tests covering grid generation, word validation, scoring logic, and store state transitions. Tests run in CI and block deployment on failure.
npm test # 50 tests, ~3s
Try It
Play the web demo at demo.kmoussouni.dev/croisade.
Current Status
The game shipped to itch.io as an open beta (v0.9.0) and is live as a web demo at demo.kmoussouni.dev/croisade. Store submissions (iOS + Android) are planned once the final polish phase is complete.