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