From 189c38088dfeb250508372654df02225795b2a51 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sat, 2 Apr 2022 01:39:36 +0200 Subject: [PATCH] =?UTF-8?q?Modifications=20-=20N'ajoute=20que=20des=20anim?= =?UTF-8?q?aux=20=C3=A0=20la=20simulation=20-=20Store=20plusieurs=20variab?= =?UTF-8?q?les=20dans=20la=20classe=20plutot=20que=20dans=20la=20m=C3=A9th?= =?UTF-8?q?ode=20d'ajout=20d'animaux=20-=20Possibilit=C3=A9=20d'ajout?= =?UTF-8?q?=C3=A9=20un=20organisme=20tout=20seul=20-=20D=C3=A9claration=20?= =?UTF-8?q?m=C3=A9thode=20d'affichage=20de=20l'univers=20-=20Ajout=20des?= =?UTF-8?q?=20mot-cl=C3=A9s=20const=20et=20noexcept=20lorsque=20possible?= =?UTF-8?q?=20-=20Ajout=20de=20Herbe=20&=20Sel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 8 +++--- univers.cpp | 75 ++++++++++++++++++++++++++++++++++++----------------- univers.hpp | 38 ++++++++++++++++++--------- 3 files changed, 81 insertions(+), 40 deletions(-) diff --git a/main.cpp b/main.cpp index f1d9e04..2bc6b9e 100644 --- a/main.cpp +++ b/main.cpp @@ -3,18 +3,18 @@ void lancerSimulation(Univers * univers, int m, int n, int nb_moutons, int nb_loups) { univers = new Univers(m, n); - std::vector organismes; + std::vector animaux; while(nb_moutons > 0) { - organismes.push_back(new Mouton()); + animaux.push_back(new Mouton()); nb_moutons--; } while(nb_loups > 0) { - organismes.push_back(new Loup()); + animaux.push_back(new Loup()); nb_loups--; } - univers->ajoutOrganismes(organismes); + univers->ajoutAnimaux(animaux); } void arreterSimulation(Univers * univers) { diff --git a/univers.cpp b/univers.cpp index 310f12f..249c49a 100644 --- a/univers.cpp +++ b/univers.cpp @@ -2,7 +2,7 @@ // -------- 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 } @@ -10,30 +10,37 @@ Univers::~Univers(void) { delete[] _plateau; } -void Univers::ajoutOrganismes(std::vector organismes) { - const uint64_t tailleUnivers = _m * _n, - tailleMaxUnivers = tailleUnivers - tailleUnivers / 4, - nbOrganismesFinales = _nbOrganisme + organismes.size(); - if(organismes.size() + _nbOrganisme > tailleMaxUnivers) +void Univers::ajoutAnimaux(std::vector animaux) { + const int nbOrganismeFinales = _nbAnimaux + animaux.size(); + if(nbOrganismeFinales > _tailleMax) throw std::domain_error("Trop d'organismes pour l'univers."); - /* std::cout << "tailleUnivers : " << tailleUnivers << std::endl; - std::cout << "tailleMaxUnivers : " << tailleMaxUnivers << std::endl; - std::cout << "organismes.size() : " << organismes.size() << std::endl; */ + /* 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? */ - for(uint64_t i = _nbOrganisme, j; i < nbOrganismesFinales;) { - j = rand() % tailleUnivers; // case aléatoire - if(_plateau[j] == 0) { // si on est sur de l'herbe - _plateau[j] = organismes.back()->id(); // on place notre organisme - organismes.pop_back(); // on le retire du vecteur - i++; + 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++; } } - _nbOrganisme = nbOrganismesFinales; } -bool Univers::enVie(void) { - return _nbOrganismesEnVie > 0; +void Univers::ajoutOrganisme(Organisme * organisme, int index) { + 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 -------- @@ -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(void): Organisme() { @@ -55,12 +82,12 @@ Mouton::Mouton(void): Animal() { } -bool Mouton::carnivore(void) { +bool Mouton::carnivore(void) const noexcept { return false; } -int Mouton::id(void) { - return 2; +int Mouton::id(void) const noexcept { + return 1; } // -------- Loup -------- @@ -69,10 +96,10 @@ Loup::Loup(void): Animal() { } -bool Loup::carnivore(void) { +bool Loup::carnivore(void) const noexcept { return false; } -int Loup::id(void) { - return 3; +int Loup::id(void) const noexcept { + return 2; } diff --git a/univers.hpp b/univers.hpp index c6c9fe1..6789c14 100644 --- a/univers.hpp +++ b/univers.hpp @@ -5,28 +5,42 @@ #include class Organisme; +class Animal; class Univers { friend class Organisme; - int _m, _n, _tour, _nbOrganisme, _nbOrganismesEnVie; + const int _m, _n, _tailleUnivers, _tailleMax; + int _tour, _nbAnimaux; int * _plateau; public: Univers(int, int); ~Univers(void); - void ajoutOrganismes(std::vector); + // Ajoute des animaux à l'univers + void ajoutAnimaux(std::vector); - 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 { public: Organisme(void); - // Renvoie l'ID de l'organisme - virtual int id(void) = 0; + /* Renvoie l'ID de l'organisme + * Si `ID < 0` -> non vivant + * Si `ID > 0` -> vivant + * Si `ID == 0` -> Herbe */ + virtual int id(void) const noexcept = 0; }; class Animal: public Organisme { @@ -34,7 +48,7 @@ class Animal: public Organisme { Animal(void); // Animal carnivore ? - virtual bool carnivore(void) = 0; + virtual bool carnivore(void) const noexcept = 0; }; class Herbe: public Organisme { @@ -42,7 +56,7 @@ class Herbe: public Organisme { Herbe(void); // Représenté par "0" dans l'univers - int id(void); + int id(void) const noexcept; }; // Représenté par "1" dans l'univers @@ -51,7 +65,7 @@ class Sel: public Organisme { Sel(void); // Représenté par "1" dans l'univers - int id(void); + int id(void) const noexcept; }; // Représenté par "2" dans l'univers @@ -59,10 +73,10 @@ class Mouton: public Animal { public: Mouton(void); - bool carnivore(void); + bool carnivore(void) const noexcept; // Représenté par "2" dans l'univers - int id(void); + int id(void) const noexcept; }; @@ -71,10 +85,10 @@ class Loup: public Animal { public: Loup(void); - bool carnivore(void); + bool carnivore(void) const noexcept; // Représenté par "3" dans l'univers - int id(void); + int id(void) const noexcept; }; #endif