Salut les filles :bounce: (quoi on peut toujours rever [:matleflou] :ane:)
Pour mon prog d’othello et l’algo minimax, j’utilise une liste chainée qui contient tous les coups valides.
Voila la déclaration de la struct:
[cpp]
typedef struct _StrCoup {
int ligne;
int colonne;
char camp;
} StrCoup;
typedef struct _Maillon {
StrCoup coup;
struct _Maillon * suivant;
} Maillon;[/cpp]
puis je fais une fonction trouveCoupQuiMinimise et trouveCoupQuiMaximise (m’opposée):
[cpp]
float trouveCoupQuiMinimise(char * grille, StrCoup * Coup)
{
int eval_tmp,eval;
int i,j;
char Camp;
char * tmp_grille;
Maillon * teteMaillon;
Maillon * courantMaillon;
eval=20000;
Camp=‘o’;
Coup->camp=Camp;
teteMaillon=(Maillon *)malloc(sizeof(Maillon));
if(teteMaillon==NULL)
printf(“Allocation de teteMaillon dans trouveCoupQuiMinimise impossible\n”);
donneTousLesCoupsValides(grille,Camp,teteMaillon);
courantMaillon=teteMaillon;
/*
* Parcours de la liste chainée
*/
/* Tant que le maillon a un suivant */
while(courantMaillon->suivant!=NULL)
{
/* Duplicata de la grille */
tmp_grille = strdup(grille);
if(tmp_grille==NULL){
printf("Allocation dans trouveCoupQuiMaximise impossible\n");
}
i=courantMaillon->coup.ligne;
j=courantMaillon->coup.colonne;
printf("\nEvaluation de la position: L:%i C:%i\n",i,j);
*(tmp_grille+(i*DIMENSION_MAX)+j)=Camp;
retournePions(Camp,tmp_grille,i,j);
/* afficheOthellier(tmp_grille); */
eval_tmp=evalue(tmp_grille);
printf("Resultat: eval:%i eval_tmp:%i\n",eval,eval_tmp);
if(eval>eval_tmp)
{
printf("Change de coup\n");
eval=eval_tmp;
Coup->ligne=i;
Coup->colonne=j;
}
/* Suppression du duplicata */
free(tmp_grille);
/* on passe au maillon suivant */
courantMaillon=courantMaillon->suivant;
};
free(teteMaillon); /* <- Je libere la liste chainée */
return eval;
}
[/cpp]
Ma pour l’instant ca marche d’enfer, je fait jouer le CPU versus CPU et ils font une partie toute trankille d’othello.
A la fin il m’affiche le score 45-19 comme d’hab !
Maintenant voila je fait un free(teteMaillon) qui est censé liberer la chaine, mais bien sur ca ne libere que la tete de la chaine.
Alors j’ai fait une fonction pour liberer toute ma liste chainée:
[cpp]
void free_Maillons(Maillon * teteMaillon)
{
Maillon * suivantMaillon;
Maillon * courantMaillon;
courantMaillon=teteMaillon;
if(!courantMaillon) return;
while(courantMaillon!=NULL)
{
printf(“free maillon: %p\n”,courantMaillon);
suivantMaillon=courantMaillon->suivant;
free(courantMaillon);
courantMaillon=suivantMaillon;
}
}
[/cpp]
Mais lorsque je l’utilise, en remplacant free(teteMaillon) par free_Maillons(teteMaillon) bah ca plante, ca boucle indefiniment ???
Pleaze Help, j’ai passer 8 heures sur free_Maillons, j’en ai ma claque et si je fait pas ste fonction, l’algo minimax va vite me bouffer toutes mes ressources :pfff:
(PS: mea culpa Sans-Nom, les test sur les malloc ca sert, encore plus les free [:matleflou])
Cordialement