Aller au contenu principal
Mohamed Amine MIDENI
Tous les projets

Bulls & Cows — PvP en ligne

Jeu de déduction 1v1 en temps réel avec scoring autoritaire côté serveur

React 18ViteTailwind CSSZustandClient Socket.IO
Bulls & Cows — PvP en ligne

À propos

Contexte, problème & solution

Bulls & Cows Online est une version temps réel à deux joueurs du classique jeu de déduction, repensée en PWA mobile-first où chaque résultat est décidé par le serveur — jamais par le client.

Contexte et problème. Transformer un jeu de déduction au tour par tour en expérience 1v1 en direct soulève les deux grands défis du multijoueur : la confiance et l'état. Si le client calcule son propre score, les joueurs peuvent tricher ; si l'état de la partie ne vit que dans une base de données, le temps réel devient poussif. La conception devait garder le scoring autoritaire côté serveur tout en restant assez rapide pour paraître instantané sur un téléphone.

Solution. Le projet est un monorepo pnpm en trois parties. L'app server fait tourner Fastify 5 et Socket.IO 4 sur un unique listener HTTP partagé, pour que le trafic REST et WebSocket coexiste proprement. L'app web est une PWA React + Vite avec Zustand pour l'état et le client Socket.IO pour les mises à jour live. Un package shared contient ce sur quoi les deux côtés doivent s'accorder — schémas Zod, constantes d'événements et logique de jeu pure — pour que les règles de scoring ne divergent jamais entre client et serveur. Pendant une partie, Redis est le hot store autoritaire (état rapide et éphémère) ; à la fin, la partie est écrite dans PostgreSQL via Drizzle ORM pour un historique permanent.

Ingénierie et exigence qualité. Placer la logique de jeu dans un module partagé et pur la rend directement testable unitairement et garantit que client et serveur scorent à l'identique. Valider chaque événement entrant avec Zod signifie que les messages malformés ou malveillants sont rejetés à la frontière. Le dépôt fournit un CLAUDE.md documentant les invariants d'architecture et un plan MVP par couches dans docs/plans/ — une base de code conçue pour être comprise et étendue, pas seulement pour tourner.

Architecture

Comment le système est construit

architecture.diagram
Joueurs
PWA React
Mobile-firstClient Socket.IOÉtat Zustand
Serveur temps réel
Fastify + Socket.IO
Un listener HTTPÉvénements validés par Zod
Moteur de jeu
Scoring côté serveur
Logique pure partagéeZéro confiance client
État & historique
Redis
État de partie liveLecture/écriture rapides
PostgreSQL
Parties terminéesDrizzle ORM
1v1 temps réel via Socket.IOScoring autoritaire serveur (zéro confiance client)Redis comme hot store pendant la partiePostgreSQL + Drizzle pour l'historiquePackage partagé : schémas Zod + logique pureMonorepo pnpm, PWA mobile-first

Stack technique

Technologies utilisées

Frontend

React 18ViteTailwind CSSZustandClient Socket.IOPWA (mobile-first)

Backend

Fastify 5Socket.IO 4Un seul listener HTTP partagéNode.js ≥ 20

Données

Redis (état live autoritaire)PostgreSQL (historique)Drizzle ORM

Package partagé

Schémas ZodLogique de jeu pureConstantes d'événements partagéesMonorepo TypeScript (pnpm)

Envie d'en savoir plus sur Bulls & Cows — PvP en ligne ?

Le code source complet est disponible sur GitHub, avec l'historique et la configuration de déploiement.