This repository has been archived on 2022-12-11. You can view files and clone it, but cannot push or open issues or pull requests.
Othello/src/minimax.c

58 lines
1.7 KiB
C
Raw Normal View History

2022-11-18 16:49:19 +01:00
#include "../includes/minimax.h"
void action_joueur_minimax(Jeu *jeu, int couleur) {
2022-11-19 18:14:03 +01:00
Jeu *jeu_copie = copie_jeu(jeu);
Coups *possibilites = action_possible_joueur(jeu_copie->plateau, couleur);
2022-11-18 16:49:19 +01:00
2022-11-19 18:14:03 +01:00
int rep_minimax =
minimax(3, possibilites->coups->premier, INT_MAX, couleur, jeu_copie);
2022-11-18 16:49:19 +01:00
2022-11-19 18:14:03 +01:00
printf("Réponse de minimax: %d\n", rep_minimax);
2022-11-18 17:09:15 +01:00
2022-11-19 15:50:58 +01:00
free_coups(possibilites);
2022-11-19 18:14:03 +01:00
free_jeu(jeu_copie);
2022-11-18 17:09:15 +01:00
2022-11-19 11:40:52 +01:00
// Crash temporaire
exit(1);
int ligne = -1, colonne = -1;
jeu_joueur(jeu, ligne, colonne, couleur);
}
2022-11-18 17:09:15 +01:00
2022-11-19 18:14:03 +01:00
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);
2022-11-18 17:09:15 +01:00
}
2022-11-19 18:14:03 +01:00
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));
2022-11-19 11:40:52 +01:00
}
}
2022-11-19 18:14:03 +01:00
fprintf(stderr, "Erreur innatendu lors de Minimax.");
exit(EXIT_FAILURE);
2022-11-19 11:40:52 +01:00
}
2022-11-19 18:14:03 +01:00
int heuristique(Jeton coup_choisi, int couleur, Jeu *jeu) {
2022-11-19 17:15:37 +01:00
if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) {
2022-11-19 18:14:03 +01:00
if (jeu->j1->couleur == couleur) {
return jeu->j1->nb_jeton;
}
return jeu->j2->nb_jeton;
2022-11-19 15:50:58 +01:00
}
2022-11-19 18:14:03 +01:00
fprintf(stderr, "Coup illégal des %ss en ",
jeu->j1->couleur == couleur ? jeu->j1->nom : jeu->j2->nom);
2022-11-19 15:50:58 +01:00
affiche_jeton(stderr, &coup_choisi);
2022-11-19 18:14:03 +01:00
fprintf(stderr, ".\n");
2022-11-19 15:50:58 +01:00
exit(EXIT_FAILURE);
2022-11-19 11:40:52 +01:00
}