start minimax impl
This commit is contained in:
parent
5630568c89
commit
99fa3af788
2 changed files with 61 additions and 35 deletions
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
|
Reference in a new issue