Un puits, une matrice, des collisions
Tout Tetris repose sur une structure de données simple : une matrice de 10 colonnes sur 20 lignes, où chaque cellule est vide ou occupée par un bloc. La pièce en cours n'existe pas dans cette matrice ; je la maintiens à part, avec sa position et sa forme. Avant chaque déplacement, chaque rotation et chaque pas de chute, je teste la position visée : si une cellule pleine de la pièce sortirait du puits ou recouvrait un bloc déjà posé, le mouvement est refusé. Ce test de collision, toujours joué sur une copie de la position avant de l'appliquer, est la brique qui garantit qu'aucune pièce ne traverse jamais un mur ni une autre pièce.
Le verrouillage, moment de vérité
Quand la pièce ne peut plus descendre d'un cran, elle se verrouille : ses blocs sont écrits une fois pour toutes dans la matrice, puis une nouvelle pièce apparaît. C'est le seul instant où la pièce mobile rejoint le décor fixe. J'y vérifie systématiquement les bornes avant d'écrire dans la matrice — un index hors limites suffirait à faire planter la partie. Si la nouvelle pièce ne peut même pas apparaître, la partie est terminée : la règle de fin de jeu découle directement de la même détection de collision.
Effacer des lignes, puis compacter
Après chaque verrouillage, je parcours le puits de bas en haut à la recherche des lignes complètes. Une ligne pleine est retirée, et une ligne vide est réinsérée tout en haut : les lignes au-dessus descendent naturellement d'un cran. Effacer plusieurs lignes d'un seul coup rapporte davantage de points qu'en effacer autant l'une après l'autre, et le niveau grimpe avec le nombre total de lignes, accélérant la chute. Ce compactage est un détail qui doit être exact : une erreur d'index et ce sont des blocs qui disparaissent ou se dédoublent.
Un sac de 7 pour une distribution juste
Tirer chaque pièce complètement au hasard produirait des séquences frustrantes — cinq barres d'affilée, ou aucune pendant trop longtemps. J'utilise donc le sac de 7 : les sept tétrominos sont mélangés, puis distribués un à un jusqu'à épuisement du sac, avant d'en remplir un nouveau. Chaque pièce revient ainsi à intervalle régulier, sans jamais deux fois de suite la même série. Le hasard reste présent, mais borné — exactement le genre d'équité qu'on attend d'un système fiable.
Des rotations qui pardonnent
Faire pivoter une pièce contre un mur ou une paroi de blocs devrait bloquer la rotation. Plutôt que de l'interdire sèchement, j'applique un wall-kick simple : si la pièce pivotée entre en collision, j'essaie de la décaler d'une colonne à gauche, puis à droite ; si aucun décalage ne convient, la rotation est annulée. Ce petit filet de sécurité rend le jeu bien plus agréable, sans jamais autoriser une position illégale. C'est l'illustration de ce que je recherche dans chaque projet : une mécanique rigoureuse au cœur, et juste ce qu'il faut de souplesse pour que l'outil reste plaisant et prévisible entre les mains de celui qui l'utilise.