-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCase.cpp
More file actions
executable file
·211 lines (169 loc) · 4.3 KB
/
Case.cpp
File metadata and controls
executable file
·211 lines (169 loc) · 4.3 KB
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "Case.h"
#include "Plateau.h"
using namespace std;
/**
*Constructeur par defaut
*/
Case::Case() {
rectangle = new sf::RectangleShape(sf::Vector2f(20, 20));
estVide = true;
}
/**
*Constructeur
* @param a ordonnee
* @param b abscisse
*/
Case::Case(int a, int b) : x_(b),y_(a){
rectangle = new sf::RectangleShape(sf::Vector2f(20, 20));
estVide = true;
}
/**
*Constructeur de recopie
* Case c une autre case
*/
Case::Case(const Case& c){
x_= c.x_; //on peut appeler les attributs des memes classes
y_ = c.y_;
estVide = c.estVide;
rectangle = c.rectangle;
}
/**
* Destructeur
*/
Case::~Case(){
delete rectangle;
}
/**
* Methode qui va réaliser l'action selon la case
* @return une string vide ici
*/
std::string Case::action(){
//on renvoie false c'est qu'il n'a pas gagne
return "";
}
/**
* Methode qui trouve tous les chemins possibles
* @param de le nombre a parcourir
* @param res le vetor des chemins
* @param p le plateau
*/
void Case::trouverChemin(int de, vector<Case*> &res, Plateau* p){
//on verifie si la case est vide
if(estVide){
//on insere l'element courant si il n'est pas deja present
if(std::find(res.begin(), res.end(), this) == res.end())
res.push_back(this);
//On va parcourir les cases tant que les des sont supérieurs a zero
if(de!=0){
/*
* Algorithme qui va chercher recursivement les endroits sur lequels le joueur peut se deplacer
* Passage dans chaque case (haut, bas, gauche droite) en verifiant la presence dans le tableau de valeur
*
* Pas de deplacement diagonal.
*/
/*
* p->caseValide(x,y) retourne si la position de la case est bien dans le plateau
*/
// La case du haut
if(p->caseValide(x_,y_-1)){
Case* cHaut = p->getCase(x_,y_-1);
cHaut->trouverChemin(de-1, res,p);
}
// La case à gauche
if(p->caseValide(x_-1,y_)){
Case* cGauche = p->getCase(x_-1,y_);
cGauche->trouverChemin(de-1, res,p);
}
// La case du bas
if(p->caseValide(x_,y_+1)){
Case* cBas = p->getCase(x_,y_+1);
cBas->trouverChemin(de-1, res,p);
}
// La case à droite
if(p->caseValide(x_+1,y_)){
Case* cDroite = p->getCase(x_+1,y_);
cDroite->trouverChemin(de-1, res,p);
}
}
}
}
/**
* Methode qui va colorier en bleu la case
* @param window la fenetre qui va etre touchée
*/
void Case::colorier(sf::RenderWindow &window){
rectangle->setFillColor(sf::Color(0, 90, 240,150));
rectangle->setPosition(x_*20+20,y_*20+20);
window.draw(*rectangle);
}
/**
* Méthode qui retrourne une string repésentant la case du type: [x][y]
* @return res l'emplacement de la case
*/
std::string Case::toString(){
std::string res;
std::ostringstream oss;
oss<<".";
res = oss.str();
return res;
}
/**
* Renvoie le point en haut à gauche de la case en fonction de l'affichage
* @return une pair d'int représentant le point en hautà gauche
*/
pair<int,int> Case::pointHG(int tailleCase, int ecartX, int ecartY){
pair<int,int> u;
u.first = x_*tailleCase+ecartX;
u.second = y_*tailleCase+ecartY;
return u;
}
/**
* Renvoie le point permettant de mettre le pion au centre de la case
* @return une pair d'int représentant l'endroit pour bien placer le pion
*/
pair<int,int> Case::milieu(int tailleCase, pair<int,int> a){
pair<int,int> u;
u.first = a.first+(tailleCase/4);
u.second = a.second+(tailleCase/4);
return u;
}
//Getters Setters
/**
* Assesseur de x_
* @return x_ l'absisse de la case
*/
int Case::getX(){
return x_;
}
/**
* Assesseur de y_
* @return y_ l'ordonnee de la case
*/
int Case::getY(){
return y_;
}
/**
* Assesseur de estVide
* @return estVide si la case estvide ou non
*/
int Case::getEstVide(){
return estVide;
}
/**
* Modificateur de estVide
*/
void Case::setEstVide(bool b){
estVide =b;
}
/**
* Operateur d'egalite
* @param c2 la seconde case
**/
bool Case::operator== (Case const &c2)
{
if(x_==c2.x_ && y_==c2.y_){
return true;
}else{
return false;
}
}