from heuristiquesOthello import * ################## le nécessaire au décompte des positions calculées ################# nb_situations_examinees = 0 def compter_situations(init): global nb_situations_examinees if init: nb_situations_examinees = 1 else: nb_situations_examinees += 1 ################## Petite fonction utilitaire ################# def tour_joueur_courant(prof_courante): return prof_courante % 2 == 1 ############################ algorithme min-max ########################### def min_max(othello, joueur, prof_courante, prof_max, heuristique): compter_situations(prof_courante == 1) if prof_courante > prof_max: retour = ([], heuristique(othello, joueur)) else: possibilites = othello.liste_coups() if len(possibilites) == 0: #Si aucun coup n'est jouable, on change de joueur et on continue retour = evaluer_passer_son_tour(othello, joueur, prof_courante, prof_max, heuristique) else: #On s'intéresse maintenant aux cas où au moins 1 coup est jouable situations_possibles = map(lambda coup: (coup, othello.tenter_coup(coup)), possibilites) coups_evalues = [] if tour_joueur_courant(prof_courante): retour = retenir_meilleur_coup(situations_possibles, joueur, prof_courante, prof_max, heuristique) else: retour = retenir_pire_coup(situations_possibles, joueur, prof_courante, prof_max, heuristique) if prof_courante == 1: print("nombre de situations examinées :",nb_situations_examinees) return retour def evaluer_passer_son_tour(othello, joueur, prof_courante, prof_max, heuristique): situation = Othello(othello) situation.changer_joueur() enchainement, recompense = min_max(situation, joueur, prof_courante+1, prof_max, heuristique) retour = (([None] + enchainement), recompense) return retour def retenir_meilleur_coup(situations_possibles, joueur, prof_courante, prof_max, heuristique): meilleure_recompense = None enchainement_retenu = None for (coup, situation) in situations_possibles: liste_coups, recompense = min_max(situation, joueur, prof_courante+1, prof_max, heuristique) if meilleure_recompense is None or recompense > meilleure_recompense: meilleure_recompense = recompense enchainement_retenu = [coup] + liste_coups retour = enchainement_retenu, meilleure_recompense return retour def retenir_pire_coup(situations_possibles, joueur, prof_courante, prof_max, heuristique): pire_recompense = None enchainement_retenu = None for (coup, situation) in situations_possibles: liste_coups, recompense = min_max(situation, joueur, prof_courante+1, prof_max, heuristique) if pire_recompense is None or recompense < pire_recompense: pire_recompense = recompense enchainement_retenu = [coup] + liste_coups retour = enchainement_retenu, pire_recompense return retour