SpaceInvaders  1.0
Ebauche d'une réalisation d'un space invader
SpaceInvader_AC.cpp
Aller à la documentation de ce fichier.
1 
10 #include <iostream>
11 #include <fstream>
12 #include <cstdlib> //rand ()
13 #include <ctime> //time ()
14 #include <termios.h> //termios
15 #include <cstdio> // getchar
16 #include "MyType_AC.h"
17 #include "SpaceInvader_AC.h"
18 #include "MyConst_AC.h"
19 using namespace std;
20 using namespace nsSpaceInvader_AC;
21 
22 namespace nsSpaceInvader_AC
23 {
24  void Couleur (const string & Coul)
25  {
26  cout << "\033[" << Coul <<"m";
27  } //Couleur ()
28 
29  void ClearScreen ()
30  {
31  cout << "\033[H\033[2J";
32  }
33 
34  void PutCVPosition (const CVPosition & VPos, char Car, CVString & Space)
35  {
36  for (const CPosition & Pos : VPos)
37  Space[Pos.first][Pos.second] = Car;
38  }// PutCVPosition ()
39 
40  void PutAllObjects (const CAObject & Obj, CVString & Space)
41  {
42  for (string & Line : Space) Line = KEmptyLine;
43  PutCVPosition (Obj[0], KInsideInvader, Space);
44  PutCVPosition (Obj[1], KMissile, Space);
45  PutCVPosition (Obj[2], KInsideMe, Space);
46  PutCVPosition (Obj[3], KTorpedo, Space);
47  }// PutAllObjects ()
48 
49  void DisplaySpace (const CVString & Space)
50  {
51  ClearScreen();
52  cout << string (Space[0].size() + 2, '-') << endl;
53  for (const string & Line : Space)
54  {
55  cout <<'|';
56  for (const char Cel : Line)
57  {
58  switch (Cel)
59  {
60  case KInsideInvader:
61  case KMissile:
63  break;
64  case KInsideMe:
65  case KTorpedo:
66  Couleur (KMyColor);
67  }
68  cout << Cel;
69  Couleur (KReset);
70  }
71  cout <<'|';
72  cout << endl;
73  }
74  cout << string (Space[0].size() + 2, '-') << endl;
75  }// DisplaySpace2 ()
76 
77  void InitSpace (CVString & Space, CAObject & Obj)
78  {
79  //l'espace de jeu
80  Space.resize(KSizeLine);
81  for (string & Line : Space)
82  Line = KEmptyLine;
83  //les envahisseurs
84  Obj[0].resize(KInvadersSize);
85  for (unsigned i (0); i < Obj[0].size (); ++i)
86  Obj[0][i] = make_pair (0, i + KBegInvader);
87 
88  //moi
89  Obj[2].resize(KMySize);
90  for (unsigned i(0); i < Obj[2].size(); ++i)
91  Obj[2][i] = make_pair (Space.size () -1, KBegMe +i);
92  } //InitSpace ()
93 
94 
95  void MaxX (const CVPosition & VPos, CPosition & MaxPos)
96  {
97  MaxPos = VPos [0];
98  for (unsigned i (1); i < VPos.size(); ++i)
99  if (MaxPos.second < VPos[i].second)
100  MaxPos = VPos[i];
101  }// MaxX ()
102 
103  void MaxY (const CVPosition & VPos, CPosition & MaxPos)
104  {
105  MaxPos = VPos [0];
106  for (unsigned i (1); i < VPos.size(); ++i)
107  if (MaxPos.first < VPos[i].first)
108  MaxPos = VPos[i];
109  } // MaxY ()
110 
111 
112  void MinX (const CVPosition & VPos, CPosition & MinPos)
113  {
114  MinPos = VPos [0];
115  for (unsigned i (1); i < VPos.size(); ++i)
116  if (MinPos.second > VPos[i].second)
117  MinPos = VPos[i];
118  }// MinX ()
119 
120  bool MoveLeft (CVPosition & VPos)
121  {
122  CPosition MinPos;
123  MinX (VPos, MinPos);
124  if (0 == MinPos.second) return false;
125  for (CPosition & Pos : VPos)
126  -- Pos.second;
127  return true;
128  } // MoveLeft ()
129 
130  bool MoveRight (const CVString & Space, CVPosition & VPos)
131  {
132  CPosition MaxPos;
133  MaxX (VPos, MaxPos);
134  if (Space.size() -1 == MaxPos.second) return false;
135 
136  for (CPosition & Pos : VPos)
137  ++ Pos.second;
138  return true;
139  } //MoveRight ()
140 
141  void MoveDown (CVPosition & VPos)
142  {
143  for (CPosition & Pos : VPos)
144  ++ Pos.first;
145  }// MoveDown ()
146 
147  void MoveUp (CVPosition & VPos)
148  {
149  for (CPosition & Pos : VPos)
150  -- Pos.first;
151  } //MoveUp ()
152 
153  void ManageMe (const CVString & Space, CAObject &Obj)
154  {
155  char Move;
156  //fonction en C qui permet de lire un caractère. cin ne fonctionnant pas dans cette configuration
157  //cin >> Move;
158  read (STDIN_FILENO, &Move, 1);
159  switch (Move)
160  {
161  case KLeft:
162  MoveLeft (Obj[2]);
163  break;
164  case KRight :
165  MoveRight (Space, Obj[2]);
166  break;
167  case KShoot:
168  Obj[3].push_back(Obj[2][rand () % Obj[2].size ()]);
169  break;
170  }
171  }// ManageMe ()
172 
173  void ManageInvaders (const CVString & Space, CAObject &Obj, unsigned & Direction, unsigned & WhatInvaderDo)
174  {
175  //on decide de ce qu'on fait
176  //la on bouge l'invader
177  if (WhatInvaderDo++ != KMissileRatio)
178  {
179  switch (Direction)
180  {
181  case 0:
182  if (!MoveRight(Space, Obj[0]))
183  {
184  MoveDown(Obj[0]);
185  ++Direction;
186  }
187  break;
188  case 1:
189  if (!MoveLeft(Obj[0]))
190  {
191  MoveDown(Obj[0]);
192  Direction = 0;
193  }
194  }
195  }
196  //sinon on lance un missile d'une des cases en dessous de l'invader
197  //peut importe ou
198  else
199  {
200  Obj[1].push_back(Obj[0][rand () % Obj[0].size ()]);
201  WhatInvaderDo = 0;
202  }
203  }// ManageInvaders ()
204 
206  {
207  for (unsigned i (0); i < Objects.size (); ++i)
208  {
209  //collision entre les missiles et moi
210  for (unsigned j (0); j < StarShips.size (); )
211  {
212  if (Objects[i] == StarShips[j])
213  {
214  StarShips.erase (StarShips.begin () +j);
215  Objects.erase (Objects.begin () +i);
216  }
217  else ++j;
218  }
219  }
220  }//CollisionBetweenMissilesAndI ()
221 
223  {
224  //la boucle est un peu bizare, mais elle permet de gérer
225  //deux colisions en même temps entre deux missiles et torpilles
226  //sur deux case differentes
227  //tout ça à cause du .erase () qui supprime la case courante
228  //=> on ne doit pas incrementer l'indice de boucle dans ce cas
229 
230  for (unsigned i (0); i < Missiles.size (); )
231  {
232  //collision entre les missiles et les torpilles
233  unsigned j (0);
234  for (; j < Torpedos.size (); ++j)
235  {
236  if (Missiles[i] != Torpedos[j]) continue;
237 
238  Torpedos.erase (Torpedos.begin () +j);
239  Missiles.erase (Missiles.begin () +i);
240  break;
241  }
242 
243  if (j == Torpedos.size ()) ++i;
244  }
245  }//CollisionBetweenMissilesAndTorpedos ()
246 
248  {
249  CollisionBetweenMissilesAndTorpedos (Obj[1], Obj[3]);
250  CollisionBetweenObjectsAndShips (Obj[1], Obj[2]);
251  CollisionBetweenObjectsAndShips (Obj[3], Obj[0]);
252  } //ManageCollisions
253 
254  unsigned Victory (const CVString & Space, const CAObject & Obj)
255  {
256  if (0 == Obj[0].size ()) return 2;
257  else if (0 == Obj[2].size() || Obj[0][0].first == Space.size()-1) return 1;
258 
259  return 0;
260  } //Victory ()
261 
262  void DeleteMissiles (const CVString & Space, CVPosition & Missiles)
263  {
264  for (unsigned i (0); i < Missiles.size(); )
265  {
266  if (Missiles[i].first == Space.size())
267  Missiles.erase(Missiles.begin()+i);
268  else ++i;
269  }
270  }//DeleteMissiles ()
271 
272  void DeleteTorpedos (CVPosition & Torpedos)
273  {
274  for (unsigned i (0); i < Torpedos.size(); )
275  {
276  if (unsigned (-1) == Torpedos[i].first)
277  Torpedos.erase(Torpedos.begin()+i);
278  else ++i;
279  }
280  } //DeleteTorpedos ()
281 
282  unsigned SpaceInvaders (void)
283  {
284  CVString Space;
285  CAObject Obj;
286  InitSpace (Space, Obj);
287 
288  unsigned Direction (0);
289  unsigned WhatInvaderDo (0);
290  unsigned Vict (0);
291  unsigned WhoIsToPlay (0);
292  while (1 != Vict && 2 != Vict)
293  {
294  //On met tous les objets dans la matrice
295  PutAllObjects (Obj, Space);
296 
297  //on affiche la matrice
298  DisplaySpace (Space);
299 
300  //c'est a qui de jouer?
301  if (KRatioMeInvaders != WhoIsToPlay++)
302  ManageMe(Space, Obj);
303  else
304  {
305  ManageInvaders(Space, Obj, Direction, WhatInvaderDo);
306  WhoIsToPlay = 0;
307  }
308  //dans tous les cas :
309  //on fait descendre les missiles
310  MoveDown (Obj[1]);
311  //on fait monter les torpilles
312  MoveUp (Obj[3]);
313  //on gere les collisions
314  ManageCollisions (Obj);
315  //On supprime les missiles qui sortent de l'air de jeu
316  DeleteMissiles (Space, Obj[1]);
317  //On supprime les torpilles qui sortent de l'air de jeu
318  DeleteTorpedos (Obj[3]);
319  //on teste si quelqu'un a gagner
320  Vict = Victory (Space, Obj);
321  }
322  PutAllObjects (Obj, Space);
323  DisplaySpace (Space);
324  return Vict;
325  } // SpaceInvaders ()
326 
327  void ShowFile (const string & FileName)
328  {
329  ifstream ifs (FileName);
330  for (string Line; getline (ifs, Line);)
331  cout << Line << endl;
332  cout << endl;
333  } //ShowFile ()
334 
335  //http://www.gnu.org/software/libc/manual/html_node/Noncanon-Example.html
336  void set_input_mode (void)
337  {
338  struct termios tattr;
339 
340  /* Make sure stdin is a terminal. */
341  if (!isatty (STDIN_FILENO))
342  {
343  fprintf (stderr, "Not a terminal.\n");
344  exit (EXIT_FAILURE);
345  }
346 
347  /* Set the funny terminal modes. */
348  tcgetattr (STDIN_FILENO, &tattr);
349  tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
350  tattr.c_cc[VMIN] = 0;
351  tattr.c_cc[VTIME] = 3;
352  tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
353  }
354 
355  int ppal(const string & Path )
356  {
357  srand (time(NULL));
358  set_input_mode ();
359  ShowFile (1 == SpaceInvaders () ? Path + "lost.txt" : Path + "win.txt");
360  return 0;
361  } //ppal ()
362 }
const unsigned KRatioMeInvaders
Nombre de fois où c&#39;est le tour du joueur pour un tour de l&#39;envahisseur.
Definition: MyConst_AC.h:121
void ShowFile(const string &FileName)
Permet d&#39;afficher le contenu d&#39;un fichier à l&#39;écran.
Fichier décrivant l&#39;ensemble des signatures vers les fonctions utilisées dans le jeu.
void PutCVPosition(const CVPosition &VPos, char Car, CVString &Space)
Permet d&#39;insérer le carcactère passé en second paramètre à toutes les positions souhaitées (1er param...
void Couleur(const string &Coul)
const unsigned KBegMe
Numéro de colonne où commence le joueur.
Definition: MyConst_AC.h:147
unsigned SpaceInvaders(void)
Fonction principale du jeu sans option.
std::pair< unsigned, unsigned > CPosition
Alias vers une coordonnée de la matrice. Le premier élément de la paire désigne une ordonnée (axe Y)...
Definition: MyType_AC.h:31
std::vector< std::string > CVString
Alias vers le type de l&#39;écran (l&#39;espace, la matrice).
Definition: MyType_AC.h:23
const unsigned KMySize
Nombre de caractères qui forment mon vaisseau.
Definition: MyConst_AC.h:115
void MoveUp(CVPosition &VPos)
Simule un déplacement haut en ajoutant une unité de déplacement à toutes les ordonnées des objets en ...
void MaxX(const CVPosition &VPos, CPosition &MaxPos)
Trouve le maximum d&#39;un vecteur de CPosition de la coordonées en X (abscisse).
const std::string KMyColor(KVert)
Couleur liée à mes objets (vaisseaux et tropilles).
const char KMissile
Caractèrere formant le missile.
Definition: MyConst_AC.h:84
void ManageCollisions(CAObject &Obj)
Gère toutes les collisions du jeu.
const std::string KReset("0")
Alias remetant la couleur du texte du terminal à sa valeur par défaut.
void DisplaySpace(const CVString &Space)
Permet d&#39;afficher l&#39;espace de jeu.
void ClearScreen()
Fonction effaçant le contenu de l&#39;écran.
int ppal(const string &Path)
Fichier décrivant l&#39;ensemble des alias vers les types utilisés dans le jeu.
const char KLeft
Alias vers la touche servant à se déplacer à gauche.
Definition: MyConst_AC.h:63
void MaxY(const CVPosition &VPos, CPosition &MaxPos)
Trouve le maximum d&#39;un vecteur de CPosition de la coordonées en Y (ordonnée).
bool MoveRight(const CVString &Space, CVPosition &VPos)
Simule un déplacement droit en ajoutant une unité de déplacement à toutes les abscisses des objets en...
const char KTorpedo
Caractèrere formant ma torpille.
Definition: MyConst_AC.h:110
const char KShoot
Alias vers la touche servant à lancer une torpille.
Definition: MyConst_AC.h:68
void CollisionBetweenObjectsAndShips(CVPosition &Objects, CVPosition &StarShips)
Gère les collisions entre les objets et les vaisseaux. Si une collision est détéctée (même coordonées...
const char KInsideInvader
Caractèrere formant l&#39;envahisseur.
Definition: MyConst_AC.h:79
void ManageInvaders(const CVString &Space, CAObject &Obj, unsigned &Direction, unsigned &WhatInvaderDo)
ManageInvaders Simule le jeu de l&#39;envahisseur.
std::vector< CPosition > CVPosition
Alias vers un vecteur de coordonnees.
Definition: MyType_AC.h:37
bool MoveLeft(CVPosition &VPos)
Simule un déplacement gauche en retranchant une unité de déplacement à toutes les abscisses des objet...
const unsigned KMissileRatio
Nombre de fois où l&#39;envahisseur tire un missile par rapport à son déplacement.
Definition: MyConst_AC.h:94
void MoveDown(CVPosition &VPos)
Simule un déplacement bas en ajoutant une unité de déplacement à toutes les ordonnées des objets en p...
void PutAllObjects(const CAObject &Obj, CVString &Space)
Vide l&#39;espace de jeu, puis insère tous les objets du jeu.
const std::string KEmptyLine(KSizeLine, KEmpty)
Alias vers une ligne vide de l&#39;esapce.
void MinX(const CVPosition &VPos, CPosition &MinPos)
Trouve le minimum d&#39;un vecteur de CPosition de la coordonées en X (abscisse).
void DeleteMissiles(const CVString &Space, CVPosition &Missiles)
Supprime les missiles qui sortent de l&#39;espace de jeu.
const char KRight
Alias vers la touche servant à se déplacer à droite.
Definition: MyConst_AC.h:58
void CollisionBetweenMissilesAndTorpedos(CVPosition &Missiles, CVPosition &Torpedos)
Gère les collisions (multiples) entre les missiles et les tropilles.
const unsigned KBegInvader
Numéro de colonne où commence l&#39;envahisseur.
Definition: MyConst_AC.h:142
const char KInsideMe
Caractèrere formant mon vaisseau.
Definition: MyConst_AC.h:105
void DeleteTorpedos(CVPosition &Torpedos)
Supprime les tropilles qui sortent de l&#39;espace de jeu.
void InitSpace(CVString &Space, CAObject &Obj)
Permet d&#39;initialiser l&#39;espace de jeu et de définir les coordonnées des objets à placer au lancement d...
void ManageMe(const CVString &Space, CAObject &Obj)
Simule le jeu du joueur. C&#39;est ici que le joueur choisit ce qu&#39;il fait. S&#39;il décide de tirer...
unsigned Victory(const CVString &Space, const CAObject &Obj)
Teste si l&#39;envahisseur ou si le joueur ont gagné.
void set_input_mode(void)
Permet d&#39;activer la saisie à la volée. Utile pour gérer les déplacement du joueur sans appuyer sur la...
const unsigned KInvadersSize
Nombre de caractères qui forment l&#39;envahisseur.
Definition: MyConst_AC.h:89
std::array< CVPosition, 4 > CAObject
Alias vers un tableau de 4 vecteurs de coordonnees.
Definition: MyType_AC.h:54
const std::string KInvadersColor(KJaune)
Couleur de l&#39;envahisseur.
Fichier décrivant l&#39;ensemble des constantes utilisées dans le jeu.
const unsigned KSizeLine
Nombre de lignes de l&#39;écran (de l&#39;espace).
Definition: MyConst_AC.h:132