#include "../includes/minimax.h" void action_joueur_minimax(Jeu *jeu, int couleur) { Jeu *jeu_copie = copie_jeu(jeu); Coups *possibilites = action_possible_joueur(jeu_copie->plateau, couleur); 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); } 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); } 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)); } } fprintf(stderr, "Erreur innatendu lors de Minimax."); exit(EXIT_FAILURE); } int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu) { if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) { if (jeu->j1->couleur == couleur) { return jeu->j1->nb_jeton; } return jeu->j2->nb_jeton; } 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"); exit(EXIT_FAILURE); }