From 3053a940cfdc74802acd252717b3f6950db77cd2 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Wed, 6 Apr 2022 20:14:01 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20l'ordre=20de=20passage=20des=20org?= =?UTF-8?q?anismes=20=C3=A0=20chaque=20tour=20d=C3=A9pendant=20de=20la=20v?= =?UTF-8?q?itesse=20de=20l'organisme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/animal.hpp | 8 +++++--- includes/evenement.hpp | 31 +++++++++++++++++++++++++++++++ src/animal.cpp | 12 ++++++------ src/evenement.cpp | 14 ++++++++++++++ src/loup.cpp | 6 +++++- src/mouton.cpp | 6 +++++- 6 files changed, 66 insertions(+), 11 deletions(-) diff --git a/includes/animal.hpp b/includes/animal.hpp index fbc0b7a..f94cc74 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -1,6 +1,8 @@ #ifndef ECOSYSTEME_ANIMAL_HPP #define ECOSYSTEME_ANIMAL_HPP 1 +#include + #include "organisme.hpp" /* Un animal possède une vitesse, plus il est rapide, @@ -13,8 +15,6 @@ class Animal: public Organisme { protected: - const int m_vitesse; // vitesse de l'organisme - const int m_age_max; // age maximale que peut atteindre l'organisme const int m_faim_max; // faim maximal que peut atteindre l'animal avant de mourir @@ -25,10 +25,12 @@ class Animal: public Organisme { bool m_reproduire = true; // est-ce que l'animal peut se reproduire ? - // Renvoie une vitesse aléatoire + // Renvoie une vitesse aléatoire (+ élevé = + rapide) virtual int generationVitesse(void) const noexcept = 0; public: + const int vitesse; // vitesse de l'organisme + // ID de l'univers, age max, faim max, vitesse Animal(int, int, int, int); diff --git a/includes/evenement.hpp b/includes/evenement.hpp index 9052c88..4914b9c 100644 --- a/includes/evenement.hpp +++ b/includes/evenement.hpp @@ -20,6 +20,37 @@ struct Evenement { // Affiche un univers, possibilité d'afficher les // traits séparant les valeurs du tableaux (par défaut : non) static void affichage(Univers *, bool = false) noexcept; + + private: + struct comp { + bool operator()(Organisme * organisme_a, Organisme * organisme_b) const { + int vitesse_a, vitesse_b; + + // Si l'organisme est un animal, on utilises sa vitesse pour + // la comparaison, sinon on dit que la vitesse == - 1 + + if(Animal * animal_a = dynamic_cast(organisme_a)) { + vitesse_a = animal_a->vitesse; + } else { + vitesse_a = -1; + } + if(Animal * animal_b = dynamic_cast(organisme_b)) { + vitesse_b = animal_b->vitesse; + } else { + vitesse_b = -1; + } + + // Si les vitesses sont égales, alors c'est l'ID + // (un peu comme la date de création / age) de l'organisme + // qui décide car + l'ID est faible, + tôt l'organisme à été + // créer, et on part du principe que + on est jeune + on est rapide + + if(vitesse_a == vitesse_b) { // cas rare + return organisme_a->ID > organisme_b->ID; + } + return vitesse_a > vitesse_b; + } + }; }; #endif diff --git a/src/animal.cpp b/src/animal.cpp index 201990a..23d6a65 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -1,16 +1,16 @@ #include "../includes/animal.hpp" Animal::Animal(const int univers_ID, const int index, const int age_max, - const int faim_max, const int vitesse): Organisme(univers_ID, index), - m_vitesse(vitesse), + const int faim_max, const int p_vitesse): Organisme(univers_ID, index), m_age_max(age_max), - m_faim_max(faim_max) { } + m_faim_max(faim_max), + vitesse(p_vitesse) { } Animal::Animal(const int univers_ID, const int age_max, - const int faim_max, const int vitesse): Organisme(univers_ID), - m_vitesse(vitesse), + const int faim_max, const int p_vitesse): Organisme(univers_ID), m_age_max(age_max), - m_faim_max(faim_max) { } + m_faim_max(faim_max), + vitesse(p_vitesse) { } Animal::~Animal(void) { } diff --git a/src/evenement.cpp b/src/evenement.cpp index 7ced01f..5cdf579 100644 --- a/src/evenement.cpp +++ b/src/evenement.cpp @@ -140,4 +140,18 @@ void Evenement::affichage(Univers * univers, const bool traits) noexcept { void Evenement::lancerSimulation(Univers * univers) { std::cout << "Lancement de la simulation pour l'univers n°" << univers->ID << "..." << std::endl; + + while(univers->enVie()) { + // On trie les organismes en fonction de leur vitesse + std::sort(univers->m_liste_univers[univers->ID].second.begin(), univers->m_liste_univers[univers->ID].second.end(), comp()); + + for(auto it: univers->m_liste_univers[univers->ID].second) { + if(Animal * c = dynamic_cast(it)) { + std::cout << it->lettre(it->ID) << " (" << it->ID << ") : " << c->vitesse << std::endl; + } else { + std::cout << it->lettre(it->ID) << " (" << it->ID << ");" << std::endl; + } + } + break; + } } diff --git a/src/loup.cpp b/src/loup.cpp index 4ca7a1f..e964f1a 100644 --- a/src/loup.cpp +++ b/src/loup.cpp @@ -11,7 +11,11 @@ Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60, Loup::~Loup(void) { } int Loup::generationVitesse(void) const noexcept { - return 0; + std::random_device nombre_aleatoire; + std::default_random_engine graine(nombre_aleatoire()); + std::uniform_int_distribution aleatoire(5, 20); + + return aleatoire(graine); } bool Loup::carnivore(void) const noexcept { diff --git a/src/mouton.cpp b/src/mouton.cpp index b56e1f4..90cdfa5 100644 --- a/src/mouton.cpp +++ b/src/mouton.cpp @@ -9,7 +9,11 @@ Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index, } int Mouton::generationVitesse(void) const noexcept { - return 0; + std::random_device nombre_aleatoire; + std::default_random_engine graine(nombre_aleatoire()); + std::uniform_int_distribution aleatoire(0, 15); + + return aleatoire(graine); } bool Mouton::carnivore(void) const noexcept {