Présentation
Zugzwang est un logiciel complet de gestion de tournois d'échecs, destiné aux arbitres et aux organisateurs. Il couvre tout le cycle d'un tournoi : inscriptions des joueurs, appariements automatiques ronde après ronde, saisie des résultats, classements en temps réel avec départages, attribution des prix et exports PDF officiels.
Le cœur du logiciel est son moteur d'appariement, conforme au système suisse hollandais de la FIDE. Apparier une ronde n'a rien d'anodin : il faut respecter des dizaines de règles — équilibre des couleurs, gestion des flotteurs, exemptions — tout en garantissant qu'une solution valide soit toujours trouvée. C'est ce problème combinatoire, au croisement de la rigueur réglementaire et de l'algorithmique, qui constitue le défi technique central du projet.
Architecture
Zugzwang est bâti en Clean Architecture sur huit projets. Au centre, un domaine en C# pur — entités, règles métier et moteur d'appariement — sans aucune dépendance externe, donc entièrement testable de façon isolée. Autour, une couche Application définit les contrats (interfaces de dépôts, services), et une couche Infrastructure les implémente : persistance EF Core, exports, intégrations.
L'interface est mutualisée dans une unique bibliothèque de composants Razor, partagée par les trois cibles. L'application desktop Windows l'héberge dans un BlazorWebView (WPF + Blazor Hybrid) ; le site web public l'expose en Blazor Server ; une déclinaison mobile en MAUI est prévue selon le même schéma. Une seule base d'interface, trois plateformes.
Côté données, le poste local s'appuie sur SQLite via EF Core 9, pour un fonctionnement hors-ligne complet — un arbitre doit pouvoir travailler dans une salle sans réseau fiable. Une synchronisation vers Turso (SQLite hébergé, compatible libSQL) remonte ensuite les données vers le cloud, où le site web public vient les lire.
Décisions techniques
Hors-ligne d'abord. Plutôt qu'une application toujours connectée, j'ai choisi un socle SQLite local et une synchronisation différée vers le cloud. La contrainte vient du terrain : les salles de tournoi ont rarement un réseau fiable, et l'appariement d'une ronde ne peut pas attendre. Le cloud devient un service de partage et de sauvegarde, jamais un point de défaillance.
Un moteur d'appariement frugal. Le système hollandais autorise un nombre factoriel de combinaisons. Plutôt que de toutes les énumérer, le moteur procède par un appariement glouton, puis un retour arrière limité qui génère les permutations à la demande et s'arrête dès qu'une solution valide est trouvée. La mémoire reste constante et le calcul quasi instantané, même sur de gros tournois.
Une interface, plusieurs systèmes. Les différents systèmes d'appariement — suisse hollandais, toutes rondes, par équipes — sont isolés derrière une même interface (patron Strategy) : en ajouter un ne touche pas au code existant. De même, l'unique bibliothèque de composants Razor sert desktop et web sans duplication. Ces choix d'isolation rendent le logiciel ouvert à l'extension et coûteux à casser.