start minimax impl

This commit is contained in:
Mylloon 2022-11-19 11:40:52 +01:00
parent 5630568c89
commit 99fa3af788
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 61 additions and 35 deletions

View file

@ -1,6 +1,9 @@
#ifndef OTHELLO_MINIMAX_H #ifndef OTHELLO_MINIMAX_H
#define OTHELLO_MINIMAX_H 1 #define OTHELLO_MINIMAX_H 1
#include <limits.h>
#include <string.h>
#include "joueur.h" #include "joueur.h"
typedef struct jeu Jeu; typedef struct jeu Jeu;
@ -9,6 +12,14 @@ 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 */
/* Jeton *minimax(int profondeur, Coups *positions, int joueur); */ int minimax(Jeton *plateau[LONGEUR][LARGEUR], int profondeur, Coups *positions,
Jeton coup_choisi, int joueur, int joueur_gagnant);
/* Calcule la valeur heuristique pour un coup */
int heuristique(Jeton *plateau[LONGEUR][LARGEUR], Jeton coup_choisi);
/* Copie le plateau */
void copie_plateau(Jeton *plateau_source[LONGEUR][LARGEUR],
Jeton *plateau_destination[LONGEUR][LARGEUR]);
#endif #endif

View file

@ -1,47 +1,62 @@
#include "../includes/minimax.h" #include "../includes/minimax.h"
void action_joueur_minimax(Jeu *jeu, int couleur) { void action_joueur_minimax(Jeu *jeu, int couleur) {
// TODO Coups *possibilites = action_possible_joueur(jeu->plateau, couleur);
// On fait une copie du plateau actuel
Jeton *plateau[LONGEUR][LARGEUR];
copie_plateau(jeu->plateau, plateau);
int rep_minimax = minimax(plateau, 3, possibilites,
*possibilites->coups->premier->jeton, couleur, 1);
free_coups(possibilites);
printf("-> %d\n", rep_minimax);
// Crash temporaire
exit(1);
int ligne = -1, colonne = -1; int ligne = -1, colonne = -1;
jeu_joueur(jeu, ligne, colonne, couleur); jeu_joueur(jeu, ligne, colonne, couleur);
} }
/* Jeton *h(Jeton *p) { int minimax(Jeton *plateau[LONGEUR][LARGEUR], int profondeur, Coups *positions,
// TODO ?? Jeton coup_choisi, int joueur, int joueur_gagnant) {
return p;
}
Jeton *_minimax(Element *element) {
return max(minimax(element->suivant));
}
Jeton *minimax(int profondeur, Coups *positions, int joueur) {
if (positions->taille_liste == 1) {
// TODO ??
return h(positions->coups->premier->jeton);
}
// Profondeur maximale
if (profondeur == 0) { if (profondeur == 0) {
// TODO ?? return heuristique(plateau, coup_choisi);
return h(positions->coups->premier->jeton);
} }
return _minimax(positions->coups->premier); int value;
if (joueur_gagnant) {
value = INT_MIN;
Element *tmp = positions->coups->premier;
while (tmp) {
value = max(value, minimax(plateau, profondeur - 1, positions,
*tmp->jeton, joueur, 0));
// Joueur 1 = MAX tmp = tmp->suivant;
// Joueur 2 = MIN }
} else {
value = INT_MAX;
Element *tmp = positions->coups->premier;
while (tmp) {
value = max(value, minimax(plateau, profondeur - 1, positions,
*tmp->jeton, joueur, 1));
// minimax(profondeur n, position p, joueur J) tmp = tmp->suivant;
// - si p est terminale }
// return h*(p) }
// - si n = 0 # On a atteint la profondeur maximale
// return h(p) return value;
// - sinon, soit p1, ..., pm les m positions accessibles depuis p }
// - si J = MAX
// return max minimax(n - 1, pi, MIN) # 1 <= i <= m int heuristique(Jeton *plateau[LONGEUR][LARGEUR], Jeton coup_choisi) {
// - si J = MIN return 0;
// return min minimax(n - 1, pi, MAX) # 1 <= 1 <= m }
} */
void copie_plateau(Jeton *source[LONGEUR][LARGEUR],
Jeton *destination[LONGEUR][LARGEUR]) {
memcpy(destination, source, sizeof(*source));
}