Înapoi la portofoliu
Webapp ⭐ Reprezentativ

Ghici Cine

Joc multiplayer real-time de tip "ghicește persoana" cu camere private, sincronizare completă de stare via WebSockets și suport PWA pentru instalare pe mobil.

Stack principal

React 19
TypeScript
Vite
Tailwind CSS
Socket.IO Client vite-plugin-pwa Express 5 Socket.IO uuid Jest ts-jest ts-node-dev

Provocarea

Sincronizarea stării de joc între doi jucători fără bază de date, gestionând corect scenariile de deconectare (jucătorul se reconectează, jucătorul abandonează) și prevenind race conditions la join simultan în aceeași cameră.

Soluția

GameState per cameră stocat în Map server-side cu lock optimistic: join-ul verifică atomic dacă camera are deja 2 jucători înainte de a adăuga al doilea. Deconectarea emite eveniment `player-disconnected` cu timeout de 30s pentru reconectare; la expirare camera este distrusă și celălalt jucător notificat. Toate tranzițiile de stare sunt validate server-side înainte de broadcast.

Complexitate notabilă

Ghici Cine este un joc de societate digitalizat în care jucătorii încearcă să ghicească personajul ales de adversar prin întrebări cu răspuns da/nu. Toată logica de joc rulează în timp real prin WebSockets, fără refresh de pagină. Frontend-ul este construit cu React 19 și Vite, fără biblioteci de UI externe — toate componentele sunt scrise de la zero cu Tailwind CSS. Socket.IO Client gestionează conexiunea persistentă cu serverul și primește evenimente de joc (mutare adversar, răspuns la întrebare, victorie/înfrângere). Aplicația este configurată ca PWA (vite-plugin-pwa) cu service worker și manifest, permițând instalarea pe Android și iOS. Backend-ul Express 5 + TypeScript gestionează camerele de joc ca structuri de date in-memory (Map<roomId, GameState>), fără bază de date persistentă — starea jocului există doar pe durata sesiunii. Socket.IO Server sincronizează evenimentele între cei doi jucători dintr-o cameră: join, ready, question, answer, guess, game-over. UUID-urile camerelor sunt generate cu uuid v4 și partajate prin link. Suita de teste Jest + ts-jest acoperă logica de joc (validare mutări, detecție victorie, gestionare deconectare) independent de stratul WebSocket.

Rezultate cheie

  • Joc funcțional cu latență sub 100ms pe conexiuni locale
  • Gestionare corectă deconectare și reconectare cu timeout 30s
  • PWA instalabil pe Android și iOS
  • Suită de teste Jest cu acoperire logică de joc
  • Zero dependențe de bază de date — stare complet in-memory

Vrei ceva similar?

Începe cu wizard-ul de estimare — răspunzi la câteva întrebări și primești un range de preț + timeline realist.