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

109 lines
3.1 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 11:40:52 +01:00
Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
2022-11-18 16:49:19 +01:00
2022-11-19 11:40:52 +01:00
// On fait une copie du plateau actuel
2022-11-18 17:09:15 +01:00
2022-11-19 15:50:58 +01:00
int rep_minimax = minimax(jeu, 3, possibilites,
2022-11-19 11:40:52 +01:00
*possibilites->coups->premier->jeton, couleur, 1);
2022-11-18 16:49:19 +01:00
2022-11-19 15:50:58 +01:00
printf("rep_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-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 15:50:58 +01:00
int minimax(Jeu *jeu, int profondeur, Coups *positions, Jeton coup_choisi,
int joueur, int joueur_gagnant) {
2022-11-18 17:09:15 +01:00
if (profondeur == 0) {
2022-11-19 15:50:58 +01:00
return heuristique(jeu, coup_choisi);
2022-11-18 17:09:15 +01:00
}
2022-11-19 11:40:52 +01:00
int value;
if (joueur_gagnant) {
value = INT_MIN;
Element *tmp = positions->coups->premier;
while (tmp) {
2022-11-19 15:50:58 +01:00
Jeu *jeu_copie = copie_jeu(jeu);
Coups *possibilites =
action_possible_joueur(jeu_copie->plateau, joueur);
value = max(value, minimax(jeu_copie, profondeur - 1, possibilites,
2022-11-19 11:40:52 +01:00
*tmp->jeton, joueur, 0));
2022-11-19 15:50:58 +01:00
free_coups(possibilites);
free_jeu(jeu_copie);
2022-11-19 11:40:52 +01:00
tmp = tmp->suivant;
}
} else {
value = INT_MAX;
Element *tmp = positions->coups->premier;
while (tmp) {
2022-11-19 15:50:58 +01:00
Jeu *jeu_copie = copie_jeu(jeu);
Coups *possibilites =
action_possible_joueur(jeu_copie->plateau, joueur);
value = max(value, minimax(jeu_copie, profondeur - 1, possibilites,
2022-11-19 11:40:52 +01:00
*tmp->jeton, joueur, 1));
2022-11-19 15:50:58 +01:00
free_coups(possibilites);
free_jeu(jeu_copie);
2022-11-19 11:40:52 +01:00
tmp = tmp->suivant;
}
}
return value;
}
2022-11-19 15:50:58 +01:00
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);
2022-11-19 11:40:52 +01:00
}
2022-11-19 15:50:58 +01:00
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;
2022-11-19 11:40:52 +01:00
}