IA_Stats.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from Outils.Moteur_de_jeu import Joueur
  2. from Outils.Moteur_de_jeu.Joueur import *
  3. from Outils.Moteur_de_jeu import Conversion
  4. from Outils.Moteur_de_jeu.Conversion import *
  5. from Outils.Symetries import *
  6. from random import choice
  7. class IA_stats(Joueur) :
  8. def __init__(self, nom, nom_fichier, adjoint) :
  9. """
  10. nom_fichier est le nom du fichier de statistiques que l'I.A. utilise
  11. adjoint est l'I.A. utilisée en cas d'absence d'occurence de la situation
  12. """
  13. Joueur.__init__(self,"O",nom)
  14. self.adjoint = adjoint
  15. self.tab_reussites = [] # Tableau dont la case n vaut True si l'I.A. a trouvé une occurence au n^e coup et 0 sinon. Utile pour l'analyse des résultats
  16. fichier = open(nom_fichier, "r")
  17. self.stats = fichier.readlines()
  18. fichier.close()
  19. self.tab_p = [l[:l.find(" ")] for l in self.stats]
  20. def coups_pour_situation(self, plateau) :
  21. """ Retourne la liste des coups proposés pour cette situation """
  22. code_p = code_from_plateau(plateau)
  23. (trouve, id_p) = recherche(self.tab_p, code_p)
  24. if trouve :
  25. ligne = self.stats[id_p]
  26. tab_c = ligne[ligne.find(" ") + 1:].split(",")
  27. lcp = [] # Liste de coups pondérés (couples (coup, nb))
  28. for l in tab_c :
  29. i = l.find(":")
  30. lcp.append( (coup_from_code(l[:i]) , int(l[i+1:])) )
  31. return lcp
  32. else :
  33. return []
  34. def calculer_coup(self, plateau, liste_coups) :
  35. lcp = self.coups_pour_situation(plateau)
  36. # Symétries verticales :
  37. lcp_v = self.coups_pour_situation(plateau_symetrie_verticale(plateau))
  38. for c in lcp_v :
  39. (coup,nb) = c
  40. lcp.append((coup_symetrie_verticale(plateau, coup),nb))
  41. # Symétries horizontales :
  42. lcp_h = self.coups_pour_situation(plateau_symetrie_horizontale(plateau))
  43. for c in lcp_h :
  44. (coup,nb) = c
  45. lcp.append((coup_symetrie_horizontale(plateau, coup),nb))
  46. # Composées des deux :
  47. lcp_hv = self.coups_pour_situation(plateau_symetrie_verticale(plateau_symetrie_horizontale(plateau)))
  48. for c in lcp_hv :
  49. (coup,nb) = c
  50. lcp.append((coup_symetrie_horizontale(plateau, coup_symetrie_verticale(plateau, coup)),nb))
  51. # Analyse :
  52. if lcp == [] :
  53. #print("Pas d'occurence")
  54. self.adjoint.num = self.num
  55. self.tab_reussites.append(0)
  56. return self.adjoint.calculer_coup(plateau, liste_coups)
  57. else :
  58. # Recherche du nombre d'occurences maximal :
  59. n_max = 0
  60. for c in lcp :
  61. if c[1] > n_max :
  62. n_max = c[1]
  63. liste_meilleurs_coups = [c[0] for c in lcp if c[1] == n_max]
  64. coup = choice(liste_meilleurs_coups)
  65. self.tab_reussites.append(1)
  66. n = len(liste_coups)
  67. for i in range(n) :
  68. if liste_coups[i] == coup :
  69. return i
  70. return 0
  71. # Pour les tests :
  72. """sym = plateau_symetrie_horizontale(plateau)
  73. affichage = Affichage(sym,False)
  74. partie = Partie(Humain(""),Humain(""),True,"")
  75. partie.plateau = sym
  76. affichage.afficher_canevas(partie)"""