FINALLY !!!!!!
This commit is contained in:
parent
18d633b382
commit
e81c8cbe28
2 changed files with 65 additions and 46 deletions
|
@ -7,14 +7,14 @@
|
||||||
|
|
||||||
typedef struct jeu Jeu;
|
typedef struct jeu Jeu;
|
||||||
|
|
||||||
/* Joue le tour d'après l'algorithme Minimax */
|
/* Joue le tour d'après l'algorithme minimax */
|
||||||
void action_joueur_minimax(Jeu *jeu, int couleur);
|
void action_joueur_minimax(Jeu *jeu, int couleur);
|
||||||
|
|
||||||
/* Implémentation de Minimax */
|
/* Décide d'une case à jouer via l'algorithme minimax */
|
||||||
int minimax(int profondeur, Element *position, int joueur, int couleur,
|
void _action_joueur_minimax(Jeu *jeu, int profondeur, int couleur, int gagnant,
|
||||||
Jeu *jeu);
|
int *ligne, int *colonne, int *score);
|
||||||
|
|
||||||
/* Calcule la valeur heuristique pour un coup */
|
/* Calcule la valeur heuristique pour un coup */
|
||||||
int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu);
|
int heuristique(Jeu *jeu, int couleur);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
101
src/minimax.c
101
src/minimax.c
|
@ -1,57 +1,76 @@
|
||||||
#include "../includes/minimax.h"
|
#include "../includes/minimax.h"
|
||||||
|
|
||||||
void action_joueur_minimax(Jeu *jeu, int couleur) {
|
void action_joueur_minimax(Jeu *jeu, int couleur) {
|
||||||
Jeu *jeu_copie = copie_jeu(jeu);
|
int ligne, colonne, score = INT_MAX;
|
||||||
Coups *possibilites = action_possible_joueur(jeu_copie->plateau, couleur);
|
_action_joueur_minimax(jeu, 3, couleur, couleur, &ligne, &colonne, &score);
|
||||||
|
|
||||||
int rep_minimax =
|
|
||||||
minimax(3, possibilites->coups->premier, INT_MAX, couleur, jeu_copie);
|
|
||||||
|
|
||||||
printf("Réponse de minimax: %d\n", rep_minimax);
|
|
||||||
|
|
||||||
free_coups(possibilites);
|
|
||||||
free_jeu(jeu_copie);
|
|
||||||
|
|
||||||
// Crash temporaire
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
int ligne = -1, colonne = -1;
|
|
||||||
|
|
||||||
jeu_joueur(jeu, ligne, colonne, couleur);
|
jeu_joueur(jeu, ligne, colonne, couleur);
|
||||||
}
|
}
|
||||||
|
|
||||||
int minimax(int profondeur, Element *position, int joueur, int couleur,
|
void _action_joueur_minimax(Jeu *jeu, int profondeur, int couleur, int gagnant,
|
||||||
Jeu *jeu) {
|
int *ligne, int *colonne, int *score) {
|
||||||
if (!position->suivant || profondeur == 0) {
|
|
||||||
// Position terminale ou profondeur maximale
|
int score_rec, i_rec, j_rec;
|
||||||
return heuristique(*position->jeton, joueur, jeu);
|
Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
|
||||||
|
|
||||||
|
// Pas de coups possibles
|
||||||
|
if (!possibilites->taille_liste) {
|
||||||
|
free(possibilites);
|
||||||
|
couleur = couleur_ennemi(couleur);
|
||||||
|
possibilites = action_possible_joueur(jeu->plateau, couleur);
|
||||||
|
|
||||||
|
if (!possibilites->taille_liste) {
|
||||||
|
*score = heuristique(jeu, gagnant);
|
||||||
|
free(possibilites);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Element *pi = position; pi; pi = pi->suivant) {
|
if (couleur == gagnant) {
|
||||||
if (joueur == INT_MAX) {
|
*score = INT_MIN;
|
||||||
return max(INT_MIN, minimax(profondeur - 1, pi, INT_MIN,
|
} else {
|
||||||
couleur_ennemi(couleur), jeu));
|
*score = INT_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
profondeur--;
|
||||||
|
for (Element *i = possibilites->coups->premier; i; i = i->suivant) {
|
||||||
|
Jeu *jeu_copie = copie_jeu(jeu);
|
||||||
|
if (!jeu_joueur(jeu_copie, i->jeton->pos_i, i->jeton->pos_j, couleur)) {
|
||||||
|
fprintf(stderr, "Coup illégal.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (profondeur) {
|
||||||
|
_action_joueur_minimax(jeu_copie, profondeur,
|
||||||
|
couleur_ennemi(couleur), gagnant, &i_rec,
|
||||||
|
&j_rec, &score_rec);
|
||||||
} else {
|
} else {
|
||||||
return min(INT_MAX,
|
score_rec = heuristique(jeu_copie, gagnant);
|
||||||
minimax(profondeur - 1, pi, INT_MAX, couleur, jeu));
|
}
|
||||||
|
if (couleur == gagnant) { // MAX
|
||||||
|
if (score_rec >= *score) {
|
||||||
|
// On change notre coup si il est meilleur
|
||||||
|
*score = score_rec;
|
||||||
|
*ligne = i->jeton->pos_i;
|
||||||
|
*colonne = i->jeton->pos_j;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { // MIN
|
||||||
|
if (score_rec <= *score) {
|
||||||
|
// On change notre coup s'il est + désavantageux pour
|
||||||
|
// l'adversaire
|
||||||
|
*score = score_rec;
|
||||||
|
*ligne = i->jeton->pos_i;
|
||||||
|
*colonne = i->jeton->pos_j;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "Erreur innatendu lors de Minimax.");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu) {
|
int heuristique(Jeu *jeu, int couleur) {
|
||||||
if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) {
|
if (jeu->j1->couleur == couleur) {
|
||||||
if (jeu->j1->couleur == couleur) {
|
// Si on est le joueur 1
|
||||||
return jeu->j1->nb_jeton;
|
return jeu->j1->nb_jeton - jeu->j2->nb_jeton;
|
||||||
}
|
|
||||||
return jeu->j2->nb_jeton;
|
|
||||||
}
|
}
|
||||||
fprintf(stderr, "Coup illégal des %ss en ",
|
return jeu->j2->nb_jeton - jeu->j1->nb_jeton;
|
||||||
jeu->j1->couleur == couleur ? jeu->j1->nom : jeu->j2->nom);
|
|
||||||
affiche_jeton(stderr, &coup_choisi);
|
|
||||||
fprintf(stderr, ".\n");
|
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue