Arbre.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """
  2. MinMax consiste à calculer H coup d'avance, en considérant que l'adversaire joue au mieux.
  3. """
  4. from random import randint
  5. from Outils.Elagage import *
  6. class Arbre() : # Quentin 18/10/2016
  7. """
  8. Sert à construire l'arbre du minMax.
  9. Attributs :
  10. .plateau
  11. .hauteur : hauteur de l'arbre (Les feuilles ont une hauteur de 0)
  12. .num : joueur dont c'est le tour à cette position
  13. """
  14. def __init__(self, evaluer_position, plateau, num_racine, h, H) :
  15. """
  16. Sert à fabriquer l'arbre récursivement.
  17. evaluer_position : fonction d'évaluation
  18. plateau : clair
  19. num_racine : numéro du joueur dont c'est le tour dans la partie associée à la racine
  20. num_pere : numéro du père de l'arbre ici construit. Vaut None si l'arbre est la racine.
  21. h : accumulateur comptant le nombre d'appels récursifs
  22. H : hauteur désirée
  23. """
  24. self.hauteur = H - h
  25. self.num = plateau.tour
  26. # self.fils est la liste des fils correspondant aux nouveau plateaux obtenus après application des coups disponibles
  27. # C'est une liste de couples (Coup, Nombre, Arbre)
  28. self.fils = []
  29. # Liste des valeurs des fils :
  30. liste_valeurs = []
  31. if h < H and plateau.gagnant() == -1 : #Si l'arbre ne correspond pas à une situation gagnante, il a des fils
  32. liste_coups = plateau.liste_coups_possibles()
  33. for coup in liste_coups :
  34. if elagage(plateau, coup) :
  35. plateau_fils = plateau.copie()
  36. plateau_fils.executer_coup(coup)
  37. # Chaque fils est associé au coup qui lui donne naissance et à la valeur de la position obtenue
  38. arbre = Arbre(evaluer_position, plateau_fils, num_racine, h+1, H)
  39. self.fils.append((coup, arbre))
  40. liste_valeurs.append(arbre.valeur)
  41. # Calcul de la valeur :
  42. if liste_valeurs == [] :
  43. self.valeur = evaluer_position(plateau, num_racine)
  44. elif self.num == num_racine :
  45. self.valeur = max(liste_valeurs)
  46. else :
  47. self.valeur = min(liste_valeurs)
  48. def est_feuille(self) :
  49. """ Retourne True si le noeud est une feuille """
  50. return self.fils == []
  51. def liste_feuilles(self) :
  52. """ Retourne la liste des feuilles de l'arbre """
  53. if self.est_feuille() :
  54. return [self]
  55. 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
  56. l = []
  57. for f in self.fils :
  58. l += f.liste_feuilles
  59. return l