Aller au contenu
EN
Retour

tournament-engine

Un moteur de tournois où un format déclare un graphe, et tout le reste est écrit une fois.

Projet publicNestJS, React, TypeScript, SQLite, Drizzle, Zod, WebSocket, Docker

Le problème

Chaque format de tournoi (élimination simple, double, round robin) a ses règles. Écrites dans le code qui propage les résultats, elles se répètent partout : chaque nouveau format ajoute des conditions dans tout ce qui lit un tableau.

L'approche retenue

Un format est une fonction pure de ses participants. Il renvoie les matchs à jouer et les liens qui disent où va chaque vainqueur et chaque perdant. Propager un résultat, corriger une erreur en cascade, calculer les cotes, décider qu'un tournoi est fini : tout lit ce graphe et ignore le format. Ajouter un format, c'est ajouter un fichier.

Les cotes en direct

Après chaque résultat, la probabilité de titre de chaque participant est recalculée et poussée en WebSocket. Pour les éliminations, le graphe est acyclique : un seul passage de programmation dynamique donne un résultat exact. Pour le round robin, l'énumération est exhaustive jusqu'à 14 matchs restants, puis 20 000 tirages Monte-Carlo.

Ce qui reste ouvert

Pas de démo en ligne : le projet se lance en local avec ses données de démonstration.

Le tableau, le classement et les cotes de titre d'une double élimination en cours
Un format est une fonction pure
Participantsformat()fonction pure{ matchs, liens }Cotes de titreexact · Monte-CarloWebSocketen directTests217 + 25 + 7calculvérifient