Bonjour ,
j'essaie d'avancer sur ce projet d'échecs et là je suis confronté à un problème délicat il s'agit des pièces à longue portée comme le Fou - la reine et le tour
mais je fais en ce moment le cas du fou :
on suppose que le fou se trouve ds Coordonnee (3,3) , après analyse du problème j'ai remarqué que toutes les pièces ont disons des vecteur de directions et le cas du Fou y en a 4 :
(-1,1); - > veut dire qu'on accède à la case (2,4)
(1,1);
(1,-1);
(-1,-1);
mon problème c'est que non seulement il faut voir jusqu'où le fou peut aller et aussi il faut s'assurer que s'il rencontre une pièce c'est la limite
en prenant le schéma , j'applique cette méthode :
si on voulait atteindre la direction où il y a le pion (P) il faut appliquer le vecteur (1,1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 8 - - - - - - - - 7 - - - - - - P - 6 - - - - - x - - 5 - - - - x - - - 4 - - - x - - - - 3 - - F - - - - - 2 - - - - - - - - 1 - - - - - - - - 1 2 3 4 5 6 7 8
départ : Fou (3,3)
Fou (3,3) +(1,1) =( 4,4) -> valide car vide (x)
(4,4) + (1,1) = (5,5) -> valide car vide (x)
(5,5) + (1,1) = (6,6) -> valide car vide (x)
(6,6) + (1,1) = (7,7) -> présence Pièce(il faut vérifier si c'est adverse )
voilà en gros le problème , je sais qu'il y a la récursivité dedans mais je ne sais pas comment le faire et comment l'associer aux conditions de contrôle
tant qu'il n'y a pas de pièce et tant que c'est < = 8 et >= 1 (il faut s'assurer aussi que çà ne dépasse pas le plateau
j'ai regarder qlq exemple sur la récursivité mais l'exemple sur le factoriel me paraît simple et logique mais , j'ai dû mal à l'appliquer ici
en fait j'ai déjà rédiger un code qui nous traite seulement une case
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int Fact(int n) { if(n == 1) return 1; else return (n*Fact(n-1)); }
affichage
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 ostream& operator<<(ostream& out,Fou &P1){ out << "ligne: "<< P1.avoirLigne() << "colonne:"<< P1.avoirColonne() << endl ; return out ; } bool Fou::ValiderDeplacement(int x,int y){ Coordonne temp; Coordonne* temp2,*temp3,*temp5; int val ; bool valide = false ; bool trouve = false ; 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 << " " ; } for(i= casesValidesFou.begin(); i!= casesValidesFou.end();++i) { if(*i==NULL) { cout <<"erreur de creation de vectore roi\n" ; } else { // succès et on traite temp = this->Place + *i ; // on teste si entre 1 et 8 if(((temp>=1)==0)&&((temp<=8)==0)) { temp2 = new Coordonne(temp); deplacement.push_back(temp2); } } } 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)){ 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 cavalier " << 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"<< endl ; } return valide ; }
est ce que vous aurrez une suggestion où la manière où je dois procéder pour cette récursivité car j'ai juste traiter le vecteur de direction -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 affichage pion :ligne: 3colonne:3 un deplacement vers la case (2,2) ligne: -1 colonne:1 ligne: 1 colonne:1 ligne: 1 colonne:-1 ligne: -1 colonne:-1 vector dans deplacementligne: 2 colonne:4 vector dans deplacementligne: 4 colonne:4 vector dans deplacementligne: 4 colonne:2 vector dans deplacementligne: 2 colonne:2 la valeur se trouve a la 4 eme position impossible de se deplacer Appuyez sur une touche pour continuer...
mais il faut faire aussi les autres ;
est ce qu vous croyez qu'un vector serait la meilleure solution pour ce genre de cas
je vous remercie d'avance
Partager