🧩 Blocs néon

Un jeu d'empilement de blocs rétro à l'ambiance néon. Chaque pièce affiche "JF" ou "So" en alternance sur ses blocs. Déplacez avec les flèches gauche / droite / bas, tournez avec la barre d'espace.

Blocs néon

Appuyez sur une flèche ou espace pour commencer.

Prochain

Score 0
Lignes 0
Niveau 1
déplacer
descente rapide
Espace rotation
P pause

Comment jouer

Les flèches gauche et droite déplacent la pièce, la flèche du bas la fait descendre d'un cran et ajoute un point, la barre d'espace la tourne d'un quart de tour horaire et la touche P met en pause.

Le plateau fait dix colonnes sur vingt rangées. Une rangée complète disparaît et tout ce qui la surplombe descend. Une seule ligne vaut 100 points, deux en valent 300, trois 500 et quatre 800, le tout multiplié par le niveau courant, qui monte à chaque dix lignes effacées.

Les pièces portent « JF » et « So » en alternance, et l'étiquette reste collée aux blocs une fois la pièce verrouillée. La case d'aperçu montre la pièce suivante, de quoi préparer un puits sans jouer à l'aveugle.

Comment c'est construit

Une pièce n'est pas une matrice 4×4 pleine, c'est une liste de quatre coordonnées [rangée, colonne] dans un repère de côté quatre, plus une couleur. SHAPES décrit les sept formes de cette façon. La rotation tient alors sur une ligne: rotateCW envoie (r, c) sur (c, 3 - r), ce qui est le quart de tour horaire dans un carré de côté quatre. Pas de table de rotation ni de cas particulier, sauf le carré que tryRotate laisse tranquille: le tourner ne changerait rien à l'écran mais décalerait ses coordonnées.

Tout le placement passe par collides, qui projette les quatre cellules avec occupiedCells et rejette la position si une cellule sort des colonnes, dépasse la dernière rangée ou tombe sur une case déjà occupée. Les rangées négatives sont tolérées: une pièce peut naître au-dessus du plateau. tryMove et tryRotate testent une copie et n'écrivent dans l'état que si elle passe. Pour la rotation, j'essaie cinq décalages horizontaux dans l'ordre 0, -1, 1, -2, 2 et je garde le premier qui tient, ce qui permet de tourner une barre collée contre un mur.

Le verrouillage se déclenche dès que la descente échoue. lockPiece recopie la couleur et l'étiquette dans board, appelle clearLines, promeut la pièce d'aperçu, puis déclare la fin de partie si la nouvelle pièce entre déjà en collision. clearLines balaie de bas en haut, teste une rangée avec every, la retire par splice et réinsère une rangée vide en tête par unshift; l'indice est réincrémenté pour retester la même position, sinon deux rangées pleines superposées ne partiraient pas au même tour.

La gravité ne compte pas les images. dropTimer accumule des millisecondes et se compare à dropInterval, qui vaut 800 millisecondes moins 65 par niveau, plancher à 100. Le delta-time est borné à un trentième de seconde, donc revenir sur un onglet en arrière-plan ne déclenche jamais une avalanche de descentes.

Ce que j'en ai retenu

La leçon utile ici tient dans la représentation. Tant que j'ai pensé une pièce comme un dessin, la rotation demandait des tables. En la ramenant à quatre paires de coordonnées, la rotation est devenue une soustraction et le reste du code a rétréci autour.

L'autre réflexe vient de l'intégration vidéo: séparer l'horloge du rendu. Un décodeur qui rate une trame ne doit pas rater son décompte, et une pile qui tombe suit le même principe. Le rendu peut sauter, l'état ne saute pas.