Problème avec les listes chaînées
Bonsoir,
Je viens vous appeler à l'aide après avoir essayé de résoudre mon problème pendant des heures, sans succès.
Je dois faire un freecell (oui, le jeu) en C pour un projet de ma fac.
Problème: j'ai voulu faire le malin en utilisant des listes chaînées, mais je n'arrive pas à m'en sortir.
j'arrive à déplacer les cartes une par une, mais j'ai du mal à en déplacer plusieurs d'un coup.
http://img600.imageshack.us/img600/3...crcapturea.jpg
J'ai en variables globales les tableau représentant les piles de cartes du jeu
Code:
1 2 3
| dblist depart[NB_PILES]; // les cartes, telles qu'elles sont disposées au départ (7 piles)
dblist libre[4];
dblist win[4]; |
Tout se passe bien pour sélectionner plusieurs cartes, j'ai également une fonction chargée de vérifier si le déplacement est autorisé.
J'effectue un popback (supprimer dernier élément) dans la liste source, et je fais un pushfront (pousser une carte en première place) dans une pile temporaire.
Si le déplacement n'est pas autorisé, je remets les cartes où elles étaient.
Et c'est bien là le problème, j'ai beau faire mon pushback, ma liste de départ ne change jamais.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| void deposeListeCartesSansVerif(dblist source, char destination,int longueur)
{
int i;
int laCase;
carte carteTmp;
printf("il faut remettre les cartes en places...\n");
for(i=0;i<longueur;i++)
{
if(destination>='0' && destination<='7')
{
laCase=destination-'0';
printf("la case: %d",laCase);
carteTmp = PopBack(&source);
printf("\n WHILE: Carte popee: %c%c\n",carteTmp.numero,carteTmp.motif);
PushBack(&depart[laCase],carteTmp);
View(depart[laCase]);
printf(" %d\n",i);
}
else if(destination>='A' && destination<='D')
{
laCase=destination-'A';
carteTmp = PopBack(&source);
printf("\n WHILE: Carte popee: %c%c\n",carteTmp.numero,carteTmp.motif);
PushBack(&libre[laCase],carteTmp);
printf("%d\n",i);
}
printf(" - %d",i);
}
} |
J'ai effectué plein de tests pour voir d'où venait le problème, c'est pour ça que le code n'est plus très présentable. Veuillez m'en excuser.
Tout se passe bien jusqu'au popback final, puis le pushback ne se fait pas et je perds mes cartes dans la matrice...
Code:
PushBack(&libre[laCase],carteTmp);
Autres infos:
La fonction Pushback (normalement 100% fiable puisque provenant d'ici)
Code:
1 2 3 4 5 6 7 8 9 10 11
| void PushBack(dblist *l, carte val)
{
elem *nouv = malloc(sizeof(elem));
if(!nouv) exit(EXIT_FAILURE);
nouv->value = val;
nouv->prev = l->last;
nouv->next = NULL;
if(l->last) l->last->next = nouv;
else l->first = nouv;
l->last = nouv;
} |
Mes types dblist et carte
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| typedef char type;
typedef char figure;
typedef struct str_carte
{
type numero;
figure motif;
}carte;
/* Structure représantant un élément de la liste. */
typedef struct elem
{
carte value;
struct elem *prev;
struct elem *next;
} elem ;
/* Structure d'accés à la liste. */
typedef struct
{
elem *first;
elem *last;
}dblist; |
Pour le code complet, c'est ici http://dl.dropbox.com/u/1872008/lchain%20-%20Double.rar
Merci d'avance !