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.

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);
    }
 
 
 
}
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 : 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

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;
Pour le code complet, c'est ici http://dl.dropbox.com/u/1872008/lchain%20-%20Double.rar

Merci d'avance !