← cd ../proiecte

Fazan Arena

Duelul cuvintelor românești — offline contra a 3 boți cu ELO de practică sau 1v1 online live, cu dicționar uriaș pe dispozitiv.

React NativeTypeScriptexpo-sqliteWebSocketKeycloakAdMobi18nEAS
Joc de cuvinteOfflineMultiplayer online
Captură ecran Fazan Arena

Context

Fazan Arena este jocul copilăriei — FAZAN — reconstruit ca duel modern 1 la 1: înlănțuie cuvinte după ultimele 2 litere (COPAC → ACTOR → …), închide-l pe adversar cu un cuvânt fără continuare și adună primul literele F-A-Z-A-N. Reguli stricte, fără certuri: un singur cuvânt, minim 4 litere, doar forme de dicționar, fără repetări în meci, 60 de secunde pe tură.

Aplicația este construită dintr-un singur cod Expo SDK 57 cu TypeScript, pe iOS și Android. Joci complet offline contra botului, fără cont și fără internet, sau te conectezi gratuit cu Google sau Apple pentru arena online — meciuri live cu ELO, sezoane lunare și clasamente separate online / offline.

Video de prezentare

Repere tehnice

  • Dicționar uriaș pe dispozitiv — 75.454 de cuvinte la forma de dicționar (substantive, verbe, adjective, invariabile — fără nume proprii, fără forme flexionate), livrate ca SQLite prin expo-sqlite; validarea completă se face pe server contra LOC 6.0 (peste 700.000 de cuvinte, sursa dexonline)
  • 3 boți cu personalitate — Elev (cuvinte ușoare, greșește ca un copil), Student (joacă strâns dar alunecă uman ~22% din timp), Profesor (te strange metodic spre închidere, fără să se expună); vocabularul tău e memorat și botul preferă cuvinte din afara lui
  • ELO dual, nu puncte plate — formulă ELO reală cu ligi (Bronz, Argint, Aur, Legendar), K provizoriu, statistici de sezon (cel mai lung lanț, cea mai rapidă victorie, deschiderea favorită); ELO-ul offline se sincronizează pe server în clasamentul separat
  • Ruleta literelor — fiecare rundă începe cu o ruletă animată; primul cuvânt pornește de la litera trasă și trebuie să aibă continuare (deschiderile care închid instant sunt respinse, fără penalizare)
  • Dicționar explorabil — din Setări deschizi arhiva cuvintelor: căutare cu autocomplete, dosar per cuvânt (categorie, nivel, continuări, flag de închizător) și definiții dexonline inline, cu cache
  • Rostire și dictare în română — mutările botului sunt citite cu voce românească (TTS nativ pe Android, fallback pe iOS), iar butonul DICTEAZĂ transcrie cuvântul direct în caseta de joc, cu rând de diacritice Ă Â Î Ș Ț
  • Arena online live — cozi ranked cu împerechere pe ELO, camere private cu PIN, ELO pe server, cronometre de tură, rematch anti-farming; autentificare Keycloak (realm separat fazan), JWT în stocare securizată
  • Monetizare discretă — un singur banner, fără interstitiale, fără abonamente, fără cumpărături în aplicație; reclame nepersonalizate pe iOS (fără tracking)

Arhitectură

Offline, jocul rulează integral pe dispozitiv (SQLite + motorul pur de reguli + AI local). Online, serverul este autoritar: aplicația deschide un WebSocket, primește starea meciului și validează fiecare cuvânt contra dicționarului complet, cu dicționar versionat per meci.

┌──────────────┐   HTTPS/WS      ┌──────────────┐   ┌──────────────┐
│  Expo app    │ ◄─────────────► │  Backend     │ ─ │  Keycloak    │
│  iOS/Android │  meciuri live,  │  cozi, meci, │   │  realm fazan │
│  + SQLite    │  ELO, clasam.   │  ELO, dicț.  │   └──────────────┘
└──────────────┘                 └──────────────┘

Motorul de reguli (src/fazan.ts: normalizare, start2/end2, validare) nu știe nimic de UI sau rețea — e folosit identic de bot, de validarea locală și de server.

Provocări

Cea mai grea problemă a fost botul credibil fără dicționar pe server: fiecare mutare candidată e cântărită după câte răspunsuri îi lasă adversarului (n(W)) și câte dintre ele l-ar închide pe bot (danger) — totul într-o singură trecere indexată peste SQLite, pe telefon, fără lag.

A doua provocare a fost regula Î ≡ Â (același sunet /ɨ/): ARMÂN trebuie să continue cu ÎNCEPE, peste tot — validare, pool-uri de bot, contoare, viewer-ul de dicționar. Online-ul 1v1 rămâne strict până adoptă și serverul aceeași regulă.

Lecții învățate

Separarea cuvintelor „de joc” (forme de dicționar, 75k) de adevărul de validare (LOC complet, 700k+) a meritat fiecare oră: pachetul rămâne la ~7 MB, iar jocul nu se ceartă niciodată cu DEX-ul. Iar regula „fără fullscreen, niciodată” — un singur banner discret — păstrează exact sesiunile scurte și dese ale unui joc de cuvinte.

Aplicații

De pe blog

// încă niciun articol pentru acest proiect