Tous les projets

Tetris et IA

Je code une IA qui joue à Tetris

  • Python
  • Pygame

On parle de plus en plus d'intelligence artificielle : je me suis donc testé à en créer une sur mon temps libre, en commençant par une IA simple en Python capable de jouer à Tetris.

C'est après avoir regardé les vidéos de Code BH que j'ai eu envie de me lancer, parce qu'on comprend mieux un sujet en le pratiquant. J'ai suivi sa méthodologie et écrit mon propre code.

Développement du jeu

Avant de créer l'IA, il fallait créer le jeu. J'ai utilisé la bibliothèque Pygame pour l'affichage et les interactions. Le principe est simple : des blocs de formes et de couleurs différentes tombent du haut de l'écran, et le joueur doit les placer pour former des lignes complètes et marquer des points.

Capture d'écran du Tetris en Pygame (ouvrir l’image en grand dans un nouvel onglet)
Interface du jeu
Lignes complétéesPoints
Ligne unique40
Double ligne100
Triple ligne300
Quadruple ligne (Tetris)1200

Récupération des données

Pour jouer, l'IA doit connaître la grille et le bloc en cours. J'ai modifié le jeu pour qu'il écrive son état dans un fichier JSON : bloc en cours, bloc suivant, grille, score, etc. Le programme de l'IA lit ensuite ces données pour les traiter.

Voir un exemple du fichier JSON
{
  "current_block": {
    "shape": [
      [[0, 1, 0], [1, 1, 1]],
      [[1, 0], [1, 1], [1, 0]],
      [[1, 1, 1], [0, 1, 0]],
      [[0, 1], [1, 1], [0, 1]]
    ],
    "color": [255, 0, 0],
    "rotation": 0,
    "positionX": 4,
    "positionY": 3
  },
  "next_block": {
    "shape": [[[1], [1], [1], [1]], [[1, 1, 1, 1]]],
    "color": [0, 128, 0],
    "rotation": 0,
    "positionX": 4,
    "positionY": -2
  },
  "grid": [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    "… 16 lignes vides …",
    [0, 0, 0, 0, 0, 0, 0, 0, 0, [255, 255, 0]],
    [0, 0, 0, 0, 0, [128, 0, 128], [128, 0, 128], 0, 0, [255, 255, 0]],
    [0, [0, 0, 255], 0, 0, [0, 255, 255], [128, 0, 128], [128, 0, 128], [128, 0, 128], [128, 0, 128], [255, 255, 0]]
  ],
  "score": 80,
  "level_speed": 0,
  "liste_vitesses": [1, 0.8, 0.7, 0.6, 0.5],
  "nb_block": 9,
  "activeIa": false
}

Trouver où placer le bloc

Pour choisir où placer le bloc, chaque position reçoit un score : la position avec le plus petit score est choisie. Pour chaque rotation possible, le programme place le bloc dans la grille, vérifie que l'emplacement est valide (posé au sol ou sur un bloc) puis calcule son score selon quatre critères :

  1. un malus de 80 points par trou créé ;
  2. la différence de hauteur de chaque colonne, ajoutée au score ;
  3. pour garder un jeu plat et équilibré, la différence de hauteur entre colonnes voisines, multipliée par 5 points ;
  4. un bonus qui retire des points si une ligne est supprimée.

L'IA fait ce calcul avec le bloc en cours et le bloc suivant : elle choisit la meilleure position avec un coup d'avance.

Le résultat

Une fois la destination connue, on pourrait croire qu'il suffit d'utiliser pyautogui pour appuyer sur les touches. Mais encore faut-il connaître le chemin ! Après beaucoup d'essais, voici le résultat :

Axes d'amélioration

Développé en quelques jours, ce petit projet m'a beaucoup plu (j'adore regarder les pièces se placer toutes seules). Mais plusieurs choses pourraient être améliorées :

  • optimiser la recherche de la position finale de la pièce ;
  • optimiser la recherche de chemin ;
  • revoir la façon de se déplacer ;
  • affiner les malus et bonus pour un équilibrage parfait.