Șeptică americană (Crazy Eights)
7 jocuri de cărți într-unul singur — offline cu 9 adversari AI, editor de reguli și turnee până la 1000 de puncte.

Context
Șeptică americană (Crazy Eights) este un pachet de șapte jocuri de cărți de tip „dat jos“ — scapi primul de toate cărțile din mână și câștigi runda. Jocul de bază se joacă pe pachet franțuzesc de 52 de cărți: pui o carte care se potrivește cu teancul după rang sau culoare, iar cărțile speciale schimbă culoarea (7), sar peste următorul jucător (A) sau îl pun să ia cărți (2, cu lanțuri care se adună). Pe lângă varianta americană, aplicația include Macao, Crazy Eights, Mau-Mau, Switch, Prší și 101 — plus jocuri proprii, cu nume, număr de cărți împărțite și cărți speciale definite de tine.
Aplicația este un port Expo SDK 57 cu TypeScript strict al jocului Android nativ Septica Americana (pachetul ro.pontes.nelucampean.uno), rescris de la zero dintr-un singur cod pentru iOS și Android. Regulile originale sunt păstrate fidel după sursele Java (Uno.java, Joc.java, UnoActivity.java, DbHelper.java), iar arta originală — cărți, avatare, fundaluri — este refolosită și modernizată prin tokeni de temă. Joci complet offline, fără cont și fără internet, contra a 9 adversari AI pe 3 niveluri de dificultate.
Video de prezentare
Varianta în engleză este disponibilă pe YouTube.
Repere tehnice
- Motor de reguli pur, testat automat —
src/game/engine.tseste un port TypeScript fără dependențe al logicii Java, cu scor AI, datorii de luat (pendingTake, plafonMAX_PENDING_TAKE = 40anti-spirală), snapshot-uri de ieșire și punctaj românesc de turneu; acoperit de peste 270 de teste Jest - 7 variante + jocuri proprii — Septica Americana (A sare, 7 schimbă, 2 ia 2), Macao (ași sălbatici, 2/3/Jokeri iau, 4 sare), Crazy Eights (8 schimbă, Q sare, A inversează), Mau-Mau, Switch, Prší, 101, plus editor complet de reguli (adaugi, editezi, ștergi cărți speciale; jocuri proprii cu 2–7 cărți împărțite)
- 9 adversari AI pe 3 niveluri — începători (John, Jeniffer, George), medii (Michael, Ashley, Emma), avansați (David, Diana, Robert); mese de 2–4 jucători, completare automată cu același nivel, alegere per scaun la configurare
- Turnee paralele cu reluare exactă — mai multe turnee pot rămâne începute (ținte 10/100/250/500/750/1000 de puncte); starea rundei se salvează automat (
serialize/deserialize) și continuă exact din punctul întreruperii, iar starterul rotește în fiecare rundă - Masă de joc animată — așezare ca ceasul, cărți-fantomă care zboară pe overlay cu măsurare nativă, evantai MiniFan, banner de finish cu monede aur/argint/bronz, istoric al teancului jucat, inel de puls pentru „ultima carte“
- Personalizare completă — 12 fundaluri de masă, cărți mici/medii/mari, viteză de joc + animații pe 5 trepte, luat automat, sunete mp3 + haptică, 5 trepte de volum, anunțuri vocale pentru cititoare de ecran
- Două limbi din prima zi — engleză + română (
expo-localization+i18next), cu joc implicit per limbă (Crazy Eights pe engleză, Septica pe română); statistici per jucător cu export prin partajare și trimitere anonimă opțională - Monetizare corectă, doar banner — AdMob ancorat-adaptiv în portrait / 320×50 în landscape, cereri nepersonalizate, consimțământ UMP în EEA; fără interstitiale, fără achiziții, fără conturi, fără multiplayer
Arhitectură
Aplicația Expo Router comunică cu un backend propriu doar pentru funcții opționale (feedback, statistici anonime, hub de jocuri într-un WebView intern); jocul în sine este 100% offline, cu preferințe și totaluri în expo-sqlite/kv-store.
┌──────────────┐ HTTPS (opțional) ┌──────────────┐
│ Expo app │ ◄─────────────────► │ Backend │
│ iOS/Android │ feedback, stats, │ stats, hub │
│ + AdMob │ pagini suport └──────────────┘
└──────────────┘
Motorul de reguli (engine.ts) nu știe nimic de UI: mașina de ture (useUnoGame.ts, un singur timer urmărit) emite evenimente (play/draw/skip), iar ecranul de joc (app/game.tsx) le transformă în fantome animate, badge-uri și sunete.
Provocări
Cea mai grea problemă a fost fidelitatea regulilor față de originalul Java: datoriile de luat care se reciclează prin pachet puteau crește fără limită și bloca runde întregi de Macao. Soluția a fost dublă — plafon MAX_PENDING_TAKE = 40 (peste maximul legitim de 35 dintr-o rotație) plus rambursarea integrală a datoriei fără reevaluarea mâinii între trageri, ca în pickACard din original.
A doua provocare a fost tabla pe ecrane foarte diferite, de la telefoane compacte la tablete de 10–13 inch în ambele orientări: pozițiile sunt calculate dinamic, mâna se redistribuie când ești la rând, iar suprapunerile absolute (toast-uri, badge-uri, inele de puls) nu mișcă niciodată layout-ul — lecție învățată după mai multe regresii măsurate pe emulator.
Lecții învățate
Separarea motorului pur de UI a meritat fiecare oră: regulile se testează headless în ~1 secundă, iar ecranul rămâne un strat subțire de animații. Iar regula „nicio reclamă fullscreen, niciodată în joc“ — aplicată tehnic (doar banner, zero înălțime până se randează) — păstrează sesiunile scurte și dese exact așa cum trebuie să fie într-un joc de cărți.

