Modifications

- N'ajoute que des animaux à la simulation
- Store plusieurs variables dans la classe plutot que dans la méthode d'ajout d'animaux
- Possibilité d'ajouté un organisme tout seul
- Déclaration méthode d'affichage de l'univers
- Ajout des mot-clés const et noexcept lorsque possible
- Ajout de Herbe & Sel
This commit is contained in:
Mylloon 2022-04-02 01:39:36 +02:00
parent feb473514d
commit 189c38088d
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
3 changed files with 81 additions and 40 deletions

View file

@ -3,18 +3,18 @@
void lancerSimulation(Univers * univers, int m, int n, int nb_moutons, int nb_loups) { void lancerSimulation(Univers * univers, int m, int n, int nb_moutons, int nb_loups) {
univers = new Univers(m, n); univers = new Univers(m, n);
std::vector<Organisme*> organismes; std::vector<Animal*> animaux;
while(nb_moutons > 0) { while(nb_moutons > 0) {
organismes.push_back(new Mouton()); animaux.push_back(new Mouton());
nb_moutons--; nb_moutons--;
} }
while(nb_loups > 0) { while(nb_loups > 0) {
organismes.push_back(new Loup()); animaux.push_back(new Loup());
nb_loups--; nb_loups--;
} }
univers->ajoutOrganismes(organismes); univers->ajoutAnimaux(animaux);
} }
void arreterSimulation(Univers * univers) { void arreterSimulation(Univers * univers) {

View file

@ -2,7 +2,7 @@
// -------- Univers -------- // -------- Univers --------
Univers::Univers(int m, int n): _m(m), _n(n), _tour(0) { Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tailleMax(_tailleUnivers - _tailleUnivers / 4), _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
} }
@ -10,30 +10,37 @@ Univers::~Univers(void) {
delete[] _plateau; delete[] _plateau;
} }
void Univers::ajoutOrganismes(std::vector<Organisme*> organismes) { void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
const uint64_t tailleUnivers = _m * _n, const int nbOrganismeFinales = _nbAnimaux + animaux.size();
tailleMaxUnivers = tailleUnivers - tailleUnivers / 4, if(nbOrganismeFinales > _tailleMax)
nbOrganismesFinales = _nbOrganisme + organismes.size();
if(organismes.size() + _nbOrganisme > tailleMaxUnivers)
throw std::domain_error("Trop d'organismes pour l'univers."); throw std::domain_error("Trop d'organismes pour l'univers.");
/* std::cout << "tailleUnivers : " << tailleUnivers << std::endl; /* ici crée un truc qui stocke tous les index possible
std::cout << "tailleMaxUnivers : " << tailleMaxUnivers << std::endl; * pour éviter d'avoir a faire un random sur des index
std::cout << "organismes.size() : " << organismes.size() << std::endl; */ * déjà occupé par autre chose.
* -> Quelque chose qui appartient directement à la classe ?
* -> map/filter? */
for(uint64_t i = _nbOrganisme, j; i < nbOrganismesFinales;) { while(_nbAnimaux < nbOrganismeFinales) {
j = rand() % tailleUnivers; // case aléatoire int i = rand() % _tailleUnivers; // case aléatoire
if(_plateau[j] == 0) { // si on est sur de l'herbe if(_plateau[i] == 0) { // si on est sur de l'herbe
_plateau[j] = organismes.back()->id(); // on place notre organisme _plateau[i] = animaux.back()->id(); // on place notre animal
organismes.pop_back(); // on le retire du vecteur animaux.pop_back(); // on le retire du vecteur
i++;
_nbAnimaux++;
} }
} }
_nbOrganisme = nbOrganismesFinales;
} }
bool Univers::enVie(void) { void Univers::ajoutOrganisme(Organisme * organisme, int index) {
return _nbOrganismesEnVie > 0; if(index > _tailleMax)
throw std::range_error("Impossible de placer un organisme à l'index spécifié");
_plateau[index] = organisme->id(); // on place notre organisme
}
bool Univers::enVie(void) const noexcept {
return _nbAnimaux > 0;
} }
// -------- Organisme -------- // -------- Organisme --------
@ -42,6 +49,26 @@ Organisme::Organisme(void) {
} }
// -------- Herbe --------
Herbe::Herbe(void): Organisme() {
}
int Herbe::id(void) const noexcept {
return 0;
}
// -------- Sel --------
Sel::Sel(void): Organisme() {
}
int Sel::id(void) const noexcept {
return -1;
}
// -------- Animal -------- // -------- Animal --------
Animal::Animal(void): Organisme() { Animal::Animal(void): Organisme() {
@ -55,12 +82,12 @@ Mouton::Mouton(void): Animal() {
} }
bool Mouton::carnivore(void) { bool Mouton::carnivore(void) const noexcept {
return false; return false;
} }
int Mouton::id(void) { int Mouton::id(void) const noexcept {
return 2; return 1;
} }
// -------- Loup -------- // -------- Loup --------
@ -69,10 +96,10 @@ Loup::Loup(void): Animal() {
} }
bool Loup::carnivore(void) { bool Loup::carnivore(void) const noexcept {
return false; return false;
} }
int Loup::id(void) { int Loup::id(void) const noexcept {
return 3; return 2;
} }

View file

@ -5,28 +5,42 @@
#include <vector> #include <vector>
class Organisme; class Organisme;
class Animal;
class Univers { class Univers {
friend class Organisme; friend class Organisme;
int _m, _n, _tour, _nbOrganisme, _nbOrganismesEnVie; const int _m, _n, _tailleUnivers, _tailleMax;
int _tour, _nbAnimaux;
int * _plateau; int * _plateau;
public: public:
Univers(int, int); Univers(int, int);
~Univers(void); ~Univers(void);
void ajoutOrganismes(std::vector<Organisme*>); // Ajoute des animaux à l'univers
void ajoutAnimaux(std::vector<Animal*>);
bool enVie(void); /* Ajoute un organisme
* Attention, écrase l'organisme précédent */
void ajoutOrganisme(Organisme *, int);
// Affiche l'univers à l'instant présent
void affichage(void);
// Vérifie s'il y a de la vie dans l'univers
bool enVie(void) const noexcept;
}; };
class Organisme { class Organisme {
public: public:
Organisme(void); Organisme(void);
// Renvoie l'ID de l'organisme /* Renvoie l'ID de l'organisme
virtual int id(void) = 0; * Si `ID < 0` -> non vivant
* Si `ID > 0` -> vivant
* Si `ID == 0` -> Herbe */
virtual int id(void) const noexcept = 0;
}; };
class Animal: public Organisme { class Animal: public Organisme {
@ -34,7 +48,7 @@ class Animal: public Organisme {
Animal(void); Animal(void);
// Animal carnivore ? // Animal carnivore ?
virtual bool carnivore(void) = 0; virtual bool carnivore(void) const noexcept = 0;
}; };
class Herbe: public Organisme { class Herbe: public Organisme {
@ -42,7 +56,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); int id(void) const noexcept;
}; };
// Représenté par "1" dans l'univers // Représenté par "1" dans l'univers
@ -51,7 +65,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); int id(void) const noexcept;
}; };
// Représenté par "2" dans l'univers // Représenté par "2" dans l'univers
@ -59,10 +73,10 @@ class Mouton: public Animal {
public: public:
Mouton(void); Mouton(void);
bool carnivore(void); bool carnivore(void) const noexcept;
// Représenté par "2" dans l'univers // Représenté par "2" dans l'univers
int id(void); int id(void) const noexcept;
}; };
@ -71,10 +85,10 @@ class Loup: public Animal {
public: public:
Loup(void); Loup(void);
bool carnivore(void); bool carnivore(void) const noexcept;
// Représenté par "3" dans l'univers // Représenté par "3" dans l'univers
int id(void); int id(void) const noexcept;
}; };
#endif #endif