bonjour!
je vous expose mon petit probleme. je suis en train de programmer un petit jeu d'echecs, et je me retrouve face a un curieux phenomene.
pour tester la validite du coup entre par l'adversaire, je genere la liste des coups possibles, que je stocke sous forme de file ( FIFO, mais peu importe ), puis je parcours la liste pour verifier que le coup entre s'y trouve bien. or, pour une raison que je n'explique pas, le programme ne considere pas le dernier element de la liste. il le saute simplement. ( en clair, si ma fonction qui genere les coups trouve 12 coups, ce qui est confirme par l'attribut nbElt de ma file, et que j'essaie de jouer le 12e ( celui qui a ete trouve en dernier ), le programme me repond qu'il s'agit d'un coup illegal, en d'autre terme lorsque je parcours ma liste pour y verifier la presence dudit coup, je ne regarde que les 11 premiers )
ce qui est etrange c'est qu'avant d'arriver a trouver ca, j'ai fait une petite fonction qui affiche cette liste de coup a l'ecran, et celle ci fonctionne tres bien, alors qu'elle repose exactement sur le meme principe. de plus, lorsque je tente un debug, dev-c++ me signale une segmentation fault des le 2e element de la liste, alors que quand je ne suis pas en mode debug ca fonctionne ( en plus, quand il signale la segmentation fault, les pointeurs incrimines sont tous non NULL ). 3 jours que je seche, alors votre aide serait la bienvenue. Au risque de faire un peu long, je vous libre 2 3 bouts de codes :
La fonction qui affiche la liste de coup : cette boucle while va afficher 12 coups
La portion qui teste la validite du coup : cette boucle while n'en voit que 11 alors que current_f.nbElt vaut bien 12
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void dbg_listeCoup(int couleur) { char out[8]; fileCoups dbg_f=trouveCoups(couleur); while(!dbg_f.isEmpty()) { san_export (dbg_f.pop(),out); cout << out << endl; } }
et (pardon ca va faire long ) le code de ma file :
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 int valide=0; cin >> buf ; coup temp=san_import(buf); while(!current_f.isEmpty()) { if(temp == current_f.pop()) { valide=1; break; } } if(valide) { fait_coup(temp); joue(); }else{ cout << "illegal move" << endl; current_f=trouveCoups(yourColor); }
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
41
42
43
44
45
46
47
48
49
50
51 fileCoups::fileCoups() { tete=NULL; queue=NULL; nbElt=0; } void fileCoups::push(coup c) { fileItem * temp; temp=new fileItem; temp->value=c; temp->suivant=NULL; if ( isEmpty()) { tete=temp; queue=temp; }else{ queue->suivant=temp; queue=temp; } nbElt++; } coup fileCoups::pop() { fileItem * temp= tete; if ( ! isEmpty()) { tete=tete->suivant; nbElt--; return temp->value; }else{ coup c; c.pieceBouge=-1000; return c; } } int fileCoups::isEmpty() { return tete == NULL; }
Partager