Skip to content

Vaynerov Technologies

Nous ne nous contentons pas de développer — nous façonnons chaque ligne de code et chaque pixel comme par enchantement.

Tous les articlesAnalyses techniques

Les échecs en quatre dimensions : dans le moteur Tesseract

Tesseract est arrivé aujourd'hui dans le Labo : des échecs complets sur un plateau 5×5×5×5, avec deux espèces de pions, des pièces qui glissent à travers plans et hyperplans, un moteur déterministe tournant dans un Web Worker, et un lot de problèmes dont les solutions sont prouvées par recherche avant publication. Voici ce que cela a demandé.

Vaynerov TechnologiesLe studio
Publié 10 min de lecture
Sur cette page
  1. Un plateau de 625 cases
  2. Quatre-vingts directions d'attaque
  3. Une position de départ qui est un théorème
  4. Compter chaque coup, deux fois
  5. Rendre quatre dimensions lisibles
  6. Un adversaire qui tient dans un Web Worker
  7. Des problèmes aux solutions vérifiées par la machine
  8. Des échecs en quatre dimensions sur un canal non fiable

Les variantes d'échecs ajoutent d'ordinaire un gadget à un plateau que tout le monde comprend. Nous voulions l'inverse : garder des règles reconnaissables entre toutes, et changer l'espace — de deux dimensions à quatre. Le résultat, c'est Tesseract, le treizième jeu de notre Labo, et de loin la chose la plus exigeante mathématiquement que nous ayons livrée dans un navigateur.

Quatre dimensions, cela sonne comme un argument marketing jusqu'au moment d'écrire le générateur de coups. Là, cela devient très littéral : ici, une tour attaque le long de huit rayons, pas quatre. Un fou en attaque vingt-quatre. Il y a deux nouvelles pièces à glissement parce que l'espace 4D possède deux nouvelles sortes de diagonales, et il y a deux sortes de pions parce qu'un pion a besoin d'un axe d'avance et que le plateau en compte désormais deux de libres. Chacune de ces affirmations a dû survivre à un vérificateur écrit indépendamment avant que nous y croyions nous-mêmes.

625
cases — réseau 5⁴
80
directions d'attaque
226
coups légaux à l'ouverture
11.66M
nœuds de perft(3), 0 écart

L'espace de recherche de Tesseract, vérifié le 26 juillet 2026 contre un générateur écrit indépendamment.

Un plateau de 625 cases

Le plateau est un réseau 5×5×5×5 — 625 cases, les coordonnées (x, y, z, w) allant chacune de 1 à 5. En interne, une case est un seul entier : idx = (x−1) + 5(y−1) + 25(z−1) + 125(w−1). Le moteur de rendu utilise le même encodage, si bien qu'un indice de case franchit la frontière moteur/rendu sans traduction — aucun bug de coordonnées à la couture, parce qu'il n'y a pas de couture.

Le grand classique du hors-plateau empire en 4D : chaque rayon glissant doit savoir où se trouve le bord dans quatre-vingts directions. Les moteurs 2D classiques résolvent cela par un mailbox — un plateau rembourré dont les cases de bordure sont marquées invalides — et l'idée se généralise magnifiquement. Tesseract utilise un mailbox 9⁴ : 6 561 entrées de 32 bits, environ 26 ko, où le plateau jouable 5⁴ se tient à deux cases de chaque bordure — exactement la portée d'un cavalier. La détection du hors-plateau se réduit à une lecture de tableau. L'alternative, des tables de rayons par case, aurait coûté quelque 350 ko et bien plus de défauts de cache.

Quatre-vingts directions d'attaque

En n dimensions, la généralisation naturelle du déplacement aux échecs est l'ensemble des vecteurs de direction non nuls à composantes dans {−1, 0, 1}. En 4D, cela donne 3⁴ − 1 = 80 directions, qui se répartissent selon le nombre d'axes bougeant à la fois : 8 directions changent un axe, 24 en changent deux, 32 en changent trois, 16 les changent tous les quatre.

Ces quatre classes sont le jeu de pièces. La tour garde la classe un. Le fou garde la classe deux — les diagonales familières, désormais au nombre de vingt-quatre. La classe trois revient à la licorne, pièce empruntée au Raumschach, la variante tridimensionnelle de 1907 : elle glisse le long des diagonales d'espace qui n'existent pas sur un plateau plat. La classe quatre revient au dragon, notre nom pour la pièce qui se déplace sur les vraies 4-agonales, ces directions où les quatre coordonnées changent d'un coup. La dame et le roi prennent les quatre-vingts. Le cavalier se généralise aussi : un saut (2, 1, 0, 0) dans n'importe quelle paire d'axes et n'importe quelle combinaison de signes — 48 sauts distincts.

Les 80 directions de glissement des échecs 4D, groupées selon le nombre d'axes qui bougent à la fois. Chaque classe est le territoire d'une pièce : tour (8), fou (24), licorne (32), dragon (16).

L'intuition échoue ici de manières intéressantes, alors nous avons compté. En sommant les coups légaux d'une pièce sur chaque case d'un plateau vide : la tour en trouve 10 000 ; le fou 18 000. Sur un plateau plat, la tour est la plus forte des pièces à glissement ; en quatre dimensions, le fou a tout simplement plus de place. Le dragon, seigneur de la classe de directions la plus exotique, n'en rassemble que 5 664 — les 4-agonales sont courtes et rares depuis la plupart des cases — et c'est pourquoi la paire siège sur la troisième rangée du plateau plutôt que de tenir un coin. Ce ne sont pas des impressions : ce sont des constantes figées dans l'autocontrôle du moteur, et le build échoue si le générateur de coups vient un jour à les contredire.

PièceDirectionsCoups sur plateau vide (625 cases)
Dame8049 664
Roi8027 936
Fou2418 000
Licorne3216 000
Cavalier48 sauts14 400
Tour810 000
Dragon165 664

Mobilité totale par pièce, sommée sur chaque case d'un plateau 5⁴ vide. En 4D, le fou porte plus loin que la tour — l'inverse des échecs plats.

Une position de départ qui est un théorème

Concevoir une position initiale pour un plateau auquel personne n'a jamais joué est un piège : comment savoir que les Blancs ne sont pas matés en quatre, ou qu'un mur de pions ne rend pas la partie nulle par construction ? Nous avons rendu la position démontrable plutôt que plausible. L'armée noire est la symétrie ponctuelle exacte de la blanche — chaque pièce passe par σ : p → 6−p sur les quatre coordonnées. La symétrie centrale garantit un équilibre matériel et positionnel parfait, et elle a une conséquence plus discrète que nous aimons davantage encore : rien n'est attaqué au départ. Si une pièce blanche attaquait une pièce noire au coup zéro, la symétrie ferait exister l'attaque réciproque, et la position serait un chaos tactique. Elle ne l'est pas, et cela se vérifie.

La position de départ est un théorème, pas une convention : son équilibre découle de la symétrie centrale, et le moteur le vérifie à chaque build.

Les douze pièces majeures occupent un plateau 5×5 en y=1, w=1 (le roi au centre de la première rangée, la paire de dragons sur la troisième), et les pions répondent à la question de conception la plus étrange du jeu : de quel côté est l'avant ? Tesseract a des pions Y qui avancent selon l'axe y et des pions W qui avancent selon w, et les deux espèces occupent les deux hyperplans centraux — la seule bande du plateau où un pion blanc se tient exactement face à son image noire. Trois tailles d'armée sont livrées (légère, standard, dense) en élargissant la bande de pions ; la standard fait 32 pièces par camp, le même recensement que les échecs classiques, ce qui nous a paru juste.

Compter chaque coup, deux fois

Un moteur d'échecs ne vaut jamais mieux que son générateur de coups, et un générateur 4D a des modes de défaillance qu'aucun humain ne repère à l'œil — personne n'a l'intuition d'un clouage de licorne manquant le long d'une triagonale. Tesseract est donc vérifié comme le sont les moteurs sérieux : par perft, le décompte exhaustif des feuilles atteignables à une profondeur donnée, calculé deux fois par deux générateurs qui ne partagent rien.

Le générateur rapide est légal, pas pseudo-légal : il calcule échecs et clouages une fois par nœud en balayant depuis le roi, puis n'émet que les coups qui survivent — un double échec ne donne que des coups de roi, un échec simple donne prise ou interposition, une pièce clouée ne peut voyager que le long de son rayon de clouage. Le générateur naïf est délibérément bête et lent. Ils se sont accordés sur 50 618 nœuds recoupés, sans le moindre écart ; le perft(3) complet depuis l'ouverture fait 11 661 294 nœuds. Un laboratoire à pions distinct — une position bâtie pour exercer les doubles pas, les deux axes de prise, la prise en passant et la promotion — ajoute 559 319 nœuds concordants. Et comme tout le moteur est entier, sans le moindre flottant dans la logique de jeu, un script figé de 40 demi-coups doit aboutir au même hachage Zobrist dans chaque navigateur, à chaque build. Le déterminisme n'est pas un agrément : c'est ce qui rend le mode en ligne possible.

Rendre quatre dimensions lisibles

Le problème le plus difficile n'a jamais été le moteur. C'était l'écran. Une position 4D doit atterrir sur un moniteur 2D sans mentir sur la géométrie, et l'astuce habituelle — dessiner une jolie ombre tournante de tesseract — ne sert à rien pour jouer. Notre réponse est presque gênante de platitude : dessiner le réseau 5⁴ comme une grille 5×5 d'échiquiers 5×5. Les axes x et y vivent à l'intérieur de chaque petit échiquier ; z et w choisissent l'échiquier. L'application est worldX = (w−3)·PITCH + (x−3)·CELL, et sa propriété cruciale est d'être affine dans les quatre coordonnées : toute droite 4D — rayon de tour, triagonale de licorne, 4-agonale de dragon — se projette en une ligne droite de cases éclairées à l'écran. C'est par cette rectitude que l'œil apprend la géométrie.

Une seule application affine, aucune perspective : x et y vivent dans chaque sous-échiquier, z et w le sélectionnent. Les rayons 4D restent droits à l'écran — et c'est ainsi que la géométrie s'apprend.

La caméra est orthographique à dessein — la perspective courberait cette affinité, et elle casserait aussi le pointage, qui est ici un inverse en forme close de la projection plutôt qu'un lancer de rayon sur GPU. Tout le champ se rend en un seul quad texturé (les 25 damiers cuits dans une unique texture de canvas), seize maillages instanciés pour les armées, cinq pour les surbrillances : environ 24 appels de dessin au pire, sur un canvas en frameloop="demand" qui ne rend exactement aucune image pendant que vous réfléchissez. Pour les moments où l'on veut la forme honnête de la chose, une seconde vue dessine le vrai tesseract — cube intérieur en w=1, extérieur en w=5, tournant par une rotation isoclinique — et rend la leçon de géométrie à vos yeux.

Un adversaire qui tient dans un Web Worker

La position de départ compte 226 coups légaux, contre vingt aux échecs classiques, et c'est le facteur de branchement mesuré avec lequel la recherche doit vivre. À cette largeur, la recherche doit être humble et doit quitter le thread principal ; le palier maître réfléchit jusqu'à 3,5 secondes, ce qui gèlerait l'onglet s'il tournait là où vit React. Le moteur exécute donc un negamax fail-soft à approfondissement itératif dans un Web Worker, en s'appuyant fortement sur l'élagage par coup nul, les réductions de coups tardifs et l'élagage de futilité pour survivre à la largeur. Quatre paliers de difficulté sont livrés, de l'adversaire instantané à 60 ms doté d'une évaluation délibérément bruitée jusqu'à un maître de 16 Mo de table qui atteint la profondeur six. Même le hasard de l'IA est déterministe : le bruit sur les coups à la racine vient d'un générateur à graine liée à la partie enregistrée, si bien qu'une partie rejouée se rejoue à l'identique.

Des problèmes aux solutions vérifiées par la machine

Toutes les applications d'échecs ont des problèmes ; la plupart en ont quelques-uns de cassés. En quatre dimensions, un problème cassé serait irréparable par signalement d'utilisateur — personne ne peut voir à l'œil nu la réfutation d'un mat en trois 4D. Aucun problème n'est donc publié sur parole. Chacune des douze études du lot doit passer trois vérifications machine : l'exactitude (une recherche à deux fois la profondeur annoncée trouve le mat en exactement N, à partir du coup-clé indiqué), l'unicité (aucun autre premier coup ne mate aussi vite) et le caractère forcé (toute réponse de la défense perd encore). Le tutoriel guidé reçoit le même traitement : ses huit leçons sont prouvées gagnables en jouant tous les coups légaux de la pièce enseignée dans le vrai moteur. Si une leçon peut être ratée, c'est le build qui échoue en premier.

Des échecs en quatre dimensions sur un canal non fiable

Le jeu en ligne passe par un canal de diffusion temps réel, et nous traitons ce canal pour ce qu'il est : un relais non fiable. Les pairs s'accordent sur une clé par ECDH, et chaque coup traverse le réseau authentifié — un HMAC sur une sérialisation canonique incluant la version du protocole, l'identifiant de la partie, l'identité de 128 bits liée à l'émetteur et un numéro de séquence de demi-coup. Vient ensuite la vérification qui rend tout le reste presque décoratif : le client récepteur revalide chaque coup entrant contre son propre générateur de coups légaux. On ne discute pas avec un coup falsifié ou corrompu : il est simplement illégal, et le déterminisme du moteur fait que les deux échiquiers ou bien s'accordent parfaitement, ou bien détectent la désynchronisation par hachage Zobrist dès le coup suivant.

// A move on the wire: eight digits (from-xyzw, to-xyzw) + optional promotion.
const WIRE_MOVE = /^[1-5]{8}[QRBNUD]?$/;

"22132313";  // Y-pawn at (2,2,1,3) steps forward along y to (2,3,1,3)
"24132513Q"; // the same pawn reaching y=5 promotes: Q R B N U or D

Le format réseau est délibérément bête. La légalité n'est jamais lue depuis le réseau : elle est recalculée localement, à chaque coup.

Tesseract a pris la plateforme bâtie au fil de treize jeux — les paliers de qualité partagés, le synthétiseur audio, le contrat plein écran, la règle du canvas unique — et l'a entièrement pointée vers une seule question : un navigateur peut-il apprendre à un humain à voir en quatre dimensions ? Après une semaine passée à perdre contre notre propre palier débutant, la réponse honnête nous semble être : lentement, et c'est tout le plaisir.