#include "../includes/minimax.h" void action_joueur_minimax(Jeu *jeu, int couleur) { Coups *possibilites = action_possible_joueur(jeu->plateau, couleur); // On fait une copie du plateau actuel int rep_minimax = minimax(jeu, 3, possibilites, *possibilites->coups->premier->jeton, couleur, 1); printf("rep_minimax: %d\n", rep_minimax); free_coups(possibilites); // Crash temporaire exit(1); int ligne = -1, colonne = -1; jeu_joueur(jeu, ligne, colonne, couleur); } int minimax(Jeu *jeu, int profondeur, Coups *positions, Jeton coup_choisi, int joueur, int joueur_gagnant) { if (profondeur == 0) { return heuristique(jeu, coup_choisi); } int value; if (joueur_gagnant) { value = INT_MIN; Element *tmp = positions->coups->premier; while (tmp) { Jeu *jeu_copie = copie_jeu(jeu); Coups *possibilites = action_possible_joueur(jeu_copie->plateau, joueur); value = max(value, minimax(jeu_copie, profondeur - 1, possibilites, *tmp->jeton, joueur, 0)); free_coups(possibilites); free_jeu(jeu_copie); tmp = tmp->suivant; } } else { value = INT_MAX; Element *tmp = positions->coups->premier; while (tmp) { Jeu *jeu_copie = copie_jeu(jeu); Coups *possibilites = action_possible_joueur(jeu_copie->plateau, joueur); value = max(value, minimax(jeu_copie, profondeur - 1, possibilites, *tmp->jeton, joueur, 1)); free_coups(possibilites); free_jeu(jeu_copie); tmp = tmp->suivant; } } return value; } int heuristique(Jeu *jeu, Jeton coup_choisi) { if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, coup_choisi.couleur)) { return 0; } fprintf(stderr, "Minimax veut jouer un coup illégal ("); affiche_jeton(stderr, &coup_choisi); fprintf(stderr, ").\n"); exit(EXIT_FAILURE); } Jeu *copie_jeu(Jeu *source) { Jeu *res = malloc(sizeof(Jeu)); // Copie J1 res->j1 = malloc(sizeof(Joueur)); res->j1->nom = source->j1->nom; res->j1->couleur = source->j1->couleur; res->j1->liste_jeton = copie_liste(source->j1->liste_jeton); res->j1->nb_jeton = source->j1->nb_jeton; // Copie J2 res->j2 = malloc(sizeof(Joueur)); res->j1->nom = source->j1->nom; res->j2->couleur = source->j2->couleur; res->j2->liste_jeton = copie_liste(source->j2->liste_jeton); res->j2->nb_jeton = source->j2->nb_jeton; // Copie plateau for (int i = 0; i < LONGEUR; ++i) { for (int j = 0; j < LARGEUR; ++j) { Jeton *jeton = malloc(sizeof(Jeton)); jeton->couleur = source->plateau[i][j]->couleur; jeton->pos_i = source->plateau[i][j]->pos_i; jeton->pos_j = source->plateau[i][j]->pos_j; res->plateau[i][j] = jeton; } } return res; }