Un puzzle de gemmes comme banc d'essai algorithmique
Un Match-3 tient en une règle : échanger deux gemmes voisines et faire disparaître tout alignement de trois gemmes identiques ou plus. Derrière cette simplicité de façade se cache un petit moteur d'état — détection de motifs, gravité, réactions en chaîne — que je réimplémente ici from scratch en Canvas 2D, sans moteur de jeu ni dépendance. C'est un terrain idéal pour montrer comment je structure une logique qui doit rester lisible tout en restant correcte.
Détecter les alignements par balayage
À chaque coup, je balaye la grille ligne par ligne, puis colonne par colonne, en comptant les séries de gemmes identiques consécutives. Dès qu'une série atteint trois, je marque toutes ses cases. Cette passe unique repère aussi bien un simple triplet qu'un alignement de cinq, et un même balayage sert l'horizontale et la verticale. Je préfère cette approche déterministe à des cas particuliers empilés : une règle claire, appliquée partout, qui ne laisse pas d'alignement passer entre les mailles.
La gravité de remplissage
Quand des gemmes disparaissent, celles situées au-dessus tombent pour combler les vides, et de nouvelles gemmes apparaissent en haut de chaque colonne. Je traite chaque colonne indépendamment : je compacte les survivantes vers le bas, je compte les cases libres, puis je les remplis par le sommet. Chaque gemme mémorise sa hauteur de chute, ce qui me permet d'animer la descente proprement — une chute qui accélère, comme la gravité, plutôt qu'un simple saut d'une image à l'autre.
Les cascades en chaîne
Un remplissage peut recréer un alignement : les gemmes qui viennent de tomber en forment un nouveau, qui disparaît à son tour, provoque une nouvelle chute, et ainsi de suite. Je gère ces cascades avec une petite machine à états qui enchaîne disparition → chute → nouvelle détection tant qu'il reste des alignements, chaque maillon de la chaîne valant davantage de points. Le plateau se stabilise seul, sans risque de boucle infinie, parce que chaque étape retire strictement des gemmes avant d'en réintroduire.
Annuler un échange stérile
Un échange n'est validé que s'il produit un alignement. Dans le cas contraire, je rejoue l'animation à l'envers et les deux gemmes reprennent leur place : le coup est refusé, l'état d'avant est restauré à l'identique. C'est un détail de règle, mais c'est aussi une garantie que je cherche partout — une action sans effet utile ne doit jamais laisser le système dans un état intermédiaire douteux.
Ce que ce genre de rigueur vous apporte
Détection exhaustive, transitions réversibles, cascades bornées : ce sont les mêmes réflexes que j'applique à vos règles métier. Un moteur dont on peut suivre chaque état, qui ne laisse aucun cas au hasard et qui revient proprement en arrière quand une opération échoue, c'est ce qui distingue un logiciel qu'on subit d'un logiciel sur lequel vous pouvez construire durablement.