Bonjour à tous ,
voilà je suis confronté à un autre problème et notamment sur les pièces à logue portée comme le fou et la reine auxquelles il faut vérifier s'il y a une pièce dans une case avant d'arriver à la case où on veut se déplacer .
je pensais qu'avec un simple vector çà pourrait marcher (c'est ce que j'ai fait pour les pions et et le roi ) mais apparemment notamment pour le fou comme exemple , l'utilisation d'un map semble la solution :
avec un simple vector , j'arrive à trouver les cases valides d'un fou sans tenir compte la présence ou non d'une pièce dans une case :
vous avez remarqué que deplacement est un vector
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154 /************************************************ * deplacement fou *************************************************/ class Fou:public Piece { public : Fou(int x , int y,int coul , char etiq):Piece(x,y,coul,etiq){}; bool ValiderDeplacement(int x,int y,Piece* Ptr); int getCouleur(); }; int Fou::getCouleur(){ return couleur; } ostream& operator<<(ostream& out,Fou &P1){ out << "ligne: "<< P1.avoirLigne() << "colonne:"<< P1.avoirColonne() << endl ; return out ; } bool Fou::ValiderDeplacement(int x,int y,Piece* Ptr){ Coordonne temp; Coordonne* temp2,*temp3,*temp5; int val ; bool valide = false ; bool trouve = false ; int ligne , colonne ; Emplacement casesValidesFou; Emplacement deplacement; vector<Coordonne*>::iterator i; vector<Coordonne*>::iterator ii; // les vecteurs de directions Coordonne* VecteurFou1 = new Coordonne(-1,1); Coordonne* VecteurFou2 = new Coordonne(1,-1); Coordonne* VecteurFou3 = new Coordonne(1,1); Coordonne* VecteurFou4 = new Coordonne(-1,-1); // on insere dans un vector casesValidesFou.push_back(VecteurFou1); casesValidesFou.push_back(VecteurFou2); casesValidesFou.push_back(VecteurFou3); casesValidesFou.push_back(VecteurFou4); for(i = casesValidesFou.begin();i!=casesValidesFou.end();i++){ cout << *i << " " ; } i = casesValidesFou.begin(); while(i!=casesValidesFou.end()){ if(*i==NULL){ cout <<"erreur de creation de vectore roi\n" ; } else { temp = this->Place ; while(((temp <=8)==0)&&((temp>=1)==0)){ temp =temp + *i ; temp2 = new Coordonne(temp); if (((temp <=8)==0)&&((temp>=1)==0)) { deplacement.push_back(temp2); } } } i++; } for(i=deplacement.begin(); i!= deplacement.end();i++) { cout <<"vector dans deplacement" <<*i <<" " ; } i=deplacement.begin(); temp3 = new Coordonne(x,y); val = 0; ii = deplacement.begin(); while((ii!=deplacement.end())&&(trouve==false)){ // il faut s'assurer aussi que la case est vide temp5 = *ii; if((*temp3==*temp5)==0){ trouve = true; } else { ii++; } } val = distance(i,ii); cout << "la valeur se trouve a la"<<" " << val <<" " << "eme position" << endl; if(trouve==true){ cout << "deplacement Fou " << endl ; cout << "il faut verifier la presence d'une piece de la case " << endl ; cout << "s'il y a il faut s'assurer que ila une couleur differente " << endl ; cout << "deplacement vers la ccase " << *temp3 << endl ; } else{ cout <<"impossible de se deplacer pour le fou "<< endl ; } return valide ; }
ce code m'affiche çà :
en fait si je resume y a des vecteurs de direction -1,1) ,(1,-1),(1,1),(-1,-1)
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 affichage pion :ligne: 2colonne:2 un deplacement vers la case 4 6 ligne: -1 colonne:1 ligne: 1 colonne:-1 ligne: 1 colonne:1 ligne: -1 colonne:-1 vector dans deplacementligne: 1 colonne:3 vector dans deplacementligne: 3 colonne:1 vector dans deplacementligne: 3 colonne:3 vector dans deplacementligne: 4 colonne:4 vector dans deplacementligne: 5 colonne:5 vector dans deplacementligne: 6 colonne:6 vector dans deplacementligne: 7 colonne:7 vector dans deplacementligne: 8 colonne:8 vector dans deplacementligne: 1 colonne:1 la valeur se trouve a la 9 eme position impossible de se deplacer pour le fou la validation de deplacement est0 impossible de se dÚplacer Appuyez sur une touche pour continuer...
et à chaque vecteur de direction on associe les cases valides
exemple pour un fou (2,2)
mais le problème c'est que ce cas peut changer seln la situation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 (-1,1) -> (1,3) (1,-1)-> (3,1) (1,1) -> (3,3) - (4,4) -(5,5) -(6,6) -(7,7) - (8,8) (-1,-1) -> (1,1)
exemple pour un fou (3,4)
l'intérêt et l'objectif c'est que si je voulais me déplacer à la case (6,6) cas du fou (2,2) je dois vérifier selon la logique des chose et les rêgles si y a des pièces dans ces cases : (3,3) - (4,4) -(5,5)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 (-1,1) -> (2,5) - (1,6) (1,-1)-> (4,3) -(5,2) -(6,1) (1,1) -> (4,5) -(5,6) -(6,7)- (7,8) (-1,-1) -> (2,3) - (1,2)
le problème avec un vector c'est qu'il rassemble tout donc il se peut qu'il vérifie la case (3,1) ou (1,3) qui n'ont rien avoir :
l'idée qui vient à l'esprit c'est de déclarer un map comme suit au lieu de vector :
map<Coordonne*, Coordonne*> deplacement ;
mais après je ne sais pas trop comment relier comme dans cet exemple :
et aussi , je pense qu'avec map::find(key). on peut trouver la clé associer et si c'était le cas , comment faire pour parcourir les valeurs associées à cette clé ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 map<int, string> Employees; // 1) Assignment using array index notation Employees[5234] = "Mike C."; Employees[3374] = "Charlie M."; Employees[1923] = "David D."; Employees[7582] = "John A."; Employees[5328] = "Peter Q.";
est -ce que le fait de mettre deplacement.begin() ne met pas l'itérator au début même dans une mauvaise clé ??
j'ai vraiment besoin de vos avis et vos aides
toutes suggestions seront toujours les bienvenues
merci d'avance
Partager