Commit 19308c9d authored by TRAN Alain's avatar TRAN Alain

Replace AlgoRechercheMinMax.java

parent e5e5c31f
...@@ -7,78 +7,107 @@ package tictactoecodingame; ...@@ -7,78 +7,107 @@ package tictactoecodingame;
import static java.lang.Math.max; import static java.lang.Math.max;
import static java.lang.Math.min; import static java.lang.Math.min;
import java.util.ArrayList;
/** /**
* *
* @author Alain * @author Alain
*/ */
public class AlgoRechercheMinMax { public class AlgoRechercheMinMax extends AlgoRecherche {
String[][] grille = {{"","",""},{"","",""},{"","",""}}; /* 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
int[] scores = {1,-1,0}; 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){
ordi = _ordi1;
humain = _joueur1;
}
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.
*/
public void meilleur_coup_minmax(){
double inf = Double.POSITIVE_INFINITY; double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf; double bestScore = -1 * inf;
int[] meilleur_coup = new int[2] ; CoupTicTacToe meilleur_coup = null ;
double alpha = -1 * inf; // méthode alpha beta
for (int i = 0; i < 3; i++){ double beta = inf;
for (int j = 0; j < 3; j++){ ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
if (grille[i][j] == "" ) {
grille[i][j] = "X";}
int score = minimax(grille,0,false);
grille[i][j] = "" ;
if (score > bestScore){
bestScore = score;
meilleur_coup[0] = i;
meilleur_coup[1] = j;
}
for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(0); // Pour pouvoir revenir à cet état une fois les simulations finies et les scores calculés.
_plateau.joueCoup(coups.get(i));
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.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;
} }
} }
grille[meilleur_coup[0]][meilleur_coup[1]] = "X"; return meilleur_coup;
// changer le tour du joueur ? // changer le tour du joueur
} }
public double minimax(String[][] grille,int profondeur,boolean isMaximizing){ public double minimax(Plateau _plateau,Joueur _joueur,int profondeur,boolean isMaximizing, double alpha, double beta){
Joueur gagnant = grille.vainqueur(); //Il faudrait connaitre le vainqueur /* 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
int resultat = gagnant.getIdJoueur(); alpha et beta pour implémenter la méthode alpha beta.
if (resultat !== null) { */
return scores[resultat];
if (_plateau.partieTerminee()){
if(_plateau.partieNulle()){
return 0;
} }
else{
Joueur gagnant = _plateau.vainqueur(); //Il faut connaitre le vainqueur
int resultat = gagnant.getIdJoueur();
return scores[resultat];}
if (isMaximizing) {
}
if (isMaximizing) { //ordi qui joue
double inf = Double.POSITIVE_INFINITY; double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf; double bestScore = -1 * inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
for (int i = 0; i < 3; i++){ for (int i = 0; i < coups.size(); i++){ // On suit le même principe que précédemment.
for (int j = 0; j < 3; j++){ _plateau.sauvegardePosition(profondeur);
if (grille[i][j] == "" ) { _plateau.joueCoup(coups.get(i));
grille[i][j] = "X"; double score = minimax(_plateau,humain,profondeur + 1,false, alpha, beta);
double score = minimax(grille,profondeur + 1,false); _plateau.restaurePosition(profondeur);
grille[i][j] = "" ;
bestScore = max(score,bestScore); 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; return bestScore;
} }
else { else { // Humain ou autre ordi qui joue
double inf = Double.POSITIVE_INFINITY; double inf = Double.POSITIVE_INFINITY;
double bestScore = inf; double bestScore = inf;
for (int i = 0; i < 3; i++){ ArrayList<Coup> coups = _plateau.getListeCoups(humain);
for (int j = 0; j < 3; j++){ for (int i = 0; i < coups.size(); i++){ // On suit le même principe que précédemment.
if (grille[i][j] == "" ) { _plateau.sauvegardePosition(profondeur);
grille[i][j] = "O"; _plateau.joueCoup(coups.get(i));
double score = minimax(grille,profondeur + 1,true); double score = minimax(_plateau,ordi,profondeur + 1,true,alpha,beta);
grille[i][j] = "" ; _plateau.restaurePosition(profondeur);
bestScore = min(score,bestScore); 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; 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