FINALLY !!!!!!

This commit is contained in:
Mylloon 2022-11-20 15:50:55 +01:00
parent 18d633b382
commit e81c8cbe28
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 65 additions and 46 deletions

View file

@ -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

View file

@ -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);
} }