Tetris est l'un des jeux les plus populaires de tous les temps. Et Python est le langage de programmation n° 1 au monde. Alors, quoi de mieux pour s'initier à Python, ou perfectionner sa compétence, que de programmer un Tetris en Python ?


au sommaire


    Les trois jeux les plus populaires de tous les temps, si l'on en croit cette liste compilée à partir de sources diverses sont :

    • MinecraftMinecraft : 238 millions de copies ;
    • Grand Theft Auto V : 175 millions ;
    • Tetris : 100 millions.

    Il est pourtant permis de penser qu'il y a de fortes chances pour que l'estimation de Tetris soit sous-évaluée. En effet, ce jeu est sorti sur pratiquement toutes les plateformes existantes : ordinateurs, consoles de jeux, smartphones... Et cela inclut des systèmes très exotiquesexotiques. Il est donc quasi impossible de recenser toutes les versions de Tetris qui ont pu être diffusées, d'autant qu'il faudrait compter celles qui ont été programmées indépendamment du jeu officiel.

    Petite histoire de Tetris

    L'histoire de Tetris est contée dans le livre Alexey Pajitnov - L'incroyable histoire du créateur de Tetris, publié chez Pix'n'love. C'est en 1984 à l'Académie des Sciences de Moscou que Alexey Pajitnov a développé Tetris. Il officiait dans un local vétuste où s'entassaient les chercheurs, il fallait attendre des heures avant de pouvoir utiliser l'ordinateur de l'institut.

    Au bout de quelques semaines, on s'est mis à jouer à Tetris dans le moindre des instituts disposant d'un ordinateur à Moscou ! Pajitnov rêvait de faire publier son jeu dans le reste du monde. Pas facile... « Vous ne pouvez imaginer comment était la Russie à cette époque. Pour envoyer un simple fax, il fallait passer par des procédures humiliantes. J'ai donc dit à mon boss de m'aider à publier Tetris et que je n'exigeais aucune contrepartie... »

    Un agent britannique a découvert Tetris au cours d'une visite à Budapest. Pour en obtenir les droits, il a adressé fax sur fax à l'Académie des Sciences et a reçu un jour un message qu'il a interprété comme favorable. Sans attendre, il a vendu Tetris à une filiale de Maxwell, un groupe de presse britannique.

    Tetris a été un succès immédiat dans le monde occidental où il s'est répandu comme une traînée de poudre dès la fin 1987. Hélas, Pajitnov n'a pas perçu un maigre centime sur les ventes : le gouvernement  russe empochait tous les revenus liés à Tetris !

    En 1989, Nintendo s'apprêtait à lancer la Game Boy, une console de poche et son président Yamauchi a décidé qu'il fallait une version de Tetris pour cet appareil. Un agent opérant pour le compte de NintendoNintendo s'est rendu à Moscou, et a proposé une offre comme il ne s'en refuse pas ! Tetris a fait exploser les ventes de la Game Boy. Une fois de plus, Pajitnov n'a pas  touché un kopeck sur ces millions de cartouches...

    Maxwell a intenté un procès à Nintendo et la bataille juridique s'est prolongée durant plusieurs années. Lors d'une rencontre avec le président russe Gorbachev, le magnat Robert Maxwell a été jusqu'à demander qu'il intervienne pour casser le contrat avec Nintendo ! Sans succès.

    Il a fallu attendre 1996 pour que Pajitnov, qui avait émigré en Amérique entretemps, puisse enfin percevoir des droits sur les exemplaires de Tetris nouvellement vendus. Le programmeur russe n'éprouve aucune amertume et s'est dit heureux d'avoir pu « envoyer ce message de bonne volonté envers le monde occidental ».

    Alexey Pajitnov à Paris en 2014 (à droite), en compagnie de l'auteur du présent article. © F. Gorges, D. Ichbiah
    Alexey Pajitnov à Paris en 2014 (à droite), en compagnie de l'auteur du présent article. © F. Gorges, D. Ichbiah

    Préparer l’environnement de développement

    Programmer un Tetris n'est pas supérieurement complexe. Il s'agit avant tout d'un problème mathématique de déplacement de figures dans une grille, en fonction des touches actionnées. De ce fait, la programmation d'un Tetris a une belle valeur didactique.

    La dernière version de Python

    Pour coder un Tetris, quoi de mieux que PythonPython, qui est devenu le langage de programmation le plus populaire au monde. Si Python n'est pas sur votre ordinateur, veillez à installer la dernière version disponible depuis le site Python.org : https://www.python.org/downloads/

    Pycharm

    Il existe divers « notebooks » ou environnements de développement adaptés à Python. Pour le développement d'un Tetris, il est conseillé d'utiliser Pycharm qui est bien adapté au codage d'un jeu. Pycharm peut être téléchargé depuis cette adresse : https://www.jetbrains.com/fr-fr/pycharm/download/. Pour bénéficier de la version gratuite, il faut choisir le téléchargement proposé dans la section « Community ».

    Pycharm fonctionne sur Windows, Mac et LinuxLinux. Toutefois, si vous utilisez un PC 32 bits ou une ancienne version de MacOS, il faut vous rendre sur la page des autres versions disponible ici : https://www.jetbrains.com/pycharm/download/other.html

    Il est conseillé d'afficher les numéros de ligne dans votre version de Pycharm. Ainsi, il vous sera possible de bien suivre les explications indiquées plus bas. Pour ce faire, une fois qu'un projet est ouvert, placez la souris à gauche de la fenêtrefenêtre de codage. Faites un clic droit, sélectionnez « Appearance » puis « Show line numbers ».

    L’environnement de développement Pycharm est bien adapté au codage de jeux vidéo. © JetBrains
    L’environnement de développement Pycharm est bien adapté au codage de jeux vidéo. © JetBrains

    La bibliothèque Pygame

    L'un des avantages de Python est le très grand nombre de bibliothèques prédéfinies pour accomplir certaines tâches. Et il existe notamment plusieurs bibliothèques dédiées à la programmation de jeux vidéojeux vidéo. Le deuxième élément dont nous allons avoir besoin est la bibliothèque Pygame de Python, laquelle est dédiée au développement de jeux vidéo. Ne vous attendez à pouvoir programmer des jeux 3D à la Final Fantasy XVI à partir d'un tel outil. Pour l'essentiel, Pygame va servir à créer des jeux vintage et donc en 2D. Pour le codage d'un jeu tel que Tetris, il va largement faire l'affaire. Pour installer Pygame dans Pycharm et pouvoir l'utiliser :

    • ouvrez un projet dans Pycharm (par exemple le projet destiné à Tetris), puis choisissez « File », puis « Settings » ;
    • dans la barre de recherche tapez « pip ». Ouvrez ensuite « Project: (suivi du nom du jeu) », puis sélectionnez « Python interpreter ». Vous voyez apparaître les bibliothèques actives. Si pygame n'y figure pas, cliquez sur + ;
    • dans la barre de recherche, tapez « pygame ». Une fois cette bibliothèque repérée, cliquez sur « Install Package ».
    Le logo de Pygame, une bibliothèque Python dédiée au développement de jeux vidéo. © Pygame
    Le logo de Pygame, une bibliothèque Python dédiée au développement de jeux vidéo. © Pygame

    Le code de Tetris

    Dans le cadre de cette réalisation, nous nous sommes appuyés sur cette version de Tetris présente sur Github (https://github.com/StanislavPetrovV/Python-Tetris). Sur cette page, trois éléments nous intéressent plus particulièrement :

    • Main.py. Nous avons là le document qui contient le code de Tetris en Python. Nous allons le passer en revue plus bas et en exposer les points essentiels ;
    • le dossier « img ». Celui-ci contient deux fichiers, « bg.jpg » et « bg1.jpg » qui vont servir de fond d'écran au jeu Tetris. Vous pourrez, le cas échéant, une fois familiarisé avec le code correspondant, remplacer ces deux images par des visuels choisis par vous ;
    • Le dossier « font ». Il contient la police de caractères « font.ttf » qui est mise à contribution dans le jeu. Là encore, vous pourrez changer cette fontefonte si leur cœur vous en dit, une fois que vous serez bien familiarisé avec le codage du jeu.

    Il vous faut impérativement récupérer ces trois éléments et les placer dans un dossier de travail.

    « Main.py » pourra être ouvert depuis Pycharm. Toutefois, il est recommandé de taper les lignes une à une, ce qui aura une valeur didactique, d'autant que nous allons vous expliquer les éléments principaux de ce code.

    Les dossiers « img » et « font » doivent être copiés dans le répertoire qui va accueillir votre code. Une façon simple de récupérer ces éléments consiste à ouvrir le menu « Code de Github », puis « Download Zip ». Dézippez ce fichier. Vous retrouvez ces divers éléments que vous pouvez alors copier dans votre dossier de travail.

    Si vous consultez le dossier « screenshot » et ouvrez l'image qui s'y trouve, vous pouvez voir une capture d'écrancapture d'écran du jeu en action.

    Le jeu Tetris codé en Python, en action. © StanislasPetrovV, Github
    Le jeu Tetris codé en Python, en action. © StanislasPetrovV, Github

    Les 3 bibliothèques mises à contribution

    Quid du code ? Il se trouve dans le programme « main.py ».

    Nous avons vu plus haut que c'est la bibliothèque Pygame qui est mise à contribution pour le jeu Tetris. Cette bibliothèque est importée à la ligne 1. Toutefois, deux autres bibliothèques sont mises à contribution (lignes 2 et 3) :

    • la bibliothèque « deepcopy » permet de créer des copies de certains objets. C'est par exemple le cas à la ligne 97. Nous effectuons une copie de l'objet figure. De cette façon, nous pouvons manipuler cette copie sans toucher à l'original. Cette technique est fort prisée dans les jeux vidéo ;
    • le programme fait par ailleurs appel à la bibliothèque « random » dont la fonction consiste à générer des valeurs aléatoires, comme la génération d'une couleurcouleur aléatoire pour chaque nouvelle figure (ligne 42) ou la génération d'une nouvelle figure (ligne 44).

    Les éléments d’un jeu de Tetris

    Le jeu se décompose en sept activités principales, que nous retrouvons dans « main.py ».

    1. Affichage de la grille du jeu

    La grille est le tableau en deux dimensions dans lequel vont être affichés les tétraminos. Elle est définie dans les lignes 5 à 9 du jeu.

    Le programme créé ici par Stanislav Petrov définit une grille de 10 cases horizontales et 20 cases verticales, chaque case mesurant 45 pixelspixels. Si votre écran n'est pas en mesure d'accueillir une telle grille vous pouvez réduire le nombre de cases verticales, ou réduire leur taille.

    Sur la ligne 8, « RES » correspond à la taille de l'image de fond, 750 x 940 pixels.

    La grille elle-même est dessinée à la ligne 145 du programme. Les figures sont dessinées avec les instructions qui suivent. Vient ensuite le plateau du jeu (la variable field) qui représente l'état du jeu : chaque élément est soit vide, soit occupé par un bloc de couleur.

    L'affichage des titres du jeu (« Tetris », « score », « record ») est effectué à partir de la ligne 163 grâce à la fonction « blit » de Pygame qui sert à l'affichage d'une image.

    2. Produire une nouvelle figure

    Le jeu Tetris repose sur des tétraminos, soit l'équivalent de dominos composés de quatre carrés. Ces tétraminos sont au nombre de cinq, pas plus. Les plus simples sont la barre, le carré et le L. Les deux autres formes sont légèrement plus complexes. Évidemment, nous avons plus de formes en apparence du fait que ces cinq modèles peuvent apparaître sous plusieurs aspects. Le L par exemple, va avoir quatre aspects possibles, la barre n'en aura que deux (horizontale ou verticale), etc.

    L'instruction « pygame.Rect » que l'on rencontre à plusieurs reprises à partir de la ligne 16 est essentielle dans Pygame ; elle définit un rectangle à partir de ses quatre coordonnées.

    Les cinq figures possibles de tétraminos. © Wikimedia commons
    Les cinq figures possibles de tétraminos. © Wikimedia commons

    3. La boucle de gestion du jeu

    La boucle principale du jeu commence à la ligne 74 et se poursuit jusqu'à la fin du programme (ligne 182). Elle commence par récupérer le score le plus élevé enregistré, puis initialise les variables de déplacement pour les figures, elle affiche le fond d'écran avec l'instruction « blit » (ligne 77), puis le terrain de jeu (ligne 78).

    4. Gérer le déplacement - la rotation d'une figure

    Détection de la touche pressée par le joueur : de la ligne 84 à 95, la boucle while gère les événements Pygame récupérés avec l'instruction pygame.event.get() qui détecte la touche du clavierclavier que le joueur actionne (KEYDOWN) :

    • vers la gauche (pygame.K_LEFT) ;
    • vers la droite (pygame.K_RIGHT) ;
    • vers le bas (pygame.K_DOWN) ;
    • touche vers le haut (pygame.K_UP) afin de faire tourner la figure.

    Si la touche gauche ou droite est tapée, la variable dx (déplacement sur l'axe horizontal x) est mise à jour.

    Gestion du déplacement de la figure : à partir de la ligne 96, le jeu gère le déplacement horizontal (x) et vertical (y) des figures, et aussi à la ligne 108 la vérification de chaque bord de la grille pour empêcher que la figure ne puisse sortir de la zone de jeu.

    Si la touche « Vers le bas » a été pressée, cela provoque une chute accélérée de la pièce vers le bas - cf. ligne 93.

    Gestion de la rotation de la figure : le code qui démarre à la ligne 118 et va jusqu'à la ligne 128 gère la rotation de la figure en cours autour de son centre en calculant de nouvelles coordonnées x et y, à même d'engendrer une rotation de 90° autour du centre de la figure.

    5. Stopper le déplacement dès qu’une collision se produit

    Si la figure atteint le bas du terrain de jeu ou touche une autre figure déjà en place, elle se fige et une nouvelle figure apparaît en haut de la zone de jeu. C'est l'instruction de la ligne 114 qui choisit aléatoirement une nouvelle figure et lui attribue une couleur (générée au hasard avec le code qui se trouve à la ligne 42).

    6. Détecter si une ligne est complète

    Les instructions qui se trouvent entre les lignes 130 et 141 suppriment les lignes complètes. Les rangées sont parcourues depuis le bas vers le haut et le programme compte le nombre de cases remplies. Si une ligne est complète, elle est supprimée et lorsque cela se produit, la vitessevitesse d'animation est augmentée (ligne 140) afin de corser à chaque fois la difficulté du jeu.

    7. Gérer le game over

    Les instructions qui démarrent à la ligne 169 gèrent la situation de game over :

    • la boucle « for » parcourt chaque colonne de la première ligne du champ de jeu ;
    • si l'un des carrés d'une figure se trouve dans la première ligne, cela signifie que le joueur a perdu. Le programme enregistre le score et réinitialise le plateau du jeu, le compteur d'animation, la vitesse d'animation et la limite d'animation, et enfin le score ;
    • l'écran est réinitialisé comme en début de partie.

    Si le joueur quitte juste la partie avant la fin de son plein gré, c'est la séquence présente aux lignes 85-86 qui est activée.

    Développer des jeux 3D

    Si, après avoir codé ce Tetris et d'autres jeux en Python, vous souhaitez vous frotter à la 3D, vous pouvez mettre à contribution une bibliothèque telle que Panda3D.