exactly follow the course..?
This commit is contained in:
parent
32007bd44b
commit
8ed2c694fe
2 changed files with 31 additions and 56 deletions
|
@ -11,10 +11,10 @@ typedef struct jeu Jeu;
|
||||||
void action_joueur_minimax(Jeu *jeu, int couleur);
|
void action_joueur_minimax(Jeu *jeu, int couleur);
|
||||||
|
|
||||||
/* Implémentation de Minimax */
|
/* Implémentation de Minimax */
|
||||||
int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu,
|
int minimax(int profondeur, Element *position, int joueur, int couleur,
|
||||||
Coups *positions, int joueur_gagnant);
|
Jeu *jeu);
|
||||||
|
|
||||||
/* Calcule la valeur heuristique pour un coup */
|
/* Calcule la valeur heuristique pour un coup */
|
||||||
int heuristique(Jeu *jeu, Jeton coup_choisi, int couleur);
|
int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
#include "../includes/minimax.h"
|
#include "../includes/minimax.h"
|
||||||
|
|
||||||
void action_joueur_minimax(Jeu *jeu, int couleur) {
|
void action_joueur_minimax(Jeu *jeu, int couleur) {
|
||||||
Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
|
Jeu *jeu_copie = copie_jeu(jeu);
|
||||||
|
Coups *possibilites = action_possible_joueur(jeu_copie->plateau, couleur);
|
||||||
|
|
||||||
int rep_minimax = minimax(3, *possibilites->coups->premier->jeton, couleur,
|
int rep_minimax =
|
||||||
jeu, possibilites, couleur);
|
minimax(3, possibilites->coups->premier, INT_MAX, couleur, jeu_copie);
|
||||||
|
|
||||||
printf("rep_minimax: %d\n", rep_minimax);
|
printf("Réponse de minimax: %d\n", rep_minimax);
|
||||||
|
|
||||||
free_coups(possibilites);
|
free_coups(possibilites);
|
||||||
|
free_jeu(jeu_copie);
|
||||||
|
|
||||||
// Crash temporaire
|
// Crash temporaire
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -18,65 +20,38 @@ void action_joueur_minimax(Jeu *jeu, int couleur) {
|
||||||
jeu_joueur(jeu, ligne, colonne, couleur);
|
jeu_joueur(jeu, ligne, colonne, couleur);
|
||||||
}
|
}
|
||||||
|
|
||||||
int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu,
|
int minimax(int profondeur, Element *position, int joueur, int couleur,
|
||||||
Coups *positions, int joueur_gagnant) {
|
Jeu *jeu) {
|
||||||
if (profondeur == 0) {
|
if (!position->suivant || profondeur == 0) {
|
||||||
return heuristique(jeu, coup_choisi, joueur);
|
// Position terminale ou profondeur maximale
|
||||||
|
return heuristique(*position->jeton, joueur, jeu);
|
||||||
}
|
}
|
||||||
|
|
||||||
int value;
|
for (Element *pi = position; pi; pi = pi->suivant) {
|
||||||
if (joueur_gagnant == joueur) {
|
if (joueur == INT_MAX) {
|
||||||
// Si c'est nous, le joueur qui doit gagner (J1)
|
return max(INT_MIN, minimax(profondeur - 1, pi, INT_MIN,
|
||||||
value = INT_MIN;
|
couleur_ennemi(couleur), jeu));
|
||||||
|
} else {
|
||||||
Element *coup_possible = positions->coups->premier;
|
return min(INT_MAX,
|
||||||
while (coup_possible) {
|
minimax(profondeur - 1, pi, INT_MAX, couleur, jeu));
|
||||||
Jeu *jeu_copie = copie_jeu(jeu);
|
|
||||||
Coups *possibilites =
|
|
||||||
action_possible_joueur(jeu_copie->plateau, joueur);
|
|
||||||
|
|
||||||
value = max(value,
|
|
||||||
minimax(profondeur - 1, *coup_possible->jeton, joueur,
|
|
||||||
jeu_copie, possibilites, joueur_gagnant));
|
|
||||||
|
|
||||||
free_coups(possibilites);
|
|
||||||
free_jeu(jeu_copie);
|
|
||||||
|
|
||||||
coup_possible = coup_possible->suivant;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Si c'est l'ennemi, le joueur qui doit perdre (J2)
|
|
||||||
value = INT_MAX;
|
|
||||||
int ennemi = couleur_ennemi(joueur);
|
|
||||||
|
|
||||||
Element *coup_possible = positions->coups->premier;
|
|
||||||
while (coup_possible) {
|
|
||||||
Jeu *jeu_copie = copie_jeu(jeu);
|
|
||||||
Coups *possibilites =
|
|
||||||
action_possible_joueur(jeu_copie->plateau, ennemi);
|
|
||||||
|
|
||||||
value = min(value,
|
|
||||||
minimax(profondeur - 1, *coup_possible->jeton, ennemi,
|
|
||||||
jeu_copie, possibilites, joueur_gagnant));
|
|
||||||
|
|
||||||
free_coups(possibilites);
|
|
||||||
free_jeu(jeu_copie);
|
|
||||||
|
|
||||||
coup_possible = coup_possible->suivant;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
fprintf(stderr, "Erreur innatendu lors de Minimax.");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int heuristique(Jeu *jeu, Jeton coup_choisi, int couleur) {
|
int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu) {
|
||||||
if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) {
|
if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) {
|
||||||
return 0;
|
if (jeu->j1->couleur == couleur) {
|
||||||
|
return jeu->j1->nb_jeton;
|
||||||
|
}
|
||||||
|
return jeu->j2->nb_jeton;
|
||||||
}
|
}
|
||||||
|
fprintf(stderr, "Coup illégal des %ss en ",
|
||||||
fprintf(stderr, "Minimax veut jouer un coup illégal (");
|
jeu->j1->couleur == couleur ? jeu->j1->nom : jeu->j2->nom);
|
||||||
affiche_jeton(stderr, &coup_choisi);
|
affiche_jeton(stderr, &coup_choisi);
|
||||||
fprintf(stderr, ").\n");
|
fprintf(stderr, ".\n");
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue