12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- """
- MinMax consiste à calculer H coup d'avance, en considérant que l'adversaire joue au mieux.
- """
- from random import randint
- from Outils.Elagage import *
- class Arbre() : # Quentin 18/10/2016
- """
- Sert à construire l'arbre du minMax.
- Attributs :
- .plateau
- .hauteur : hauteur de l'arbre (Les feuilles ont une hauteur de 0)
- .num : joueur dont c'est le tour à cette position
- """
- def __init__(self, evaluer_position, plateau, num_racine, h, H) :
- """
- Sert à fabriquer l'arbre récursivement.
- evaluer_position : fonction d'évaluation
- plateau : clair
- num_racine : numéro du joueur dont c'est le tour dans la partie associée à la racine
- num_pere : numéro du père de l'arbre ici construit. Vaut None si l'arbre est la racine.
- h : accumulateur comptant le nombre d'appels récursifs
- H : hauteur désirée
- """
- self.hauteur = H - h
- self.num = plateau.tour
- # self.fils est la liste des fils correspondant aux nouveau plateaux obtenus après application des coups disponibles
- # C'est une liste de couples (Coup, Nombre, Arbre)
- self.fils = []
- # Liste des valeurs des fils :
- liste_valeurs = []
- if h < H and plateau.gagnant() == -1 : #Si l'arbre ne correspond pas à une situation gagnante, il a des fils
- liste_coups = plateau.liste_coups_possibles()
- for coup in liste_coups :
- if elagage(plateau, coup) :
- plateau_fils = plateau.copie()
- plateau_fils.executer_coup(coup)
-
- # Chaque fils est associé au coup qui lui donne naissance et à la valeur de la position obtenue
- arbre = Arbre(evaluer_position, plateau_fils, num_racine, h+1, H)
- self.fils.append((coup, arbre))
- liste_valeurs.append(arbre.valeur)
- # Calcul de la valeur :
- if liste_valeurs == [] :
- self.valeur = evaluer_position(plateau, num_racine)
- elif self.num == num_racine :
- self.valeur = max(liste_valeurs)
- else :
- self.valeur = min(liste_valeurs)
-
- def est_feuille(self) :
- """ Retourne True si le noeud est une feuille """
- return self.fils == []
- def liste_feuilles(self) :
- """ Retourne la liste des feuilles de l'arbre """
- if self.est_feuille() :
- return [self]
- else : # Si l'arbre n'est pas une feuille, on appelle récursivement la fonction sur ses fils et on concatène les listes de feuilles obtenues
- l = []
- for f in self.fils :
- l += f.liste_feuilles
- return l
|