Aller au contenu

tilttek/bingo

✅ publié

Cartons de bingo pour un congrès ou une séance : des cartons uniques tirés d'une réserve par un germe du serveur, des cases cochées par des gestes enregistrés ou appelées par l'animateur, des motifs gagnants, des victoires vérifiées par le serveur, des lots de cartons imprimés dont les étiquettes sont vérifiées par le serveur, des mises à jour en direct par Mercure, ainsi que les événements et le crochet Stimulus d'une célébration.

Un jeu tire ses cartons d'une réserve de cases : « assister à une conférence », « visiter le kiosque de dés », « obtenir un 20 naturel ». Chaque joueur reçoit un carton bien à lui, différent de tous les autres cartons du jeu, tiré d'un secret du serveur seul : le germe du carton n est le HMAC-SHA256 du jeu et du numéro de série sous le secret, si bien que le même carton se tire de nouveau à partir de son numéro de série — un carton imprimé se vérifie par son numéro — et qu'aucun joueur ne peut deviner les cartons des autres ni choisir le sien.

Le carton d'un congrès se coche par ce que fait le joueur : chaque case nomme le geste qui la coche, par un verbe et peut-être un objet, et le serveur coche le carton à mesure que le journal d'activité de tilttek/activity enregistre les gestes, puis le décoche quand un geste est annulé. Un motif complété gagne de lui-même. Le carton d'une séance est coché par l'animateur, qui appelle des cases pour tous les cartons à la fois ; un carton gagne quand son joueur le réclame et que le serveur trouve un motif parmi les cases appelées. Dans les deux cas, le joueur ne coche jamais un carton ni ne déclare une victoire : le serveur vérifie le carton d'après son germe et ses cases cochées. Les cartons d'une séance peuvent aussi être imprimés par lots : chacun porte une étiquette, son numéro de série et un code de vérification tiré du secret, que l'organisateur saisit pour vérifier le carton de celui qui crie.

Les motifs sont une ligne, une colonne, une diagonale, le carton plein, les quatre coins, ou ceux de l'application. Une victoire envoie BingoWon ; le gabarit du carton et son contrôleur Stimulus la transforment en événement du DOM bingo:won, sur lequel joue la célébration du kit PHIL UX ; les appels, les victoires et les cases cochées parviennent aux écrans des joueurs par Mercure. C'est une bibliothèque PHP ordinaire dont les dépendances sont tilttek/activity, psr/clock et psr/event-dispatcher ; symfony/mercure n'est nécessaire que pour les mises à jour en direct.

État

PartieÉtat
Bingo : les jeux, la distribution, l'appel, les gestes enregistrés et annulés, les réclamations et les vérificationsImplémenté et testé
BingoGame, Card, TickMode, ClaimImplémentés et testés
CardDealer : les dispositions tirées du secret du serveur, les empreintesImplémenté et testé
Lots imprimés : Bingo::print(), SerialLabel, Bingo::verifyLabel(), View\PrintedCardView et templates/print.html.twigImplémentés et testés
Mercure\BingoPublisher : les appels, les victoires et les cases cochées envoyés par MercureImplémenté et testé
Square, SquarePool, Trigger, GridImplémentés et testés
WinPattern, WinPatterns : ligne, colonne, diagonale, carton plein, quatre coins, personnaliséImplémentés et testés
Activity\BingoActivityObserver : les cartons cochés d'après le journal d'activitéImplémenté et testé
Événements : BingoWon, SquareTicked, SquareCalledImplémentés et testés
View\CardView, View\CellView, templates/card.html.twig et le contrôleur Stimulus cardImplémentés et testés
Contract\BingoStore avec versions, et son dépôt en mémoireImplémentés et testés

Documentation

DocumentContenu
InstallationLes prérequis, l'installation et le branchement.
Mener un jeuLes réserves, les grilles, les motifs, la distribution, les cases cochées, l'appel et la victoire.
Les cartons et leur germeComment un carton est tiré, gardé unique et vérifié.
Cartons imprimésLes lots à imprimer, leurs étiquettes et leur vérification.
Mises à jour en directLes appels, les victoires et les cases cochées envoyés par Mercure.
CélébrationsLes événements, le gabarit du carton et son contrôleur Stimulus.
StockageLe contrat du dépôt, les versions et les cases cochées en même temps.
Points d'extensionCe qu'une application donne à la bibliothèque.
ExceptionsBingoException et ses exceptions.
TestsLes tests et les bancs d'essai de la bibliothèque.
RéférenceChaque type de la bibliothèque, avec son rôle.

Démarrage rapide

use Tilttek\Bingo\{Bingo, CardDealer, Grid, Square, SquarePool, Trigger, WinPatterns};
use Tilttek\Bingo\Activity\BingoActivityObserver;
use Tilttek\Bingo\Store\InMemoryBingoStore;

$bingo = new Bingo(new InMemoryBingoStore(), new CardDealer($secret), $dispatcher, $clock);

$grid = new Grid(5);                                      // 5 × 5, free centre
$bingo->create('con-2026', new SquarePool([
    new Square('talk', 'Attend a talk', new Trigger('talk.attended')),
    new Square('dice-booth', 'Visit the dice booth', new Trigger('booth.visited', 'booth:dice')),
    // ... at least 24 squares
]), $grid, WinPatterns::line($grid));

$card = $bingo->deal('con-2026', 'member:44');           // the same card on every call
$journalObservers[] = new BingoActivityObserver($bingo); // gestures tick, a line wins: BingoWon

Prérequis

PHP 8.5 ou une version plus récente ; tilttek/activity 0.1, psr/clock et psr/event-dispatcher. Le gabarit exige Twig, et son contrôleur Stimulus, seulement là où l'application les emploie ; les mises à jour en direct exigent symfony/mercure.

Contribuer

Les contributions sont les bienvenues sur le monodépôt de PHIL : lisez le guide de contribution et le code de conduite, en anglais. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Tilttek project. Voir LICENSE.