follow course

This commit is contained in:
Mylloon 2022-11-19 17:15:37 +01:00
parent 7cbca7bffb
commit 32007bd44b
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 31 additions and 57 deletions

View file

@ -11,10 +11,10 @@ typedef struct jeu Jeu;
void action_joueur_minimax(Jeu *jeu, int couleur); void action_joueur_minimax(Jeu *jeu, int couleur);
/* Implémentation de Minimax */ /* Implémentation de Minimax */
int minimax(Jeu *jeu, int profondeur, Coups *positions, Jeton coup_choisi, int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu,
int joueur, int joueur_gagnant); Coups *positions, int joueur_gagnant);
/* Calcule la valeur heuristique pour un coup */ /* Calcule la valeur heuristique pour un coup */
int heuristique(Jeu *jeu, Jeton coup_choisi); int heuristique(Jeu *jeu, Jeton coup_choisi, int couleur);
#endif #endif

View file

@ -3,10 +3,8 @@
void action_joueur_minimax(Jeu *jeu, int couleur) { void action_joueur_minimax(Jeu *jeu, int couleur) {
Coups *possibilites = action_possible_joueur(jeu->plateau, couleur); Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
// On fait une copie du plateau actuel int rep_minimax = minimax(3, *possibilites->coups->premier->jeton, couleur,
jeu, possibilites, couleur);
int rep_minimax = minimax(jeu, 3, possibilites,
*possibilites->coups->premier->jeton, couleur, 1);
printf("rep_minimax: %d\n", rep_minimax); printf("rep_minimax: %d\n", rep_minimax);
@ -20,51 +18,59 @@ void action_joueur_minimax(Jeu *jeu, int couleur) {
jeu_joueur(jeu, ligne, colonne, couleur); jeu_joueur(jeu, ligne, colonne, couleur);
} }
int minimax(Jeu *jeu, int profondeur, Coups *positions, Jeton coup_choisi, int minimax(int profondeur, Jeton coup_choisi, int joueur, Jeu *jeu,
int joueur, int joueur_gagnant) { Coups *positions, int joueur_gagnant) {
if (profondeur == 0) { if (profondeur == 0) {
return heuristique(jeu, coup_choisi); return heuristique(jeu, coup_choisi, joueur);
} }
int value; int value;
if (joueur_gagnant) { if (joueur_gagnant == joueur) {
// Si c'est nous, le joueur qui doit gagner (J1)
value = INT_MIN; value = INT_MIN;
Element *tmp = positions->coups->premier;
while (tmp) { Element *coup_possible = positions->coups->premier;
while (coup_possible) {
Jeu *jeu_copie = copie_jeu(jeu); Jeu *jeu_copie = copie_jeu(jeu);
Coups *possibilites = Coups *possibilites =
action_possible_joueur(jeu_copie->plateau, joueur); action_possible_joueur(jeu_copie->plateau, joueur);
value = max(value, minimax(jeu_copie, profondeur - 1, possibilites, value = max(value,
*tmp->jeton, joueur, 0)); minimax(profondeur - 1, *coup_possible->jeton, joueur,
jeu_copie, possibilites, joueur_gagnant));
free_coups(possibilites); free_coups(possibilites);
free_jeu(jeu_copie); free_jeu(jeu_copie);
tmp = tmp->suivant;
coup_possible = coup_possible->suivant;
} }
} else { } else {
// Si c'est l'ennemi, le joueur qui doit perdre (J2)
value = INT_MAX; value = INT_MAX;
Element *tmp = positions->coups->premier; int ennemi = couleur_ennemi(joueur);
while (tmp) {
Element *coup_possible = positions->coups->premier;
while (coup_possible) {
Jeu *jeu_copie = copie_jeu(jeu); Jeu *jeu_copie = copie_jeu(jeu);
Coups *possibilites = Coups *possibilites =
action_possible_joueur(jeu_copie->plateau, joueur); action_possible_joueur(jeu_copie->plateau, ennemi);
value = max(value, minimax(jeu_copie, profondeur - 1, possibilites, value = min(value,
*tmp->jeton, joueur, 1)); minimax(profondeur - 1, *coup_possible->jeton, ennemi,
jeu_copie, possibilites, joueur_gagnant));
free_coups(possibilites); free_coups(possibilites);
free_jeu(jeu_copie); free_jeu(jeu_copie);
tmp = tmp->suivant;
coup_possible = coup_possible->suivant;
} }
} }
return value; return value;
} }
int heuristique(Jeu *jeu, Jeton coup_choisi) { int heuristique(Jeu *jeu, Jeton coup_choisi, int couleur) {
if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, if (jeu_joueur(jeu, coup_choisi.pos_i, coup_choisi.pos_j, couleur)) {
coup_choisi.couleur)) {
return 0; return 0;
} }
@ -74,35 +80,3 @@ int heuristique(Jeu *jeu, Jeton coup_choisi) {
exit(EXIT_FAILURE); 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;
}