From 374b8d8fd5481c67f7bf2731898d7aa6da43220e Mon Sep 17 00:00:00 2001 From: Mylloon Date: Mon, 18 Apr 2022 02:26:27 +0200 Subject: [PATCH] =?UTF-8?q?Ajouts=20-=20D=C3=A9finition=20du=20repas=20tou?= =?UTF-8?q?t=20les=20N=20tours=20dans=20la=20construction=20de=20l'animal?= =?UTF-8?q?=20-=20M=C3=A9thodes=20qui=20renvoie=20les=20cases=20aux=20alen?= =?UTF-8?q?tours=20de=20l'animal=20-=20Possibilit=C3=A9=20de=20d=C3=A9plac?= =?UTF-8?q?er=20un=20animal=20avec=20un=20index=20donn=C3=A9=20-=20Loup=20?= =?UTF-8?q?mange=20mouton=20-=20Ne=20peux=20pas=20manger=20si=20l'animal?= =?UTF-8?q?=20s'accouple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/animal.hpp | 23 ++++++--- includes/loup.hpp | 1 + src/animal.cpp | 110 ++++++++++++++++++++------------------------ src/loup.cpp | 32 +++++++++---- src/mouton.cpp | 19 ++++---- 5 files changed, 102 insertions(+), 83 deletions(-) diff --git a/includes/animal.hpp b/includes/animal.hpp index 91ce28c..0ff3874 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -33,20 +33,25 @@ class Animal: public Organisme { Animal * m_partenaire = nullptr; - // Vrai si l'animal doit déposé des sédiment au sol à sa mort - bool m_deposer_sediment = true; - const int genre; // genre, 0 = masculin, 1 = féminin // Nombre de tour a attendre avant de pouvoir se reproduire de nouveau const short m_attente_reproduction; + // Définit les repas que doit prendre l'animal, par exemple + // 1 = 1 repas par tour + // 3 = 1 repas tout les 3 tours + const short m_repas_tt_les_cb_de_tours; + // Renvoie une vitesse aléatoire (+ élevé = + rapide) virtual int generationVitesse(void) const noexcept = 0; // Renvoie un genre choisit aléatoirement int choixGenre(void) const noexcept; + // Renvoie la liste des cases atours de l'animal + std::vector casesAlentours(void) const noexcept; + // Renvoie la liste des cases accesible depuis la position de l'animal std::vector casesPossible(void) const noexcept; @@ -55,16 +60,20 @@ class Animal: public Organisme { // Déplace l'animal void deplacement(void) noexcept; + void deplacement(int) noexcept; public: + // Vrai si l'animal doit déposé des sédiment au sol à sa mort + bool m_deposer_sediment = true; + const int vitesse; // vitesse de l'organisme - // ID de l'univers, age max, faim max, vitesse, genre, rythme reproduction - Animal(int, int, int, int, int, int); - - // ID de l'univers, index dans l'univers, age max, faim max, vitesse, genre, rythme reproduction + // ID de l'univers, age max, faim max, vitesse, genre, rythme reproduction, repas tout les n de tours Animal(int, int, int, int, int, int, int); + // ID de l'univers, index dans l'univers, age max, faim max, vitesse, genre, rythme reproduction, repas tout les n de tours + Animal(int, int, int, int, int, int, int, int); + ~Animal(void); // Animal carnivore ? diff --git a/includes/loup.hpp b/includes/loup.hpp index 4e84e01..0a4279d 100644 --- a/includes/loup.hpp +++ b/includes/loup.hpp @@ -2,6 +2,7 @@ #define ECOSYSTEME_LOUP_HPP 1 #include "animal.hpp" +#include "mouton.hpp" class Loup: public Animal { const char _m_lettre = 'L'; // caractère représentant le loup diff --git a/src/animal.cpp b/src/animal.cpp index 6794378..be41376 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -2,18 +2,19 @@ Animal::Animal(const int univers_ID, const int index, const int age_max, const int faim_max, const int p_vitesse, int p_genre, - int rythme_reproduction): Organisme(univers_ID, false, index), + int rythme_reproduction, int rtlcbdt): Organisme(univers_ID, false, index), m_age_max(age_max), m_faim_max(faim_max), genre(p_genre), m_attente_reproduction(rythme_reproduction), - vitesse(p_vitesse) + m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse) { } Animal::Animal(const int univers_ID, const int age_max, const int faim_max, const int p_vitesse, - int p_genre, int rythme_reproduction): Organisme(univers_ID, false), - m_age_max(age_max), m_faim_max(faim_max), - genre(p_genre), m_attente_reproduction(rythme_reproduction), - vitesse(p_vitesse) + int p_genre, int rythme_reproduction, + int rtlcbdt): Organisme(univers_ID, false), + m_age_max(age_max), m_faim_max(faim_max), + genre(p_genre), m_attente_reproduction(rythme_reproduction), + m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse) { } Animal::~Animal(void) { @@ -37,93 +38,78 @@ Animal::~Animal(void) { } } -std::vector Animal::casesPossible(void) const noexcept { +std::vector Animal::casesAlentours(void) const noexcept { std::vector vec; int longueur_univers = Univers::m_dimensions_univers[m_univers_ID].first, taille_max_univers = longueur_univers * Univers::m_dimensions_univers[m_univers_ID].second, i; - auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin(); - auto fin = Univers::m_index_libres_univers[m_univers_ID].second.end(); - // En haut à gauche i = m_index - longueur_univers - 1; if(i >= 0 && i % longueur_univers < longueur_univers - 1) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // En haut i = m_index - longueur_univers; if(i >= 0) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // En haut à droite i = m_index - longueur_univers + 1; if(i >= 0 && i % longueur_univers != 0) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // A gauche i = m_index - 1; if(i >= 0 && i % longueur_univers < longueur_univers - 1) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // A droite i = m_index + 1; if(i < taille_max_univers && i % longueur_univers != 0) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // En bas à gauche i = m_index + longueur_univers - 1; if(i < taille_max_univers && i % longueur_univers < longueur_univers - 1) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // En bas i = m_index + longueur_univers; if(i < taille_max_univers) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); - } + vec.push_back(i); } // En bas à droite i = m_index + longueur_univers + 1; if(i < taille_max_univers && i % longueur_univers != 0) { - // On retire ceux qui sont déjà occupés par un animal - auto it = std::find(debut, fin, i); - if(it != fin) { - vec.push_back(i); + vec.push_back(i); + } + + return vec; +} + +std::vector Animal::casesPossible(void) const noexcept { + std::vector vec = casesAlentours(); + + // On retire ceux qui sont déjà occupés par un animal + // C'est à dire pas dans la liste des index libre + 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 = vec.begin(); + while(it != vec.end()) { + auto recherche = std::find(debut, fin, *it); + if(recherche == fin) { // si non-libre on supprime + vec.erase(it); + } else { // sinon on va à la prochaine position possible + ++it; } } @@ -138,23 +124,14 @@ int Animal::choixGenre(void) const noexcept { return aleatoire(graine); } -void Animal::deplacement(void) noexcept { +void Animal::deplacement(int index) noexcept { // Si l'animal n'est pas entrain de s'accoupler if(m_partenaire == nullptr) { - // Déplacement aléatoire - std::vector cases_possible = casesPossible(); - // On rajoute l'index actuel car l'animal peut décidé de rester sur place - cases_possible.push_back(m_index); - - std::random_device nombre_aleatoire; - std::default_random_engine graine(nombre_aleatoire()); - std::uniform_int_distribution aleatoire(0, cases_possible.size() - 1); - // Ajoute l'index actuel au vecteurs des index libres Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index); // Déplace l'animal - m_index = cases_possible[static_cast(aleatoire(graine))]; + m_index = index; // Retire la nouvel position du vecteur des index libre auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin(); @@ -166,3 +143,16 @@ void Animal::deplacement(void) noexcept { } } + +void Animal::deplacement(void) noexcept { + // Déplacement aléatoire + std::vector cases_possible = casesPossible(); + // On rajoute l'index actuel car l'animal peut décidé de rester sur place + cases_possible.push_back(m_index); + + std::random_device nombre_aleatoire; + std::default_random_engine graine(nombre_aleatoire()); + std::uniform_int_distribution aleatoire(0, cases_possible.size() - 1); + + deplacement(cases_possible[static_cast(aleatoire(graine))]); +} diff --git a/src/loup.cpp b/src/loup.cpp index 451cee2..0fa412d 100644 --- a/src/loup.cpp +++ b/src/loup.cpp @@ -1,10 +1,10 @@ #include "../includes/loup.hpp" -Loup::Loup(const int univers_ID): Animal(univers_ID, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3) { +Loup::Loup(const int univers_ID): Animal(univers_ID, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3, 4) { m_correspondance[ID] = _m_lettre; } -Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3) { +Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3, 4) { m_correspondance[ID] = _m_lettre; } @@ -29,12 +29,28 @@ void Loup::action(void) { ++m_faim; // augmente la faim } - // Se déplace aléatoirement d'une case - deplacement(); - - // Mange un mouton si besoin - // TODO: `m_deposer_sediment` du mouton doit devenir `false` - /* TODO */ + // Le déplacement est différent du mouton, le loup + // va regarder toutes les cases autour de lui, s'il a faim il va pouvoir + // se déplacer vers une case où un mouton se trouve et le manger, s'il n'a + // pas faim alors il va se déplacer comme un mouton + if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) { // mange si besoin + std::vector cases_aux_alentours = casesAlentours(); + for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes + for(auto it: cases_aux_alentours) { // regarde toutes les cases aux alentours + if(organisme->position().first == it) { // si 1 organisme sur la position + if(auto proie = dynamic_cast(organisme)) { // si c'est un mouton + proie->m_deposer_sediment = false; + organisme->mortOrganisme(organisme->m_superposable); + m_faim = 0; + deplacement(proie->position().first); + break; + } + } + } + } + } else { + deplacement(); + } // S'accouple si besoin procreation(); diff --git a/src/mouton.cpp b/src/mouton.cpp index 00a0f9d..44a08a9 100644 --- a/src/mouton.cpp +++ b/src/mouton.cpp @@ -1,10 +1,10 @@ #include "../includes/mouton.hpp" -Mouton::Mouton(const int univers_ID): Animal(univers_ID, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1) { +Mouton::Mouton(const int univers_ID): Animal(univers_ID, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1, 1) { m_correspondance[ID] = _m_lettre; } -Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1) { +Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1, 1) { m_correspondance[ID] = _m_lettre; } @@ -32,12 +32,15 @@ void Mouton::action(void) { // Se déplace aléatoirement d'une case deplacement(); - for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes - if(organisme->position().first == m_index) { // si sur ma position - if(dynamic_cast(organisme)) { // si c'est de l'herbe - organisme->mortOrganisme(organisme->m_superposable);; - m_faim = 0; - break; + // Mange si besoin + if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) { + for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes + if(organisme->position().first == m_index) { // si 1 organisme sur ma position + if(dynamic_cast(organisme)) { // si c'est de l'herbe + organisme->mortOrganisme(organisme->m_superposable); + m_faim = 0; + break; + } } } }