Salut a tous !
Pour la fac je dois developper un othello en C utilisant l'algorithme minimax
(avec des coupes alpha-beta).
Les sources sont dispo
ici.
Je suis entrain d'implementer le minimax, ou plutot tester si le prog respecte l'algo minimax.
J'ai essayer de le regarder tourner avec une profondeur de 2 il marche si je ne m'abuse, mais une prof de 3 est encore plus dure a tester etant donner le nombre de recursion, a coups de printf ca devient illisible
1) Si quelqu'un connait l'algorithme, est ce qu'il pense que mon code respecte l'algo ???
(En partant du principe que toutes les fonctions appelées font bien leur role

)
2) Comment faire pour que mon programme puisse jouer contre une autre version de mon programme (afin de tester les coefficient de la fonction d'évaluation).
Je suis sous linux, et le programme est en mode-texte. Actuellement je les lancent dans 2 terminaux differents et les 2 progs jouent en Human Vs CPU et je dois taper tous les coups jouer par le 1 dans le 2 et vice-versa...

Et il possible de faire ca avec quelques redirections ou un script ?
Cordialement
Voici mon code:
[cpp]
float trouveCoupMinimax(char * grille, char camp, int prof, StrCoup * coup)
{
float evalMeilleur;
float eval_tmp;
int i,j;
char * tmp_grille;
Maillon * teteMaillon;
Maillon * courantMaillon;
StrCoup * tmp_coup;
if(camp=='x')
evalMeilleur=-FLT_MAX;
else
evalMeilleur=FLT_MAX;
if(prof==1)
{
if(camp=='o')
evalMeilleur=trouveCoupQuiMinimise(grille,coup);
else
evalMeilleur=trouveCoupQuiMaximise(grille,coup);
printf("MiniMax: eval Meilleur: %f\n",evalMeilleur);
}
/* Si la profondeur est != a 1 */
else
{
teteMaillon=NULL;
donneTousLesCoupsValides(grille,camp,&teteMaillon);
courantMaillon=teteMaillon;
while(courantMaillon)
{
tmp_coup=(StrCoup*)malloc(sizeof(StrCoup));
/* Duplicata de la grille */
tmp_grille = mystrdup(grille,DIMENSION_MAX*DIMENSION_MAX);
if(!tmp_grille)
{
printf("malloc null: tmp_grille, trouveCoupMinimax\n");
exit(1);
}
i=courantMaillon->coup.ligne;
j=courantMaillon->coup.colonne;
/* Je joue le Coup donner en entree i,j dans tmp_grille */
*(tmp_grille+(i*DIMENSION_MAX)+j)=camp;
retournePions(camp,tmp_grille,i,j);
printf("\n\n\n\n");
printf("MiniMax: (prof:%i)",prof);
printf("MiniMax: Evaluation de la position: (%c %i)\n",
j+'a',
i+1);
/* Si le l'adversaire ne peux pas jouer */
if(!existeCoupPourCamp(tmp_grille,adversaire(camp)))
{
printf("MiniMax: %c ne peux pas jouer\n",adversaire(camp));
eval_tmp=evalue(tmp_grille);
printf("MiniMax: eval_tmp: %f\n",eval_tmp);
}
else
{
eval_tmp=trouveCoupMinimax(tmp_grille,
adversaire(camp),
prof-1,
tmp_coup);
printf("MiniMax: eval_tmp: %f\n",eval_tmp);
}
if(camp=='x')
{
if(eval_tmp>evalMeilleur)
{
evalMeilleur=eval_tmp;
coup->ligne=i;
coup->colonne=j;
printf("MiniMax: Ce coup maximise + que le precedent\n");
}
}
else
{
if(eval_tmp<evalMeilleur)
{
evalMeilleur=eval_tmp;
coup->ligne=i;
coup->colonne=j;
printf("MiniMax: -->Ce coup minimise + que le precedent\n");
}
}
/* Suppression du duplicata */
free(tmp_grille);
free(tmp_coup);
/* on passe au maillon suivant */
courantMaillon=courantMaillon->suivant;
} /* fin while */
free_Maillons(teteMaillon);
} /* fin if */
return evalMeilleur;
}
[/cpp]