exactly follow the course..?

This commit is contained in:
Mylloon 2022-11-19 18:14:03 +01:00
parent 32007bd44b
commit 8ed2c694fe
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 31 additions and 56 deletions

View file

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

View file

@ -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));
Element *coup_possible = positions->coups->premier;
while (coup_possible) {
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 { } else {
// Si c'est l'ennemi, le joueur qui doit perdre (J2) return min(INT_MAX,
value = INT_MAX; minimax(profondeur - 1, pi, INT_MAX, couleur, jeu));
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, "Minimax veut jouer un coup illégal ("); }
fprintf(stderr, "Coup illégal des %ss en ",
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);
} }