L3 MIASHS, Algorithme et Programmation 3, année 2023

Puissance 4

Le but du jeu est d’aligner une suite de 4 pions de même couleur sur une grille comptant 6 rangées et 7 colonnes. Chaque joueur dispose de 21 pions d’une couleur (par convention, en général jaune ou rouge). Tour à tour, les deux joueurs placent un pion dans la colonne de leur choix, le pion coulisse alors jusqu’à la position la plus basse possible dans ladite colonne à la suite de quoi c’est à l’adversaire de jouer. Le vainqueur est le joueur qui réalise le premier un alignement (horizontal, vertical ou diagonal) consécutif d’au moins quatre pions de sa couleur. Si, alors que toutes les cases de la grille de jeu sont remplies, aucun des deux joueurs n’a réalisé un tel alignement, la partie est déclarée nulle.

(source wikipedia

Nous allons créer une modelisation de ce jeu. Pour ce faire, on va stocker les données dans une tuple de tuple de booléen ou de None.

  1. Créez une classe Grille qui possède les champs et méthodes suivantes:

Je vous donne la classe Joueur.

import random

class Joueur:
    def __init__(self, grille: Grille, couleur:bool):
        self.grille = grille
        self.couleur = couleur

    def play(self):
        next_grille = None 
        while next_grille is None:
            next_grille = self.grille.ajout_jeton(random.randint(0, 7), self.couleur)
        return next_grille
  1. Écrire un script qui simule une partie en affichant la grille après chaque coup de chaque joueur.

  2. Créer une class JoueurHumain qui étend Joueur et surcharge play pour permettre un choix humain.

Vous pouvez utiliser la fonction input pour demander un input à l’utilisateur en ligne de commande.

  1. Faire une fonction main qui lance une partie entre un joueur humain et un joueur artificiel qui joue au hasard.

Une inteligence imbatable

On va améliorer le joueur artificiel qui n’est pas très drôle. On va pour cela devoir explorer l’espace des configurations. Une configuration est l’état de la grille à un moment donnée de la partie. Elle contient donc les informations suivantes:

  1. Modéliser une configuration par une classe Configuration qui étend grille en ajoutant l’information manquante. Elle doit par ailleurs implémenter:
  1. Implementer un JoueurNiveauUn qui étend Joueur qui va regarder s’il existe une configuration gagnante et la selectionne.

  2. Implementer un JoueurNiveauDeux qui va regarder s’il existe une configuation qui lui permette de gagner à coup sur au coup suivant.

  3. On définit une configuration éventuellement gagnante par recurrence comme suit:

  1. Implémenter un JoueurAbsolu qui va systématiquement choisir une configuration éventuellement gagnante si elle existe et sinon jouer au hasard.

  2. Montrer que JoueurAbsolu gagne a coup sur s’il commence.


Compiled the: mar. 19 mars 2024 16:13:23 CET