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

82 lines
2.5 KiB
C
Raw Normal View History

2022-11-18 16:49:19 +01:00
#include "../includes/minimax.h"
2022-12-04 18:25:35 +01:00
void action_joueur_minimax(Jeu *jeu, const int couleur, const int profondeur) {
2022-11-20 15:50:55 +01:00
int ligne, colonne, score = INT_MAX;
2022-12-04 18:25:35 +01:00
_action_joueur_minimax(jeu, profondeur, couleur, couleur, &ligne, &colonne,
&score);
2022-11-18 16:49:19 +01:00
2022-11-20 15:50:55 +01:00
jeu_joueur(jeu, ligne, colonne, couleur);
}
2022-11-18 16:49:19 +01:00
2022-11-28 21:06:59 +01:00
void _action_joueur_minimax(Jeu *jeu, int profondeur, int couleur,
const int gagnant, int *ligne, int *colonne,
int *score) {
2022-11-20 15:50:55 +01:00
Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
2022-11-18 17:09:15 +01:00
2022-11-20 15:50:55 +01:00
// Pas de coups possibles
if (!possibilites->taille_liste) {
2022-11-20 17:08:17 +01:00
free_coups(possibilites);
2022-11-20 15:50:55 +01:00
couleur = couleur_ennemi(couleur);
possibilites = action_possible_joueur(jeu->plateau, couleur);
2022-11-19 11:40:52 +01:00
2022-11-20 15:50:55 +01:00
if (!possibilites->taille_liste) {
*score = heuristique(jeu, gagnant);
2022-11-20 17:08:17 +01:00
free_coups(possibilites);
2022-11-19 11:40:52 +01:00
2022-11-20 15:50:55 +01:00
return;
}
}
2022-11-18 17:09:15 +01:00
2022-11-20 15:50:55 +01:00
if (couleur == gagnant) {
*score = INT_MIN;
} else {
*score = INT_MAX;
2022-11-18 17:09:15 +01:00
}
2022-11-20 15:50:55 +01:00
profondeur--;
2022-11-20 17:08:17 +01:00
int score_tmp, i_tmp, j_tmp;
2022-11-20 15:50:55 +01:00
for (Element *i = possibilites->coups->premier; i; i = i->suivant) {
Jeu *jeu_copie = copie_jeu(jeu);
if (!jeu_joueur(jeu_copie, i->jeton->pos_i, i->jeton->pos_j, couleur)) {
fprintf(stderr, "Coup illégal.\n");
exit(EXIT_FAILURE);
}
if (profondeur) {
_action_joueur_minimax(jeu_copie, profondeur,
2022-11-20 17:08:17 +01:00
couleur_ennemi(couleur), gagnant, &i_tmp,
&j_tmp, &score_tmp);
2022-11-19 18:14:03 +01:00
} else {
2022-11-20 17:08:17 +01:00
score_tmp = heuristique(jeu_copie, gagnant);
2022-11-19 11:40:52 +01:00
}
2022-11-20 15:50:55 +01:00
if (couleur == gagnant) { // MAX
2022-11-20 17:08:17 +01:00
if (score_tmp >= *score) {
2022-11-21 00:27:02 +01:00
// On change notre coup s'il est meilleur
2022-11-20 17:08:17 +01:00
*score = score_tmp;
2022-11-20 15:50:55 +01:00
*ligne = i->jeton->pos_i;
*colonne = i->jeton->pos_j;
}
2022-11-19 11:40:52 +01:00
2022-11-20 15:50:55 +01:00
} else { // MIN
2022-11-20 17:08:17 +01:00
if (score_tmp <= *score) {
2022-11-20 15:50:55 +01:00
// On change notre coup s'il est + désavantageux pour
// l'adversaire
2022-11-20 17:08:17 +01:00
*score = score_tmp;
2022-11-20 15:50:55 +01:00
*ligne = i->jeton->pos_i;
*colonne = i->jeton->pos_j;
}
2022-11-19 18:14:03 +01:00
}
2022-11-21 00:27:02 +01:00
2022-11-20 17:08:17 +01:00
free_jeu(jeu_copie);
2022-11-19 15:50:58 +01:00
}
2022-11-20 17:08:17 +01:00
free_coups(possibilites);
2022-11-20 15:50:55 +01:00
}
2022-11-19 15:50:58 +01:00
2022-11-28 21:06:59 +01:00
int heuristique(const Jeu *jeu, const int couleur) {
2022-11-20 15:50:55 +01:00
if (jeu->j1->couleur == couleur) {
// Si on est le joueur 1
return jeu->j1->nb_jeton - jeu->j2->nb_jeton;
}
return jeu->j2->nb_jeton - jeu->j1->nb_jeton;
2022-11-19 11:40:52 +01:00
}