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

Replace AlgoRechercheMinMax_9x9.java

parent f23df28e
...@@ -14,6 +14,9 @@ import java.util.ArrayList; ...@@ -14,6 +14,9 @@ import java.util.ArrayList;
* @author Alain * @author Alain
*/ */
public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { 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 humain;
Joueur ordi; Joueur ordi;
...@@ -27,26 +30,24 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -27,26 +30,24 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
@Override @Override
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean ponder){ 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 inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf; double bestScore = -1 * inf;
CoupTicTacToe meilleur_coup = null ; CoupTicTacToe meilleur_coup = null ;
GrilleTicTacToe9x9 _plateau1 = (GrilleTicTacToe9x9) _plateau; GrilleTicTacToe9x9 _plateau1 = (GrilleTicTacToe9x9) _plateau;
CoupTicTacToe coup_humain = _plateau1.dernierCoup; CoupTicTacToe coup_humain = _plateau1.dernierCoup;
double alpha = -1 * inf; // méthode alpha beta
double beta = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi); ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
// GrilleTicTacToe9x9 _plateau1 = (GrilleTicTacToe9x9) _plateau;
for (int i = 0; i < coups.size(); i++){ for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(0); _plateau.sauvegardePosition(0);
_plateau.joueCoup(coups.get(i)); _plateau.joueCoup(coups.get(i));
System.out.println("Coups dispo ordi initial " + coups); double score = minimax(_plateau,humain,1,false,alpha,beta); //False car l'ordi a déjà placé son premier coup
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
Coup coup_provisoire = coups.get(i); Coup coup_provisoire = coups.get(i);
_plateau.restaurePosition(0); _plateau.restaurePosition(0);
System.out.println("annule coup initial");
System.out.println(_plateau);
System.out.println("dernier coup initial " + _plateau.getDernierCoup());
if (score > bestScore){ if (score > bestScore){
bestScore = score; bestScore = score;
meilleur_coup = (CoupTicTacToe)coup_provisoire; meilleur_coup = (CoupTicTacToe)coup_provisoire;
...@@ -57,26 +58,26 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -57,26 +58,26 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
// changer le tour du joueur // 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.partieTerminee()){
if(_plateau.partieNulle()){ if(_plateau.partieNulle()){
// System.out.println("Partie nulle");
return 0; return 0;
} }
else{ else{
Joueur gagnant = _plateau.vainqueur(); //Il faudrait connaitre le vainqueur Joueur gagnant = _plateau.vainqueur(); //Il faudrait connaitre le vainqueur
// System.out.println("gagnant " + gagnant);
if (gagnant != null){ if (gagnant != null){
int resultat = gagnant.getIdJoueur(); int resultat = gagnant.getIdJoueur();
// System.out.println("resultat " + resultat);
return scores[resultat];} return scores[resultat];}
else{ else{
return 0; return 0;
} }
} }
} }
if(profondeur>1){ if(profondeur>5){
return evaluation(_plateau); return evaluation(_plateau);
} }
...@@ -85,19 +86,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -85,19 +86,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
double inf = Double.POSITIVE_INFINITY; double inf = Double.POSITIVE_INFINITY;
double bestScore = -1 * inf; double bestScore = -1 * inf;
ArrayList<Coup> coups = _plateau.getListeCoups(ordi); ArrayList<Coup> coups = _plateau.getListeCoups(ordi);
// System.out.println("Coups dispo ordi " + coups);
for (int i = 0; i < coups.size(); i++){ for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(profondeur); _plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i)); _plateau.joueCoup(coups.get(i));
// System.out.println(_plateau); double score = minimax(_plateau,humain,profondeur + 1,false,alpha,beta);
// 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());
_plateau.restaurePosition(profondeur); _plateau.restaurePosition(profondeur);
// System.out.println(_plateau); alpha = max(alpha,score);
// System.out.println("coup ordi annulé"); if (beta <= alpha){
// System.out.println("dernier coup ordi " + _plateau.getDernierCoup()); break;
}
bestScore = max(score,bestScore); bestScore = max(score,bestScore);
} }
return bestScore; return bestScore;
...@@ -106,20 +103,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -106,20 +103,15 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
double inf = Double.POSITIVE_INFINITY; double inf = Double.POSITIVE_INFINITY;
double bestScore = inf; double bestScore = inf;
ArrayList<Coup> coups = _plateau.getListeCoups(humain); ArrayList<Coup> coups = _plateau.getListeCoups(humain);
// System.out.println("Coups dispo humain " + coups);
for (int i = 0; i < coups.size(); i++){ for (int i = 0; i < coups.size(); i++){
_plateau.sauvegardePosition(profondeur); _plateau.sauvegardePosition(profondeur);
_plateau.joueCoup(coups.get(i)); _plateau.joueCoup(coups.get(i));
// System.out.println(_plateau); double score = minimax(_plateau,ordi,profondeur + 1,true,alpha,beta);
// 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();
_plateau.restaurePosition(profondeur); _plateau.restaurePosition(profondeur);
// System.out.println(_plateau); beta = min(beta,score);
// System.out.println("coup humain annulé"); if (beta <= alpha){
// System.out.println("dernier coup humain " + _plateau.getDernierCoup()); break;
}
bestScore = min(score,bestScore); bestScore = min(score,bestScore);
} }
...@@ -127,7 +119,7 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -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; GrilleTicTacToe9x9 _plateau = (GrilleTicTacToe9x9) _plateau1;
double delta = 0; double delta = 0;
for(int i = 0; i < 3; i++){ // abscisse de la case 3x3 for(int i = 0; i < 3; i++){ // abscisse de la case 3x3
...@@ -137,13 +129,13 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche { ...@@ -137,13 +129,13 @@ public class AlgoRechercheMinMax_9x9 extends AlgoRecherche {
Case case1 = new Case(3*i + k, 3*j + l); Case case1 = new Case(3*i + k, 3*j + l);
Piece p = _plateau.getPiece(case1); Piece p = _plateau.getPiece(case1);
if (p!= null && p.getJoueur() == humain){ if (p!= null && p.getJoueur() == humain){
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si on gagne if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si l'humain gagne
delta = delta + 10; delta = delta - 10;
return delta;} return delta;}
} }
if (p!= null && p.getJoueur() == ordi){ if (p!= null && p.getJoueur() == ordi){
if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si on gagne if (_plateau.caseGagnante(_plateau.grille9x9, 3*i, 3*j, 3*i + k, 3*j + l)){ // Si l'ordi gagne
delta = delta - 10; delta = delta + 10;
return delta;} 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