diff --git a/includes/minimax.h b/includes/minimax.h index 8d02536..7bb6a15 100644 --- a/includes/minimax.h +++ b/includes/minimax.h @@ -11,10 +11,10 @@ typedef struct jeu Jeu; void action_joueur_minimax(Jeu *jeu, int couleur); /* Implémentation de Minimax */ -int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu, - Coups *positions, int joueur_gagnant); +int minimax(int profondeur, Element *position, int joueur, int couleur, + Jeu *jeu); /* 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 diff --git a/src/minimax.c b/src/minimax.c index b3c567b..bf2cbe3 100644 --- a/src/minimax.c +++ b/src/minimax.c @@ -1,14 +1,16 @@ #include "../includes/minimax.h" 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, - jeu, possibilites, couleur); + int rep_minimax = + 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_jeu(jeu_copie); // Crash temporaire exit(1); @@ -18,65 +20,38 @@ void action_joueur_minimax(Jeu *jeu, int couleur) { jeu_joueur(jeu, ligne, colonne, couleur); } -int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu, - Coups *positions, int joueur_gagnant) { - if (profondeur == 0) { - return heuristique(jeu, coup_choisi, joueur); +int minimax(int profondeur, Element *position, int joueur, int couleur, + Jeu *jeu) { + if (!position->suivant || profondeur == 0) { + // Position terminale ou profondeur maximale + return heuristique(*position->jeton, joueur, jeu); } - int value; - if (joueur_gagnant == joueur) { - // Si c'est nous, le joueur qui doit gagner (J1) - value = INT_MIN; - - 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 { - // 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; + for (Element *pi = position; pi; pi = pi->suivant) { + if (joueur == INT_MAX) { + return max(INT_MIN, minimax(profondeur - 1, pi, INT_MIN, + couleur_ennemi(couleur), jeu)); + } else { + return min(INT_MAX, + minimax(profondeur - 1, pi, INT_MAX, couleur, jeu)); } } - 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)) { - 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); - fprintf(stderr, ").\n"); + fprintf(stderr, ".\n"); exit(EXIT_FAILURE); }