Casino MINUIT

Casino entre amis, jetons fictifs : quinze jeux multijoueurs en temps réel, six en 3D, jouables par un simple lien.

Année
2026
Type
Projet personnel
Domaine
Développement
Période
septembre – octobre 2026
Stack
JavaScript, Node.js, WebSocket, SQLite, Three.js, WebGL, Canvas, Cloudflare Workers, Cloudflare Tunnel, Chrome DevTools Protocol
Tour du site en 18 secondes, muet par défaut : hall, profil, écran TV, roulette 3D, fusée, blackjack 3D, pile ou face, grande roue, téléphone, données de démonstrationRoulette en 3D, la bille se pose sur le 20, données de démonstration26 écransOuvrir la visite

En bref

Problème
Jouer à un casino entre amis à distance, par un simple lien, sans serveur à louer ni application à installer, sur un PC ordinaire, même sans droits administrateur ni carte graphique correcte.
Ce que j’ai réalisé
Quinze jeux, dont six en 3D, servis par un serveur Node.js sans dépendance npm : WebSocket écrit selon la RFC 6455, SQLite, hasard tiré côté serveur et vérifiable, lanceur Windows en double-clic et lien fixe Cloudflare.
Résultat
1 155 commits1 155 commits en quinze jours actifs, 216 fichiers de tests dont 39 scénarios de bout en bout en réseau, roulette 3D passée de 17,5 à 59,7 images par seconde sans carte graphique.
Rôle
Conception, architecture, orchestration de la réalisation et vérification, seul.
Équipe
Projet individuel
Statut
Terminé
Liens

Le casino, écran par écran

Captures d’un serveur de démonstration local : 14 joueurs inventés, jetons fictifs, aucun argent réel. L’écran TV est montré avec son adresse locale masquée. Les écrans de l’Armurerie sont des visuels de démonstration : noms et rendus d’armes façon CS2, propriété de leur éditeur.

01 sur 08

Le hall, vu par une joueuse

Deux des quatre familles de jeux en cartes (Les Tables, Les Originaux), qui est dans la salle et à quelle table, et le classement en direct de la soirée.

L’entrée et le hall

  • Écran d’accueil sur fond bleu nuit décoré d’éventails art déco dorés : le logo MINUIT en grandes lettres dorées, le sous-titre « La porte s’ouvre à minuit. Il te faut le code. », puis une carte avec à gauche le choix d’un avatar animal et d’une couleur, à droite six cases pour le code de la salle, un champ « Ton nom », un champ de mot de passe facultatif et un bouton doré « Pousser la porte » ; en bas, la mention « Jetons fictifs — aucun argent réel »., ouvrir la capture complète
    La porte d’entrée L’écran d’entrée, portes art déco : code de la salle, nom de joueur, avatar, couleur, mot de passe facultatif ; en pied, « jetons fictifs, aucun argent réel ».
  • Page d’accueil du casino sur fond bleu nuit : en haut le logo MINUIT doré et « 13 joueurs en salle » ; à gauche, des cartes de jeux groupées en « Les Tables » (Blackjack, Roulette, La Machine de Minuit) et « Les Originaux » (La Fusée, L’Armurerie, Mines, Plinko, Plus ou Moins) ; à droite, les panneaux « Dans la salle » (joueurs, table en cours, solde) et « Classement en direct »., ouvrir la capture complète
    Le hall, vu par une joueuse Deux des quatre familles de jeux en cartes (Les Tables, Les Originaux), qui est dans la salle et à quelle table, et le classement en direct de la soirée.

Profil et vie de salle

  • Fenêtre « Profil de joueur » par-dessus le hall assombri : en-tête avec avatar, pseudo et patrimoine (31 769,12), un graphique « Courbe du solde » avec onglets Ce soir, 30 jours, Toujours, un tableau « Par jeu » avec des barres de couleur et le nombre de manches, et à droite les blocs « Ce soir » (manches, misé, rendu, meilleur coup), « Arsenal », « Vitrine » et « Succès » (8 sur 37)., ouvrir la capture complète
    Le profil d’une joueuse Patrimoine, courbe du solde de la soirée (qui finit en flèche sur un coup à +11 875 jetons aux Mines), résultats par jeu et succès débloqués.
  • Fenêtre « Tableau d’honneur » : sept cartes de records avec des chiffres sur volets façon tableau de gare (par exemple « Le plus gros coup +11 875 jetons », « Le plus gros multiplicateur ×105,4 », « Le plus gros plongeon −1 192 jetons »), chacune avec le pseudo et l’heure ; en dessous, un tableau « Par jeu » avec plus gros coup, multiplicateur et série pour Blackjack, Roulette, La Fusée, Plinko, Mines, Plus ou Moins., ouvrir la capture complète
    Le Tableau d’honneur Les sept records de la salle en chiffres à volets (plus gros coup, plus gros multiplicateur, plus longue série…), puis les records jeu par jeu.
  • Roue de la fortune en plein écran sur fond de rayons sombres, titre doré « Qui a le gage ? » et le gage « Faire le tour de la salle en moonwalk » ; la roue dorée compte douze secteurs colorés portant chacun un avatar animal et un pseudo, avec un repère rouge en haut., ouvrir la capture complète
    La Roue du destin L’hôte lance la Roue du destin (« Qui a le gage ? ») : elle tourne en plein écran chez tous, avec l’avatar de chaque joueur en ligne.
  • Écran « Le podium, fin de soirée, 14 joueurs » : trois marches dorées numérotées 1, 2, 3 sous des projecteurs et des rideaux rouges, avec au-dessus de chacune l’avatar du joueur et son gain net ; en dessous, la suite du classement sur une ligne, puis six cartes de titres de la soirée (Le Banquier, Le Pigeon du tournoi, Le Flambeur, Le Coup de maître, Le Miraculé, Le Revenant)., ouvrir la capture complète
    Le podium de fin de soirée La remise des prix, jouée au même instant chez tous les joueurs : podium doré sous les rideaux, classement complet et titres de la soirée (le Banquier, le Pigeon du tournoi, le Flambeur…).

Hôte et écran TV

  • Fenêtre « Ce que l’hôte a fait ce soir » par-dessus le hall assombri : un paragraphe explique que chaque geste de l’hôte sur un jeu s’inscrit ici pour toute la salle, puis une liste horodatée (01:00, 00:21, 00:08) d’entrées classées Défis flash, Menteur, Poker, par exemple « Poker, partie libre : Dédé Bluff (bot de l’hôte) s’assoit » ; un bouton « Fermer » en bas., ouvrir la capture complète
    Le registre public des gestes de l’hôte « Ce que l’hôte a fait ce soir » : chaque réglage, bot assis ou défi lancé par l’hôte s’inscrit dans un registre lisible par tous les joueurs.
  • Écran de télévision sur fond noir : en haut à gauche le logo MINUIT, au centre « En direct 01:17, 14 joueurs dans la salle », à droite un bloc « Rejoins la table » réduit à un code à quatre chiffres (adresse et QR code masqués) ; à gauche un « Tableau d’honneur » de sept joueurs avec leurs soldes et un bloc « Dernier drop » ; au centre « Les gros coups », cinq lignes de gains légendaires à +11 875 ; en bas, un bandeau défilant « Le fil »., ouvrir la capture complète
    L’écran TV, scène « Les gros coups » La page spectatrice pour vidéoprojecteur : horloge en direct, tableau d’honneur et carrousel des gros coups de la soirée. Adresse masquée sur la capture ; le code à quatre chiffres est celui de la démonstration ; le bloc « Dernier drop » reprend un visuel de démonstration de l’Armurerie.

Au téléphone

  • Capture d’écran de téléphone en portrait : barre du haut avec un chrono (109:57), le solde et des icônes, une réglette d’icônes sociales, puis le bandeau MINUIT « Les tables ouvrent quand la ville s’endort. Faites vos jeux. » avec « 14 joueurs en salle », et les cartes de jeux empilées sous le titre « Les Tables » (Blackjack, puis le début de la Roulette)., ouvrir la capture complète
    Le hall au téléphone Compte à rebours du tournoi, solde, réglette sociale et cartes de jeux empilées : le hall tient sur un écran de téléphone.
  • Capture d’écran de téléphone en portrait : une grille de 25 tuiles bleu nuit dont trois retournées montrent un diamant lumineux, avec « 1,47× » en haut à droite et une rangée de multiplicateurs sous la grille ; en dessous, le panneau « Mines » avec un grand bouton doré « Encaisser 14,70 », la mise (10) et le nombre de mines (3)., ouvrir la capture complète
    Mines, joué au doigt Trois diamants trouvés, le multiplicateur grimpe à ×1,47 et le bouton propose d’encaisser 14,70 jetons.
  • Capture d’écran de téléphone en portrait : en haut la barre du casino (chrono, solde), une planche de Plinko en relief vue de face avec des billes roses entre les clous et le multiplicateur « 6,70× » en surimpression, une rangée de cases colorées en bas de la planche ; sous la planche, le panneau « Plinko » avec un grand bouton « Lâcher », la mise et le niveau de risque (Faible, Moyen, Élevé)., ouvrir la capture complète
    Plinko en 3D, au téléphone La même planche en 3D tient dans la paume : planche en haut, commandes au pouce en dessous, une bille vient de tomber dans la case ×6,70 pendant que d’autres rebondissent.

Les tables

  • Table de blackjack verte en 3D vue en plongée : au centre les inscriptions « Le blackjack paie 3 contre 2 » et « L’assurance paie 2 contre 1 », un sabot et une pile de jetons en haut ; quatre mains de cartes posées devant des cercles de mise avec leur total (10, 13, 12, 14), la carte visible du croupier (9 de cœur) ; en bas, les jetons de mise et le message « Au tour de Mimi_Jackpot »., ouvrir la capture complète
    Blackjack en 3D, la donne est faite Table Émeraude en 3D : quatre mains distribuées, chacune avec son total devant sa place, le croupier reste sur 17.
  • Table de roulette en 3D : le cylindre vu de haut au centre sur un tapis vert, « Faites vos jeux » en lettres dorées, en bas le tapis avec la piste ovale des annonces (Zéro, Voisins du zéro, Orphelins, Tiers) et la grille des numéros de 0 à 36 ; à gauche un panneau « Roulette » (Européenne, Française, Américaine) avec des statistiques rouge/noir, pair/impair ; à droite la liste des joueurs à la table ; en bas la rangée de jetons et le bouton « Prêt »., ouvrir la capture complète
    Roulette européenne en 3D, la table complète Le cylindre, le tapis avec la piste des annonces (voisins du zéro, orphelins, tiers), les statistiques des derniers tirages et les joueurs à la table.
  • Vue rapprochée en 3D d’un cylindre de roulette : la bille blanche est posée dans la case 20, entre le 14 rouge et le 1 rouge ; sous le cylindre, un bandeau « Gagnants » liste trois joueurs avec leurs gains, puis la ligne « 20 · Noir · Pair · Passe » ; à gauche un panneau de statistiques des derniers tirages, à droite la liste des joueurs à la table., ouvrir la capture complète
    Roulette en 3D, la bille se pose sur le 20 Gros plan du cylindre en 3D : la bille se pose sur le 20 noir, la table annonce les gagnants du tour et leurs gains.
  • Machine à sous sur fond bleu nuit : un bandeau « Jackpot commun 5 642,70 » en haut, une grille de cinq rouleaux et trois rangées de symboles (trèfles, cœurs, carreaux, un 7 rouge, une coupe), une ligne dorée traverse la rangée du haut avec l’étiquette « Ligne 2 · 4 × Trèfle · +35 » ; en bas la mise (50), le gain (70) et un bouton « Tourner » ; à droite les derniers jackpots et gros coups à la machine., ouvrir la capture complète
    La Machine de Minuit, ligne gagnante Quatre trèfles alignés sur la ligne 2 : la ligne s’illumine et le gain s’affiche, sous le jackpot commun qui grossit à chaque mise du casino.

Les originaux

  • Jeu de crash sur fond spatial : une courbe lumineuse monte de gauche à droite jusqu’à une fusée, avec le multiplicateur « 1,98× » en grand ; deux parachutes portent des avatars de joueurs avec leurs gains (+80, +32,50) et un troisième joueur vient d’encaisser +191 ; à gauche le panneau de mise avec un bouton « Encaissé à 1,91× » et, en bas, l’encart « Équité vérifiable » avec une empreinte de graine ; à droite la liste « Au comptoir » des joueurs à bord., ouvrir la capture complète
    La Fusée, encaissements en parachute Le multiplicateur grimpe à ×1,98 ; deux joueurs sont déjà descendus en parachute, un troisième vient d’encaisser à ×1,91 ; en bas à gauche, l’encart « Équité vérifiable » affiche l’empreinte SHA-256 de la graine.
  • Jeu de cartes sur fond bleu nuit : un grand Valet de pique redessiné au centre, le sabot à sa gauche, « 2,81× · 3 d’affilée » en haut et « Trois d’affilée ! » en surimpression dorée ; à droite deux cartes de choix « Plus haut ou égal » (23,1 %, ×4,29) et « Plus bas ou égal » (84,6 %, ×1,17) ; à gauche le panneau de mise avec le bouton « Encaisser 140,98 » et les dernières parties ; en bas à droite, les cartes déjà tirées., ouvrir la capture complète
    Plus ou Moins, trois bonnes réponses d’affilée Un Valet de pique au centre, et pour chaque choix la probabilité exacte et le multiplicateur qui en découle : ×2,81 après trois bonnes réponses, 140,98 jetons à encaisser.
  • Écran « L’Armurerie », onglet Atelier, mode Upgrade : à gauche le panneau « Ta mise » avec le solde et sept armes de l’inventaire avec leur valeur ; au centre un grand cadran doré affichant « ×1,50 » et « 62,59 % de chances », l’aiguille arrêtée dans l’arc doré, puis la carte de l’arme gagnée (122,10, +40,80), un bouton « Nouvelle mise » et la ligne « Tirage 190 890 sur 1 000 000 · gagnant sous 625 896 · Vérifier le tirage » ; à droite le panneau « La cible » (122,10) avec les paliers ×1,5, ×2, ×5, ×10, un champ de recherche, des filtres par rareté et une liste d’armes avec leur prix., ouvrir la capture complète
    L’Armurerie, l’upgrader Mode Upgrade de l’Atelier : une arme est misée à 62,59 % de chances contre une cible à ×1,50 ; l’aiguille s’arrête dans l’arc doré, la cible est gagnée et le tirage (190 890 sur 1 000 000) reste vérifiable. Visuels de démonstration : noms et rendus d’armes façon CS2, propriété de leur éditeur.
  • Écran « L’Armurerie », onglet Caisses : en haut une rangée « Derniers drops » avec quatre armes et leur valeur, puis une barre « Quêtes du soir » (Collection, Bataille, Entre potes) et le niveau 2 du joueur ; en dessous, « Caisses officielles » avec les cotes par rareté (Mil-Spec 79,92 %, Restricted 15,98 %, Classified 3,20 %, Covert 0,64 %, Rare Special Item 0,26 %) et douze caisses illustrées avec leur prix en jetons, de 13,41 à 605,30 ; en bas, le début de la rangée « Caisses de la maison »., ouvrir la capture complète
    L’Armurerie, l’étal des caisses L’Armurerie s’ouvre sur son étal : les derniers drops de la salle, les quêtes du soir et le niveau du joueur, puis les caisses avec leur prix en jetons et les cotes par rareté. Visuels de démonstration : noms et rendus de caisses et d’armes façon CS2, propriété de leur éditeur.

Entre potes

  • Scène de duel sur fond bleu nuit rayé de lumière : deux avatars se font face, « Pile » à gauche et « Face » à droite, une pièce d’or en 3D tourne en l’air au centre au-dessus d’un cercle doré, avec le texte « Rien ne va plus… » ; à gauche un panneau « Pile ou Face » (Duel / Solo), le choix de l’adversaire, la mise (200) et le classement des duels de la soirée., ouvrir la capture complète
    Pile ou Face en duel, la pièce tournoie Défi relevé entre deux joueurs pour un pot de 400 : la pièce d’or tournoie en 3D au-dessus de la table, « Rien ne va plus… ».
  • Grande roue de la fortune en 3D, dorée et colorée, vue de face sur la moitié gauche, avec un index rouge en haut et « Faites vos jeux » en lettres dorées en bas ; à droite un panneau « La Grande Roue de Minuit » avec six cartes de mises numérotées 1, 2, 5, 10, 20 et 40, payant respectivement 1, 2, 5,25, 10, 20,75 et 42 contre 1, chacune avec son nombre de cases sur 54 (de 23 à 1) et son retour (95,1 à 96,6 %), un texte expliquant que chaque case rend entre 95,1 % et 96,6 % multiplicatrices comprises, la rangée de jetons, un bouton « Prêt · 0/4 » et les mises des quatre joueurs., ouvrir la capture complète
    La Grande Roue en 3D, faites vos jeux 54 cases et six mises, de 1 contre 1 à 42 contre 1, avec le retour affiché pour chacune ; quatre joueurs ont posé leurs jetons, la roue part dans 15 secondes.
  • Table de poker ovale verte vue de dessus : cinq cartes communes au centre (9♦, J♠, 7♦, 8♠, 8♣) et le talon ; huit places autour, six occupées et deux « Place libre » : deux bots marqués « Couché · BOT » en haut, une joueuse à gauche avec l’étiquette « Paire de 8 », un joueur en bas à gauche avec ses cartes retournées et l’étiquette « Quinte au Valet », un joueur couché en bas et un joueur « Attend la GB » à droite ; en bas, « Main terminée, la suivante arrive » et le journal de la main., ouvrir la capture complète
    Poker Hold’em, l’abattage Fin de main : une quinte au Valet rafle le pot contre une paire de 8 ; deux bots de l’hôte, étiquetés « BOT », se sont couchés.
  • Course de chevaux dessinée, rendue en sépia sous le titre « PHOTO-FINISH » : six chevaux numérotés franchissent la ligne d’arrivée devant une tribune pleine, un bandeau annonce « Tartiflette Turbo d’une courte tête ! » ; en bas, les six chevaux avec leurs cotes, les tickets du joueur et le bilan de la table., ouvrir la capture complète
    Le Derby de Minuit, photo-finish Arrivée au ralenti en sépia : Tartiflette Turbo l’emporte d’une courte tête devant Mamie Nitro, sous les yeux de toute la salle, au même instant sur chaque écran.

Les jeux de Minuit

  • Table ovale bordeaux vue de dessus avec quatre joueurs autour, leurs gobelets et dés révélés ; un grand tampon vert « C’ÉTAIT VRAI ! Il y en avait 3 pour 3 annoncés » barre la table ; un joueur à gauche porte l’étiquette rouge « MENTEUR ! » ; à droite, l’historique des enchères de la manche et la règle ; en bas à gauche, les cinq dés du joueur, « personne d’autre ne les voit »., ouvrir la capture complète
    Menteur !, c’était vrai Un joueur crie « Menteur ! » sur trois As ; on compte sous les gobelets : il y en avait bien trois, c’est lui qui perd un dé.
  • Grande horloge dorée sur fond bleu nuit, aiguilles sur XII, avec le mot « MINUIT ! » en lettres dorées par-dessus et un compteur « 548 ms » ; à droite, un panneau « À l’horloge » avec le pot de la manche (400), les temps des deux joueurs, le record de la salle (202 ms), les derniers coups de minuit et la règle du jeu., ouvrir la capture complète
    Les Douze Coups, le gong a sonné « MINUIT ! » : le gong vient de sonner à un instant tiré par le serveur, et le temps de réaction du joueur s’affiche, 548 ms, mesuré côté serveur.
  • Écran « Coffre n° 5, Révélation » : trois dés affichés en haut (6, 2, 1), les deux premiers avec « vu par » et l’avatar du joueur qui l’avait vu, le troisième « vu par personne », le total « 900 » en doré, un coffre en bois ouvert au centre ; en bas, les enchères des deux joueurs (1 050 et 1 240 « Adjugé ») ; à droite le panneau « Autour du coffre » avec la règle et les derniers coffres., ouvrir la capture complète
    Le Coffre, la révélation Enchère scellée : chaque joueur n’a vu qu’un dé ; les trois dés se retournent et le coffre s’ouvre sur sa vraie valeur, 900 jetons.

01 sur 01

Le hall, vu par une joueuse

Sommaire10 sections

Contexte

Projet personnel mené seul, de fin septembre à octobre 2026 : un casino entre amis, jouable à distance par un simple lien. L’hôte lance le casino sur son PC Windows ; une fenêtre affiche un lien et un PIN à partager. Les amis ouvrent le lien dans Chrome, Edge ou Firefox, sans rien installer, et se retrouvent dans la même salle. La contrainte était de tourner sur un PC ordinaire, même sans droits administrateur ni carte graphique correcte, et de rester fluide.

Les jetons sont fictifs : rien ne s’achète, rien ne se retire, aucun objet réel n’est gagné. Les captures de cette fiche viennent d’un serveur de démonstration local, avec des joueurs inventés et des soldes fictifs. Le dépôt compte 1 155 commits du 3 au 19 octobre 2026, soit quinze jours actifs ; les premiers travaux datent de fin septembre.

Ce qu’on y joue

Le hall range quinze jeux en quatre familles. Les Tables : Blackjack (une à cinq places, bots et paris annexes), Roulette (européenne, française ou américaine) et La Machine de Minuit (cinq rouleaux et un jackpot commun à toute la salle). Les Originaux : La Fusée (jeu de crash), Mines, Plinko, Plus ou Moins et L’Armurerie, une ouverture de caisses façon Counter-Strike dont les visuels d’armes sont montrés ici à titre de démonstration. Entre potes : Poker Texas Hold’em No-Limit, Le Derby de Minuit (course de six chevaux), La Grande Roue et Pile ou Face en duel. Les Jeux de Minuit : Menteur ! (dés menteurs façon Perudo), Les Douze Coups (réflexe au gong) et Le Coffre (enchère scellée). Six jeux ont une vue 3D en plus de la 2D : Blackjack, Roulette, La Fusée, Plinko, Pile ou Face et La Grande Roue. La plupart se jouent aussi en solo hors ligne ; Poker, Menteur !, Les Douze Coups et Le Coffre demandent la salle en réseau.

Un compte a un pseudo, un avatar, une couleur, un mot de passe facultatif haché en scrypt, un code de reprise et une liste « Mes appareils ». Le portefeuille est tenu par le serveur, avec « se refaire » et les dons. Le profil montre les statistiques, la courbe du solde et les saisons ; s’y ajoutent les succès, le cabinet des trophées, les records en panneau à volets, les défis flash, le chat, huit réactions et le tiroir « Potes ». La fin de soirée enchaîne tournoi, podium joué au même instant chez tous, titres, gage et récapitulatif. L’hôte dispose d’une Roue du destin, d’un rassemblement, d’une page d’hôte (lien, PIN, réglages, bots, journal) et d’un écran TV pour vidéoprojecteur, avec QR code. Le rendu se choisit entre Auto, 3D et 2D, avec un mode animations réduites, des raccourcis clavier et une mise en page qui descend jusqu’au téléphone.

Architecture

Le casino tourne désormais sur un VPS, derrière un reverse proxy nginx en HTTPS ; la version à tunnel reste décrite ci-dessous.

Des navigateurs des joueurs au PC de l’hôte NavigateursChrome, Edge, Firefoxclient sans frameworkThree.js à la demande Lien fixeWorker Cloudflarevers le tunnel du momentou « casino fermé » TunnelCloudflare Tunnelvers le PC de l’hôte Serveur Node.js, sur le PC de l’hôte, 0 dépendance npm HTTP statiqueliste blanche,CSP stricte WebSocketécrit à la mainselon la RFC 6455 Modules de jeuxchargés à chaudplantage isolé SQLitenode:sqlite, transactionssauvegardes atomiques Journal JSONLun analyseur recalculechaque paiement
Fig. 1 — Architecture : des navigateurs au serveur Node.js de l’hôte, par le lien fixe et le tunnel Cloudflare.

Les navigateurs des joueurs passent par un lien fixe : un Worker Cloudflare redirige vers le tunnel du moment, ou affiche « Le casino est fermé pour l’instant » ; son secret est comparé en temps constant. Le tunnel mène au serveur Node.js (version 22.13 ou plus), qui tourne sur le PC de l’hôte sans aucune dépendance npm. Il sert les fichiers statiques en liste blanche, avec une CSP stricte et l’en-tête X-Frame-Options ; son WebSocket est écrit à la main selon la RFC 6455. Les jeux sont des modules chargés à chaud : un module qui plante ne fait pas tomber le serveur. Les données vivent dans SQLite, par node:sqlite, avec des transactions de tour et des sauvegardes atomiques. Un journal JSONL enregistre les événements, et un analyseur recalcule chaque paiement.

Le client est en JavaScript sans framework ni étape de build. La 2D est en DOM et Canvas ; la 3D repose sur Three.js r160, chargée seulement à l’entrée d’une table 3D, avec des textures procédurales et un seul contexte WebGL. Three.js et un générateur de QR code sont les seules bibliothèques tierces. Le texte venu du réseau est inséré en nœuds texte, sans innerHTML. Les sons sont synthétisés et la voix du croupier vient de la synthèse vocale.

Côté sécurité : PIN de salle verrouillé par source après des essais ratés, clé d’hôte séparée, détection locale de l’hôte, validation stricte des entrées, mots de passe hachés en scrypt, jetons de session conservés en empreintes et révocation appareil par appareil.

Un hasard tiré par le serveur, et vérifiable

Tous les tirages se font côté serveur, avec crypto.randomFillSync, crypto.randomInt et un mélange de Fisher-Yates ; des tests vérifient qu’aucun module de jeu n’appelle Math.random. Pour La Fusée, l’empreinte SHA-256 de la graine est publiée avant le vol et la graine est révélée après : c’est l’encart « Équité vérifiable », en bas à gauche de l’écran de jeu.

Le serveur est autoritaire : le navigateur n’envoie que des intentions. Les cartes cachées, les cartes privées, les mines et le point d’explosion ne sont jamais envoyés avant l’heure, et des tests inspectent chaque message pour le vérifier. Dans la salle, chaque geste de l’hôte sur un jeu (réglage, bot assis, défi lancé) s’inscrit dans un registre que tous les joueurs peuvent lire.

La même bille sur tous les écrans

Les animations sont cadencées sur l’horloge du serveur. À la roulette, le serveur tire d’abord le numéro ; une physique déterministe, partagée par le serveur et les clients, cherche ensuite une trajectoire de bille qui aboutit à ce numéro et la code en trace. La vue 2D et la vue 3D rejouent la même trace : la bille tombe dans la même case, au même instant, sur chaque écran. Le même principe sert à la Roue du destin, au Derby et aux batailles de caisses.

Roulette : le numéro d’abord, la bille ensuite Horlogedu serveurcadence commune Tiragenuméro tirécôté serveur Physique déterministeserveur et clientstrajectoire en trace Vue 2DDOM, Canvas Vue 3DThree.js Même trace, même instant, sur chaque écran, en 2D comme en 3D. Même principe pour la Roue du destin, le Derby et les batailles de caisses.
Fig. 2 — Le numéro est tiré d’abord ; une trajectoire de bille codée en trace est rejouée en 2D et en 3D, au même instant sur chaque écran.

L’argent fictif compté comme du vrai

Les montants sont des centimes entiers. Les tests vérifient un invariant de conservation des jetons. Les positions ouvertes au moment d’un redémarrage sont remboursées. L’analyseur du journal rejoue chaque paiement avec la version archivée du moteur de jeu. Le portefeuille est tenu par le serveur : le profil affiche le patrimoine, la courbe du solde de la soirée, les résultats jeu par jeu et les succès ; le Tableau d’honneur garde les records de la salle, annoncés une fois le coup montré.

Fluide sans carte graphique, lanceur qui marche partout

Un gouverneur de qualité adapte le rendu 3D à la machine. En 1920 × 1080 sans accélération matérielle, la roulette 3D est passée de 17,5 à 59,7 images par seconde, et La Fusée de 32 à 53–58. La 3D tient aussi sur un téléphone, les commandes au pouce sous la planche.

Le lanceur Windows se lance en double-clic : il trouve Node, même en version portable. Un bug a été résolu sur ce lanceur : sous Windows, sélectionner du texte dans la console figeait le programme. L’affichage a été déplacé dans un processus séparé, et une sentinelle surveille le fil principal.

Tests et mesures

216 fichiers de tests automatisés, dont 39 scénarios de bout en bout en réseau. Plus d’une centaine de scénarios navigateur tournent dans Chrome headless, pilotés par le protocole DevTools, de 1 à 20 joueurs et jusqu’au format téléphone. Le lanceur est testé en conditions réelles. Le harnais de test est écrit maison.

Chiffres clés, comptés sur les fichiers suivis par git, hors Three.js, générateur de QR code et deux fichiers de données générés :

  • Code applicatif JavaScript : ≈ 86 200 lignes (serveur ≈ 28 800, socle client ≈ 23 800, jeux ≈ 33 600) ; modules serveur de jeux et de fonctionnalités : 21 ; CSS : ≈ 14 100 lignes.
  • Code de test : ≈ 125 000 lignes, plus que le code applicatif.
  • Documentation Markdown : 374 fichiers, ≈ 60 000 lignes.
  • Dépendances npm du serveur : 0.

Ce que je referais autrement

Cinq défauts d’affichage sont connus et n’étaient pas corrigés au 30 octobre 2026, date des captures :

  • Au téléphone (390 px de large), le podium de fin de soirée chevauche son titre.
  • Au téléphone, le patrimoine de « Mon profil » est coupé.
  • Au téléphone, les compteurs de la vitrine à trophées débordent.
  • L’historique du Derby est reçu par le client, mais jamais affiché.
  • La « Carte de la soirée » n’affiche rien.

Aucune capture du podium ni du profil au téléphone ne figure donc dans la visite. L’Armurerie reprend des noms et des rendus d’armes façon CS2, propriété de leur éditeur : ses captures sont montrées en visuels de démonstration.

Compétences BUT mobilisées

Compétences du référentiel BUT Informatique démontrées dans ce projet : niveau, ce que le projet montre et preuve.
CompétenceNiveauCe que le projet montre, et preuve
RéaliserRéaliser un développement d’applicationNiveau 3Développer de bout en bout une application client-serveur en temps réel.Preuve : Serveur Node.js sans dépendance npm (HTTP, WebSocket RFC 6455, SQLite) et client JavaScript sans framework : quinze jeux, dont six en 3D avec Three.js.
OptimiserOptimiser des applicationsNiveau 2Mesurer et améliorer les performances d’un rendu.Preuve : Gouverneur de qualité adaptative : roulette 3D de 17,5 à 59,7 images par seconde et La Fusée de 32 à 53–58, en 1920 × 1080 sans accélération matérielle.
AdministrerFaire évoluer et maintenir un système informatique communicant en conditions opérationnellesNiveau 3Déployer et sécuriser un service joignable depuis l’extérieur.Preuve : Lanceur Windows qui trouve Node ; Worker « lien fixe » ; PIN de salle verrouillé par source, clé d’hôte séparée, mots de passe en scrypt, révocation par appareil.
GérerGérer des données de l’informationNiveau 2Concevoir et exploiter la persistance et le journal d’une application.Preuve : SQLite par node:sqlite avec transactions de tour et sauvegardes atomiques ; journal JSONL rejoué par un analyseur qui recalcule chaque paiement ; centimes entiers sous invariant de conservation.
ConduireConduire un projetNiveau 2Mener seul un projet, de la conception à la livraison.Preuve : 1 155 commits du 3 au 19 octobre 2026, 374 fichiers de documentation Markdown, 216 fichiers de tests.