Commit 6c3a9c76 authored by TRAN Alain's avatar TRAN Alain

Replace AlgoRechercheMinMax_9x9.java

parent f23df28e
......@@ -14,6 +14,9 @@ import java.util.ArrayList;
* @author Alain
*/
public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
/* Le but de cet algorithme est d'implémenter la méthode MinMax au jeu TicTacToe9x9. La fonction d'évaluation est ici plus compliqué elle retourne 10 sur le noeud
si l'ordi gagne une case et -10 si l'ordi perd une case. Cet algorithme est implémenté avec l'amélioration alpha beta.
*/
Joueur humain;
Joueur ordi;
......@@ -27,26 +30,24 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
@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 pour laisser l'ordi réfléchir.
*/
double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf;
CoupTicTacToe meilleur_coup = null ;
GrilleTicTacToe9x9 _plateau1 = (GrilleTicTacToe9x9) _plateau;
CoupTicTacToe coup_humain = _plateau1.dernierCoup;
double alpha = -1 * inf; // méthode alpha beta
double beta = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
// GrilleTicTacToe9x9 _plateau1 = (GrilleTicTacToe9x9) _plateau;
for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(0);
_plateau.joueCoup(coups.get(i));
System.out.println("Coups dispo ordi initial " + coups);
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.restaurePosition(0);
System.out.println("annule coup initial");
System.out.println(_plateau);
System.out.println("dernier coup initial " + _plateau.getDernierCoup());
if (score > bestScore){
bestScore = score;
meilleur_coup = (CoupTicTacToe)coup_provisoire;
......@@ -57,26 +58,26 @@ public class AlgoRechercheMinMax_9x9 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()){
// System.out.println("Partie nulle");
return 0;
}
else{
Joueur gagnant = _plateau.vainqueur(); //Il faudrait connaitre le vainqueur
// System.out.println("gagnant " + gagnant);
if (gagnant != null){
int resultat = gagnant.getIdJoueur();
// System.out.println("resultat " + resultat);
return scores[resultat];}
else{
return 0;
}
}
}
if(profondeur>1){
if(profondeur>5){
return evaluation(_plateau);
}
......@@ -85,19 +86,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
// System.out.println("Coups dispo ordi " + coups);
for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i));
// System.out.println(_plateau);
// System.out.println("coup ordi placé " + coups.get(i));
// System.out.println("Gagnant provisoire " + _plateau.vainqueur());
double score = minimax(_plateau,humain,profondeur + 1,false);
// System.out.println("dernier coup ordi " + _plateau.getDernierCoup());
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 ordi " + _plateau.getDernierCoup());
alpha = max(alpha,score);
if (beta <= alpha){
break;
}
bestScore = max(score,bestScore);
}
return bestScore;
......@@ -106,20 +103,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
double inf = Double.POSITIVE_INFINITY;
double bestScore = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(humain);
// System.out.println("Coups dispo humain " + coups);
for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i));
// System.out.println(_plateau);
// System.out.println("coup humain placé " + coups.get(i));
// System.out.println("Gagnant provisoire " + _plateau.vainqueur());
double score = minimax(_plateau,ordi,profondeur + 1,true);
// System.out.println("dernier coup humain " + _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 humain " + _plateau.getDernierCoup());
beta = min(beta,score);
if (beta <= alpha){
break;
}
bestScore = min(score,bestScore);
}
......@@ -127,7 +119,7 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
}
}
public double evaluation(Plateau _plateau1){
public double evaluation(Plateau _plateau1){ // Fonction d'évaluation pour attribuer un score si une case a été remportée ou non.
GrilleTicTacToe9x9 _plateau = (GrilleTicTacToe9x9) _plateau1;
double delta = 0;
for(int i = 0; i < 3; i++){ // abscisse de la case 3x3
......@@ -137,13 +129,13 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
Case case1 = new Case(3*i + k, 3*j + l);
Piece p = _plateau.getPiece(case1);
if (p!= null && p.getJoueur() == humain){
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si on gagne
delta = delta + 10;
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si l'humain gagne
delta = delta - 10;
return delta;}
}
if (p!= null && p.getJoueur() == ordi){
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si on gagne
delta = delta - 10;
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si l'ordi gagne
delta = delta + 10;
return delta;}
}
......
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