Commit 729fb594 authored by TRAN Alain's avatar TRAN Alain

Replace AlgoRechercheMinMax.java

parent 6c3a9c76
......@@ -15,6 +15,10 @@ import java.util.ArrayList;
*/
public class AlgoRechercheMinMax extends AlgoRecherche {
/* Le but de cet algorithme est d'implémenter la méthode MinMax au jeu TicTacToe. La fonction d'évaluation est ici assez simple elle retourne 1 sur le noeud si
l'ordi gagne la partie et -1 si l'ordi perd la partie. Cet algorithme est implémenté avec l'amélioration alpha beta.
*/
Joueur humain;
Joueur ordi;
public AlgoRechercheMinMax(Joueur _ordi1, Joueur _joueur1){
......@@ -23,28 +27,27 @@ public class AlgoRechercheMinMax extends AlgoRecherche {
}
String[][] grille = {{"","",""},{"","",""},{"","",""}};
double[] scores = {-1,1,0};
double[] scores = {-1,1,0}; // Score -1 si partie perdue, 1 si partie gagnée et 0 si égalité.
@Override
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean ponder){
/* MeilleurCoup prend en paramètre un plateau, un joueur (non utilisé ici mais qui serait l'ordi) et un boolean ponder pour laisser l'ordi réfléchir.
*/
double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf;
CoupTicTacToe meilleur_coup = null ;
double alpha = -1 * inf; // méthode alpha beta
double beta = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(0);
_plateau.sauvegardePosition(0); // Pour pouvoir revenir à cet état une fois les simulations finies et les scores calculés.
_plateau.joueCoup(coups.get(i));
//System.out.println(_plateau);
//System.out.println("coup initial");
double score = minimax(_plateau,humain,1,false); //False car l'ordi a déjà placé son premier coup
double score = minimax(_plateau,humain,1,false,alpha,beta); //False car l'ordi a déjà placé son premier coup
Coup coup_provisoire = coups.get(i);
// _plateau.annuleDernierCoup();
_plateau.restaurePosition(0);
//System.out.println("annule coup initial");
//System.out.println(_plateau);
if (score > bestScore){
_plateau.restaurePosition(0); // Retour à la configuration initiale après calcul des scores.
if (score > bestScore){ // On modifie le bestScore si on en trouve un meilleur.
bestScore = score;
meilleur_coup = (CoupTicTacToe)coup_provisoire;
}
......@@ -53,35 +56,36 @@ public class AlgoRechercheMinMax extends AlgoRecherche {
// changer le tour du joueur
}
public double minimax(Plateau _plateau,Joueur _joueur,int profondeur,boolean isMaximizing){
public double minimax(Plateau _plateau,Joueur _joueur,int profondeur,boolean isMaximizing, double alpha, double beta){
/* minimax prend en paramètre un plateau, le joueur qui va jouer, la profondeur, un boolean pour savoir si on doit maximiser ou minimiser et des doubles
alpha et beta pour implémenter la méthode alpha beta.
*/
if (_plateau.partieTerminee()){
if(_plateau.partieNulle()){
return 0;
}
else{
Joueur gagnant = _plateau.vainqueur(); //Il faudrait connaitre le vainqueur
Joueur gagnant = _plateau.vainqueur(); //Il faut connaitre le vainqueur
int resultat = gagnant.getIdJoueur();
return scores[resultat];
}
return scores[resultat];}
}
if (isMaximizing) { //ordi qui joue
double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
for (int i = 0; i < coups.size(); i++){
for (int i = 0; i < coups.size(); i++){ // On suit le même principe que précédemment.
_plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i));
//System.out.println(_plateau);
//System.out.println("coup ordi");
double score = minimax(_plateau,humain,profondeur + 1,false);
//System.out.println("dernier coup " + _plateau.getDernierCoup());
//_plateau.annuleDernierCoup();
double score = minimax(_plateau,humain,profondeur + 1,false, alpha, beta);
_plateau.restaurePosition(profondeur);
//System.out.println(_plateau);
//System.out.println("coup ordi annulé");
//System.out.println("dernier coup " + _plateau.getDernierCoup());
bestScore = max(score,bestScore);
alpha = max(alpha,score); // Méthode alpha beta
if (beta <= alpha){
break; // Ne vérifié pas les cas où on sait que les branches suivantes auront une évaluation inférieure à une déjà possible.
}
}
return bestScore;
}
......@@ -89,19 +93,16 @@ public class AlgoRechercheMinMax extends AlgoRecherche {
double inf = Double.POSITIVE_INFINITY;
double bestScore = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(humain);
for (int i = 0; i < coups.size(); i++){
for (int i = 0; i < coups.size(); i++){ // On suit le même principe que précédemment.
_plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i));
//System.out.println(_plateau);
//System.out.println("coup humain");
double score = minimax(_plateau,ordi,profondeur + 1,true);
//System.out.println("dernier coup " + _plateau.getDernierCoup());
//_plateau.annuleDernierCoup();
double score = minimax(_plateau,ordi,profondeur + 1,true,alpha,beta);
_plateau.restaurePosition(profondeur);
//System.out.println(_plateau);
//System.out.println("coup humain annulé");
//System.out.println("dernier coup " + _plateau.getDernierCoup());
bestScore = min(score,bestScore);
beta = min(beta,score);
if (beta <= alpha){
break; // Ne vérifié pas les cas où on sait que les branches suivantes auront une évaluation supérieure à une déjà possible.
}
}
return bestScore;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment