Aujourd'hui, nous étudierons l'intérieur du jeu Tetris écrit sous la plateforme Arduino et matrice LED.
L'auteur de ce produit fait maison est AlexGyver, l'auteur de la chaîne YouTube du même nom. Bienvenue dans le monde merveilleux des pixels carrés.
Commençons par l'histoire. Tetris est un jeu dans lequel les chiffres composés de 4 carrés tombent de haut en bas. Dans différentes combinaisons, ces formes peuvent être tournées et déplacées vers la gauche et la droite. Le but du jeu est de collecter des niveaux horizontaux qui sont effacés et des points vous sont attribués. La perte est considérée comme le moment où la nouvelle figure n'a nulle part où tomber. Tetris a été inventé par le programmeur soviétique Alexei Leonidovich Pazhitnov.
La version originale de Pascal est apparue le 6 juin 1984. Depuis lors, Tetris a parcouru un long chemin et a été porté sur toutes les plateformes sur lesquelles il est généralement possible de jouer à des jeux, ainsi que sur des appareils qui ne sont pas du tout destinés à des jeux, tels qu'une calculatrice d'ingénierie, un oscilloscope et, vous ne le croirez pas, un fer à souder.
Par le nombre de versions commerciales vendues, Tetris est supérieur à tout autre jeu de l'histoire de l'humanité. Pour un seul Game Boy, 35 millions d'exemplaires ont été vendus, sans parler du Brick Game portable, qui avait presque tous en même temps.
Nous allons commencer l'implémentation de tetris sur arduino et d'une matrice de couleurs avec l'analyse des «béquilles». La matrice se compose de LED d'adresse tricolores. Le problème avec ce type de matrice est qu'elle est trop cool. La couleur de chaque pixel est codée sur 24 bits, soit 8 bits pour chaque composant: rouge, vert et bleu. Il n'y a pas un tel type de données sur Arduino, il y a ce qui suit - 32 bits.
Les couleurs de toutes les LED doivent être stockées dans la RAM, car nous les changerons. Et que, pour une matrice 16 x 16, nous avons exactement 1 Ko de mémoire dynamique occupée, et arduino nano n'en a que 2.
Ajoutez quelques bibliothèques supplémentaires et commencez à écrire du code, la mémoire se terminera. L'auteur n'utilise essentiellement pas, par exemple, Arduino Mega, où il y a plus de mémoire. Le but est de rendre le jeu spécifiquement sur arduino nano, en utilisant des outils simples, standard et bien connus, mais en même temps des approches et des «béquilles» non standard et avec leur aide pour obtenir le code le plus optimal.
La première «béquille» sera le refus de stocker séparément dans la mémoire les positions des personnages et en général tout ce qui se passe à l'écran.Nous devons stocker les coordonnées des points de la figure d'alimentation et les coordonnées des points des figures déjà supprimées, c'est-à-dire, au maximum, nous avons besoin d'un autre tableau 1, bidimensionnel 16 par 16, et cela peut atteindre 256 octets.
Vous et moi avons déjà un tableau de couleurs pour tous les pixels, utilisons-le. En effet, en plus du fait que l'on peut mettre un point coloré sur la matrice, on peut mesurer la lumière d'un point existant pour travailler avec les couleurs.
Tetris commence par un bloc qui tombe, qui est contrôlé par des boutons et a 2 coordonnées dans le système de coordonnées de la matrice. C'est très simple, on construit un timer, selon lequel le bloc va tomber. Il s'agit de la bibliothèque de l'auteur, que vous pouvez lire sur le site.
Pour traiter les boutons, l'auteur utilise également sa bibliothèque. Le schéma de connexion des boutons est ridiculement simple: 4 boutons, 8 fils.
À chaque étape de la minuterie, nous dessinons un point un pixel en dessous de l'ancien et dessinons l'ancien point en noir, c'est-à-dire éteignons la LED. En cliquant sur le bouton, nous faisons de même, mais avec une coordonnée horizontale. Eh bien, pour la décence, nous limiterons la taille de la matrice afin que le point ne dépasse pas le champ.
Vous voyez, rien de compliqué. Mais ce n'est pas pour longtemps car le moment est venu de tirer des chiffres. Nous travaillerons comme suit: nous garderons la référence au point d'approvisionnement, que nous avons déjà écrit, nous l'appellerons le point principal ou le bloc principal. Le bloc principal se déplace dans le système de coordonnées matricielles, nous l'avons déjà fait. Toutes les figurines de Tetris se composent de 4 blocs, c'est pourquoi, d'ailleurs, on l'appelle Tetris.
En conséquence, il nous reste à terminer l'ajout de 3 blocs supplémentaires au bloc principal. Écrivons leurs coordonnées dans le système de coordonnées du bloc principal, afin que le bloc principal soit toujours en dessous. C'est très simple, prenez la figure de la lettre inversée T. Le bloc principal du bas vers le centre a des coordonnées 0,0 dans son système de coordonnées.
Le bloc supérieur est de 0,1, la droite de 1,1 et la gauche de -1,1.
Prenez la lettre G. Le bloc inférieur est 0,0, le 0,1 suivant, le 0,2 suivant et le bord de la lettre 1,2.
Nous écrivons ces coordonnées dans le tableau sous la forme suivante: {0,1, 0,2, 1,2} et déposons le tableau dans la mémoire flash afin de ne pas gaspiller la mémoire dynamique. Quant à la rotation des chiffres. Il est impossible de faire pivoter les chiffres. C'est ringard, il est très difficile d'expliquer au microcontrôleur comment procéder. Pour ce faire, vous devez définir le centre de rotation, décomposer en quelque sorte la figure en parties et rechercher de nouvelles coordonnées pour chaque partie, en tenant compte de la forte pixellisation, ce qui entraînera évidemment des erreurs et se révélera un non-sens. Le problème est résolu très simplement, on gardera en mémoire les 4 positions pour toutes les figures et toutes.
En fait, il reste maintenant à sélectionner au hasard le numéro de la figure et à le dessiner autour du bloc qui tombe. Ici, pour les 3 blocs restants, nous prenons les coordonnées de la mémoire flash, les traduisons en coordonnées globales de la matrice et allumons les LED. À propos, la couleur est également choisie au hasard parmi les 6 couleurs les plus simples et les plus lumineuses de l'espace RVB. L'angle de rotation de la figure au début du tour est également défini de manière aléatoire, et lorsque vous appuyez sur le bouton vers le haut, prenez simplement l'ensemble de coordonnées suivant pour le dessiner et le faire pivoter dans le sens des aiguilles d'une montre. Le déplacement d'une forme fonctionne tout de même. Tout d'abord, nous effaçons la figure à la position précédente, c'est-à-dire la dessinons en noir, puis dans la nouvelle position, dessinons la couleur actuelle de la figure. En tournant, encore une fois, nous effaçons l'ancienne position et en dessinons simplement une nouvelle.
Le firmware peut être téléchargé sur. Nous n'analyserons que l'essence. Commençons par vérifier les murs gauche et droit et le bas. Tout est très simple avec le fond, on regarde à chaque étape de la chute, l'unité de base a atteint une hauteur de 0, ce n'est pas difficile, mais à chaque fois qu'on appuie sur le bouton de commande, il faut voir si le point extrême de la forme des parois latérales de la matrice est touché.
Si vous le touchez, ne déplacez pas la figure. Il en va de même pour la rotation des chiffres. Par exemple, si la nouvelle position de la figure s'étend au-delà des murs, alors la rotation est interdite, et puisque toutes les formes que nous avons sont de formes différentes, alors les blocs extrêmes pour eux sont tous différents. Il serait possible de peindre des blocs extrêmes individuels pour chaque figure afin de simplifier le travail du microcontrôleur, mais il faut considérer qu'ils l'ont inventé pour cela.
Tout est très simple. Mais la tâche suivante est beaucoup plus intéressante. Nous devons vérifier les collisions avec des blocs déjà en dessous.Si nous avions un tableau contenant l'état de toutes les cellules du champ, ce serait plus facile, mais nous utiliserons un tableau de couleurs pour les pixels de la bande, nous aurons donc la «béquille» la plus cool. Quel est le vrai problème. Tout semble être simple, une figure verte tombera, et à chaque étape de la chute, chaque changement de côté et chaque tentative de virage devrait vérifier si la figure dans la nouvelle position repose sur les figures déjà couchées. Si pour tous les blocs, la couleur environnante est égale au noir ou égale à la couleur de la figure, nous autorisons le mouvement dans la direction souhaitée. Cela fonctionnera jusqu'à ce que la forme en dessous de nous soit de la même couleur que la forme tombante. C'est en fait la «béquille»: nous allons repeindre la forme tombée dans une couleur différente. Repeindre imperceptiblement pour les yeux, mais perceptible pour le programme. Tout ce que vous avez à faire est d'augmenter légèrement la luminosité de la couleur actuelle de la forme et c'est tout.
La figure est tombée sur le fond ou sur une autre figure, sa luminosité n'a pas sensiblement augmenté, et dans le nouveau tour les figures tombantes ne confondront plus sa couleur avec la leur, elles tomberont sur elle et tout aussi fixe, ajoutant légèrement de la luminosité.
Soit dit en passant, lorsque vous appuyez sur le bouton, la figurine se précipite à grande vitesse et prend sa place.
Notre Tetris se retrouve avec la touche finale, à savoir vérifier et effacer les niveaux remplis horizontalement. Ici, tout est simple. Après avoir fixé la figure dans le tour en cours, nous nous déplaçons le long des lignes et comparons les couleurs des pixels avec le noir. S'il n'y a pas un seul pixel noir sur toute la ligne, nous effacerons toute la ligne.
Les lignes détectées sont remplies de blanc, puis la luminosité tombe progressivement à zéro et l'animation est obtenue. De plus, tous les pixels, à partir de la première ligne remplie vers le haut, sont décalés vers le bas de et le nombre de lignes qui ont été effacées. Ce processus est répété jusqu'à ce qu'il n'y ait plus de niveaux terminés. Nous vérifions également si nous avons atteint le sommet, ce qui signifie perdre. Dans ce cas, un compte égal au nombre de niveaux effacés s'affiche.
Le compte est affiché en chiffres, qui sont stockés en mémoire sous la forme d'un ensemble de uns et de zéros, selon lequel les LED sont ensuite allumées ou éteintes. Voici à quoi ressemble Tetris écrit dans la matrice d'adresse. Merci de votre attention. A très bientôt!
Vidéo: