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:
Mylloon 2022-04-02 13:08:26 +02:00
parent d89af503e9
commit 7971c8b4f1
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 59 additions and 29 deletions

View file

@ -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;
} }

View file

@ -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