← All articles
June 7, 2026Game

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.

react-nativeexpotypescriptsqlitegamemobile
Share

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:

PackStrategyLetters/turn
1–2 (Easy)Random placement1–2
3–4 (Medium)50% optimal / 50% random2–3
5–8 (Hard/Expert)Always optimal3–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.