Ajouts et modifications
- Affichage de l'univers - Vecteur qui liste les index libres (rangés aléatoirement) - ID maintenant des short
This commit is contained in:
parent
d89af503e9
commit
7971c8b4f1
2 changed files with 59 additions and 29 deletions
73
univers.cpp
73
univers.cpp
|
@ -2,43 +2,70 @@
|
||||||
|
|
||||||
// -------- Univers --------
|
// -------- Univers --------
|
||||||
|
|
||||||
Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tailleMax(_tailleUnivers - _tailleUnivers / 4), _tour(0), _nbAnimaux(0) {
|
Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tour(0), _nbAnimaux(0) {
|
||||||
_plateau = new int[m * n](); // initialise toutes les valeurs du tableau à 0
|
_plateau = new int[m * n](); // initialise toutes les valeurs du tableau à 0
|
||||||
|
|
||||||
|
// On ajoute tous les index possibles
|
||||||
|
for(int i = 0; i < _tailleUnivers; i++)
|
||||||
|
indexLibres.push_back(i);
|
||||||
|
|
||||||
|
// On mélange notre vecteur
|
||||||
|
std::random_device nombreAleatoire;
|
||||||
|
std::default_random_engine graine(nombreAleatoire());
|
||||||
|
std::shuffle(indexLibres.begin(), indexLibres.end(), graine);
|
||||||
|
|
||||||
|
// On en retire quelque un pour évité de saturé notre univers
|
||||||
|
while(indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 4)
|
||||||
|
indexLibres.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
Univers::~Univers(void) {
|
Univers::~Univers(void) {
|
||||||
delete[] _plateau;
|
delete[] _plateau;
|
||||||
|
indexLibres.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
|
void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
|
||||||
const int nbOrganismeFinales = _nbAnimaux + animaux.size();
|
if(animaux.size() > indexLibres.size())
|
||||||
if(nbOrganismeFinales > _tailleMax)
|
|
||||||
throw std::domain_error("Trop d'organismes pour l'univers.");
|
throw std::domain_error("Trop d'organismes pour l'univers.");
|
||||||
|
|
||||||
/* ici crée un truc qui stocke tous les index possible
|
while(!animaux.empty()) {
|
||||||
* pour éviter d'avoir a faire un random sur des index
|
_plateau[indexLibres.back()] = animaux.back()->id(); // on place notre animal
|
||||||
* déjà occupé par autre chose.
|
animaux.pop_back(); // on retire l'animal du vecteur
|
||||||
* -> Quelque chose qui appartient directement à la classe ?
|
indexLibres.pop_back(); // on retire l'index du vecteur
|
||||||
* -> map/filter? */
|
|
||||||
|
|
||||||
while(_nbAnimaux < nbOrganismeFinales) {
|
|
||||||
int i = rand() % _tailleUnivers; // case aléatoire
|
|
||||||
if(_plateau[i] == 0) { // si on est sur de l'herbe
|
|
||||||
_plateau[i] = animaux.back()->id(); // on place notre animal
|
|
||||||
animaux.pop_back(); // on le retire du vecteur
|
|
||||||
|
|
||||||
_nbAnimaux++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Univers::ajoutOrganisme(Organisme * organisme, int index) {
|
void Univers::ajoutOrganisme(Organisme * organisme, int index) {
|
||||||
if(index > _tailleMax)
|
if(index > _tailleUnivers)
|
||||||
throw std::range_error("Impossible de placer un organisme à l'index spécifié");
|
throw std::range_error("Impossible de placer un organisme à l'index spécifié.");
|
||||||
|
|
||||||
_plateau[index] = organisme->id(); // on place notre organisme
|
_plateau[index] = organisme->id(); // on place notre organisme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Univers::affichage(void) {
|
||||||
|
for(int i = 0; i < _n * 5; i++)
|
||||||
|
if(i == 0)
|
||||||
|
std::cout << "┌";
|
||||||
|
else
|
||||||
|
std::cout << "─";
|
||||||
|
std::cout << "┐" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "│ ";
|
||||||
|
for(int i = 0; i < _tailleUnivers; i += _n) {
|
||||||
|
for(int j = 0; j < _n; j++)
|
||||||
|
printf("%2d │ ", _plateau[i + j]);
|
||||||
|
if(i != _tailleUnivers - _n) std::cout << std::endl << "│ ";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
for(int i = 0; i < _n * 5; i++)
|
||||||
|
if(i == 0)
|
||||||
|
std::cout << "└";
|
||||||
|
else
|
||||||
|
std::cout << "─";
|
||||||
|
std::cout << "┘" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
bool Univers::enVie(void) const noexcept {
|
bool Univers::enVie(void) const noexcept {
|
||||||
return _nbAnimaux > 0;
|
return _nbAnimaux > 0;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +91,7 @@ Herbe::Herbe(void): Organisme() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Herbe::id(void) const noexcept {
|
short Herbe::id(void) const noexcept {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +102,7 @@ Sel::Sel(void): Organisme() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Sel::id(void) const noexcept {
|
short Sel::id(void) const noexcept {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +117,7 @@ bool Mouton::carnivore(void) const noexcept {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Mouton::id(void) const noexcept {
|
short Mouton::id(void) const noexcept {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +132,6 @@ bool Loup::carnivore(void) const noexcept {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Loup::id(void) const noexcept {
|
short Loup::id(void) const noexcept {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
15
univers.hpp
15
univers.hpp
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
class Organisme;
|
class Organisme;
|
||||||
class Animal;
|
class Animal;
|
||||||
|
@ -10,9 +12,10 @@ class Animal;
|
||||||
class Univers {
|
class Univers {
|
||||||
friend class Organisme;
|
friend class Organisme;
|
||||||
|
|
||||||
const int _m, _n, _tailleUnivers, _tailleMax;
|
const int _m, _n, _tailleUnivers;
|
||||||
int _tour, _nbAnimaux;
|
int _tour, _nbAnimaux;
|
||||||
int * _plateau;
|
int * _plateau;
|
||||||
|
std::vector<int> indexLibres;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Univers(int, int);
|
Univers(int, int);
|
||||||
|
@ -40,7 +43,7 @@ class Organisme {
|
||||||
* Si `ID < 0` -> non vivant
|
* Si `ID < 0` -> non vivant
|
||||||
* Si `ID > 0` -> vivant
|
* Si `ID > 0` -> vivant
|
||||||
* Si `ID == 0` -> Herbe */
|
* Si `ID == 0` -> Herbe */
|
||||||
virtual int id(void) const noexcept = 0;
|
virtual short id(void) const noexcept = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Animal: public Organisme {
|
class Animal: public Organisme {
|
||||||
|
@ -56,7 +59,7 @@ class Herbe: public Organisme {
|
||||||
Herbe(void);
|
Herbe(void);
|
||||||
|
|
||||||
// Représenté par "0" dans l'univers
|
// Représenté par "0" dans l'univers
|
||||||
int id(void) const noexcept;
|
short id(void) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Sel: public Organisme {
|
class Sel: public Organisme {
|
||||||
|
@ -64,7 +67,7 @@ class Sel: public Organisme {
|
||||||
Sel(void);
|
Sel(void);
|
||||||
|
|
||||||
// Représenté par "-1" dans l'univers
|
// Représenté par "-1" dans l'univers
|
||||||
int id(void) const noexcept;
|
short id(void) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Mouton: public Animal {
|
class Mouton: public Animal {
|
||||||
|
@ -74,7 +77,7 @@ class Mouton: public Animal {
|
||||||
bool carnivore(void) const noexcept;
|
bool carnivore(void) const noexcept;
|
||||||
|
|
||||||
// Représenté par "1" dans l'univers
|
// Représenté par "1" dans l'univers
|
||||||
int id(void) const noexcept;
|
short id(void) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,7 +88,7 @@ class Loup: public Animal {
|
||||||
bool carnivore(void) const noexcept;
|
bool carnivore(void) const noexcept;
|
||||||
|
|
||||||
// Représenté par "2" dans l'univers
|
// Représenté par "2" dans l'univers
|
||||||
int id(void) const noexcept;
|
short id(void) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Reference in a new issue