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(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
// 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) {
delete[] _plateau;
indexLibres.clear();
}
void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
const int nbOrganismeFinales = _nbAnimaux + animaux.size();
if(nbOrganismeFinales > _tailleMax)
if(animaux.size() > indexLibres.size())
throw std::domain_error("Trop d'organismes pour l'univers.");
/* ici crée un truc qui stocke tous les index possible
* pour éviter d'avoir a faire un random sur des index
* déjà occupé par autre chose.
* -> Quelque chose qui appartient directement à la classe ?
* -> 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++;
}
while(!animaux.empty()) {
_plateau[indexLibres.back()] = animaux.back()->id(); // on place notre animal
animaux.pop_back(); // on retire l'animal du vecteur
indexLibres.pop_back(); // on retire l'index du vecteur
}
}
void Univers::ajoutOrganisme(Organisme * organisme, int index) {
if(index > _tailleMax)
throw std::range_error("Impossible de placer un organisme à l'index spécifié");
if(index > _tailleUnivers)
throw std::range_error("Impossible de placer un organisme à l'index spécifié.");
_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 {
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;
}
@ -75,7 +102,7 @@ Sel::Sel(void): Organisme() {
}
int Sel::id(void) const noexcept {
short Sel::id(void) const noexcept {
return -1;
}
@ -90,7 +117,7 @@ bool Mouton::carnivore(void) const noexcept {
return false;
}
int Mouton::id(void) const noexcept {
short Mouton::id(void) const noexcept {
return 1;
}
@ -105,6 +132,6 @@ bool Loup::carnivore(void) const noexcept {
return false;
}
int Loup::id(void) const noexcept {
short Loup::id(void) const noexcept {
return 2;
}

View file

@ -3,6 +3,8 @@
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
class Organisme;
class Animal;
@ -10,9 +12,10 @@ class Animal;
class Univers {
friend class Organisme;
const int _m, _n, _tailleUnivers, _tailleMax;
const int _m, _n, _tailleUnivers;
int _tour, _nbAnimaux;
int * _plateau;
std::vector<int> indexLibres;
public:
Univers(int, int);
@ -40,7 +43,7 @@ class Organisme {
* Si `ID < 0` -> non vivant
* Si `ID > 0` -> vivant
* Si `ID == 0` -> Herbe */
virtual int id(void) const noexcept = 0;
virtual short id(void) const noexcept = 0;
};
class Animal: public Organisme {
@ -56,7 +59,7 @@ class Herbe: public Organisme {
Herbe(void);
// Représenté par "0" dans l'univers
int id(void) const noexcept;
short id(void) const noexcept;
};
class Sel: public Organisme {
@ -64,7 +67,7 @@ class Sel: public Organisme {
Sel(void);
// Représenté par "-1" dans l'univers
int id(void) const noexcept;
short id(void) const noexcept;
};
class Mouton: public Animal {
@ -74,7 +77,7 @@ class Mouton: public Animal {
bool carnivore(void) const noexcept;
// 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;
// Représenté par "2" dans l'univers
int id(void) const noexcept;
short id(void) const noexcept;
};
#endif