Aller au contenu principal
sports_esports Lab Canvas 2D Sac de 7 Wall-kick Zéro dépendance

Tetris — le puits, les tétrominos et le sac de 7 en Canvas 2D

Le puzzle culte de 1984, réécrit from scratch en Canvas 2D : matrice de puits 10 × 20, détection de collision et verrouillage des pièces, effacement de lignes avec compactage, rotations avec wall-kick simple et distribution des sept tétrominos par sac de 7. Zéro dépendance.

Flèches ← → : déplacer, ↑ ou X : pivoter, ↓ : descente douce Entrée : chute rapide (hard drop) Espace : démarrer et mettre en pause

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.

Photo d'Emmanuel BALLERY, fondateur de x10

À propos de l'auteur

Emmanuel BALLERY est le fondateur de x10 solutions. Ces petits jeux sont surtout un plaisir de développeur, codés le week-end — pas une vitrine de mes missions, qui sont bien plus exigeantes. J'y soigne quand même la performance et la lisibilité, par habitude.

Voir plus arrow_forward
rocket_launch

Un vrai projet en tête ?

Ce petit jeu m'amuse, mais il ne dit pas grand-chose de mon métier : mes missions sont bien plus complexes. Si vous avez une application à concevoir ou à fiabiliser, c'est là que je suis vraiment utile.

Discuter de mon projet arrow_forward