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

Replace AlgoRechercheMinMax.java

parent e5e5c31f
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; 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 = {{"","",""},{"","",""},{"","",""}};
int[] scores = {1,-1,0}; /* 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.
*/
public void meilleur_coup_minmax(){
double inf = Double.POSITIVE_INFINITY; Joueur humain;
double bestScore = -1 * inf; Joueur ordi;
int[] meilleur_coup = new int[2] ; public AlgoRechercheMinMax(Joueur _ordi1, Joueur _joueur1){
ordi = _ordi1;
for (int i = 0; i < 3; i++){ humain = _joueur1;
for (int j = 0; j < 3; j++){
if (grille[i][j] == "" ) { }
grille[i][j] = "X";}
int score = minimax(grille,0,false); double[] scores = {-1,1,0}; // Score -1 si partie perdue, 1 si partie gagnée et 0 si égalité.
grille[i][j] = "" ;
if (score > bestScore){ @Override
bestScore = score; public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean ponder){
meilleur_coup[0] = i; /* 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.
meilleur_coup[1] = j; */
}
double inf = Double.POSITIVE_INFINITY;
} double bestScore = -1 * inf;
} CoupTicTacToe meilleur_coup = null ;
grille[meilleur_coup[0]][meilleur_coup[1]] = "X"; double alpha = -1 * inf; // méthode alpha beta
// changer le tour du joueur ? double beta = inf;
} ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
public double minimax(String[][] grille,int profondeur,boolean isMaximizing){ for (int i = 0; i < coups.size(); i++){
Joueur gagnant = grille.vainqueur(); //Il faudrait connaitre le vainqueur _plateau.sauvegardePosition(0); // Pour pouvoir revenir à cet état une fois les simulations finies et les scores calculés.
int resultat = gagnant.getIdJoueur(); _plateau.joueCoup(coups.get(i));
if (resultat !== null) { double score = minimax(_plateau,humain,1,false,alpha,beta); //False car l'ordi a déjà placé son premier coup
return scores[resultat]; 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.
if (isMaximizing) { bestScore = score;
double inf = Double.POSITIVE_INFINITY; meilleur_coup = (CoupTicTacToe)coup_provisoire;
double bestScore = -1 * inf; }
}
for (int i = 0; i < 3; i++){ return meilleur_coup;
for (int j = 0; j < 3; j++){ // changer le tour du joueur
if (grille[i][j] == "" ) { }
grille[i][j] = "X";
double score = minimax(grille,profondeur + 1,false); public double minimax(Plateau _plateau,Joueur _joueur,int profondeur,boolean isMaximizing, double alpha, double beta){
grille[i][j] = "" ; /* 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
bestScore = max(score,bestScore); alpha et beta pour implémenter la méthode alpha beta.
} */
}
} if (_plateau.partieTerminee()){
return bestScore; if(_plateau.partieNulle()){
} return 0;
else { }
double inf = Double.POSITIVE_INFINITY; else{
double bestScore = inf; Joueur gagnant = _plateau.vainqueur(); //Il faut connaitre le vainqueur
for (int i = 0; i < 3; i++){ int resultat = gagnant.getIdJoueur();
for (int j = 0; j < 3; j++){ return scores[resultat];}
if (grille[i][j] == "" ) {
grille[i][j] = "O";
double score = minimax(grille,profondeur + 1,true); }
grille[i][j] = "" ; if (isMaximizing) { //ordi qui joue
bestScore = min(score,bestScore); double inf = Double.POSITIVE_INFINITY;
} double bestScore = -1 * inf;
} ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
} for (int i = 0; i < coups.size(); i++){ // On suit le même principe que précédemment.
return bestScore; _plateau.sauvegardePosition(profondeur);
} _plateau.joueCoup(coups.get(i));
} double score = minimax(_plateau,humain,profondeur + 1,false, alpha, beta);
_plateau.restaurePosition(profondeur);
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;
}
else { // Humain ou autre ordi qui joue
double inf = Double.POSITIVE_INFINITY;
double bestScore = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(humain);
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));
double score = minimax(_plateau,ordi,profondeur + 1,true,alpha,beta);
_plateau.restaurePosition(profondeur);
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