From bc629b2374b495938a100ac2f7f19e2bea5d6a9e Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sun, 10 Apr 2022 21:05:30 +0200 Subject: [PATCH] =?UTF-8?q?S=C3=A9pare=20les=20index=20libres=20pour=20les?= =?UTF-8?q?=20animaux=20du=20reste=20pour=20bien=20avoir=20m=20*=20n=20cas?= =?UTF-8?q?es=20dispos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/organisme.hpp | 7 ++---- src/animal.cpp | 4 ++-- src/organisme.cpp | 48 ++++++++++++++++++++++++++++++++---------- src/univers.cpp | 6 ++++-- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/includes/organisme.hpp b/includes/organisme.hpp index 8fb6497..b60dfd4 100644 --- a/includes/organisme.hpp +++ b/includes/organisme.hpp @@ -20,11 +20,8 @@ class Organisme { public: const int ID; // ID unique pour chaque organisme - // ID de l'Univers, index dans l'univers - Organisme(int, int); - - // ID de l'Univers (index aléatoire) - Organisme(int); + // ID de l'Univers, type de l'organisme, index dans l'univers + Organisme(int, bool = true, int = -1); virtual ~Organisme(void); diff --git a/src/animal.cpp b/src/animal.cpp index 914a396..91a4f47 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -1,13 +1,13 @@ #include "../includes/animal.hpp" Animal::Animal(const int univers_ID, const int index, const int age_max, - const int faim_max, const int p_vitesse): Organisme(univers_ID, index), + const int faim_max, const int p_vitesse): Organisme(univers_ID, false, index), m_age_max(age_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 p_vitesse): Organisme(univers_ID), + const int faim_max, const int p_vitesse): Organisme(univers_ID, false), m_age_max(age_max), m_faim_max(faim_max), vitesse(p_vitesse) { } diff --git a/src/organisme.cpp b/src/organisme.cpp index 0f4eff1..9343375 100644 --- a/src/organisme.cpp +++ b/src/organisme.cpp @@ -1,24 +1,50 @@ #include "../includes/univers.hpp" #include "../includes/organisme.hpp" -Organisme::Organisme(const int univers_ID, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) { - if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres - throw std::domain_error("Trop d'organismes pour l'univers."); +Organisme::Organisme(const int univers_ID, const bool superposable, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) { + // S'il n'y a plus d'index de libres + if(superposable) { + if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { + throw std::domain_error("Trop d'organismes \"superposable\" dans l'univers."); + } + } else { + if(Univers::m_index_libres_univers[m_univers_ID].second.size() == 0) { + throw std::domain_error("Trop d'organismes \"non-superposable\" dans l'univers."); + } } m_total_ID = ID; // + 1 aux ID + + // Ajoute l'organisme à la liste des organismes de l'univers Univers::m_organismes_univers[m_univers_ID].push_back(this); - // Supprime l'index maintenant pris par un organisme - auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin(); - auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end(); - auto it = std::find(debut, fin, index); - if(it != fin) { - Univers::m_index_libres_univers[m_univers_ID].first.erase(it); + // Assigne un index à l'organisme dans l'univers + if(superposable) { + if(index == -1) { // aléatoire si non-renseigné + m_index = Univers::m_index_libres_univers[univers_ID].first.back(); + } + + // Retire l'index de la liste des index libres (superposable) + auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin(); + auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end(); + auto it = std::find(debut, fin, m_index); + if(it != fin) { + Univers::m_index_libres_univers[m_univers_ID].first.erase(it); + } + } else { + if(index == -1) { // aléatoire si non-renseigné + m_index = Univers::m_index_libres_univers[univers_ID].second.back(); + } + + // Retire l'index de la liste des index libres (non-superposable) + auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin(); + auto fin = Univers::m_index_libres_univers[m_univers_ID].second.end(); + auto it = std::find(debut, fin, m_index); + if(it != fin) { + Univers::m_index_libres_univers[m_univers_ID].second.erase(it); + } } } -Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_index_libres_univers[univers_ID].first.back()) {} - Organisme::~Organisme(void) { // On remet notre index dans le vecteur des index vide Univers::m_index_libres_univers[m_univers_ID].first.push_back(m_index); diff --git a/src/univers.cpp b/src/univers.cpp index 6414d19..29c4737 100644 --- a/src/univers.cpp +++ b/src/univers.cpp @@ -7,13 +7,15 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur), ID(m_total_ID + 1) { m_total_ID = ID; // + 1 aux ID - // On ajoute tous les index possibles car pour l'instant le plateau est vide + // On ajoute tous les index possibles car pour l'instant car le plateau est vide for(int i = 0; i < m_taille_univers; ++i) { m_index_libres_univers[ID].first.push_back(i); + m_index_libres_univers[ID].second.push_back(i); } - // On mélange notre vecteur d'index non occupés + // On mélange nos vecteur d'index non occupés melange(&m_index_libres_univers[ID].first); + melange(&m_index_libres_univers[ID].second); // Remplie quelques valeurs du tableau avec de l'herbe while(m_index_libres_univers[ID].first.size() > static_cast(m_taille_univers - m_taille_univers / 2)) {