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.
J'ai en variables globales les tableau représentant les piles de cartes du jeu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
Tout se passe bien jusqu'au popback final, puis le pushback ne se fait pas et je perds mes cartes dans la matrice...
Code : Sélectionner tout - Visualiser dans une fenêtre à part PushBack(&libre[laCase],carteTmp);
Autres infos:
La fonction Pushback (normalement 100% fiable puisque provenant d'ici)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Pour le code complet, c'est ici http://dl.dropbox.com/u/1872008/lchain%20-%20Double.rar
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Merci d'avance !
Partager