diff --git a/includes/animal.hpp b/includes/animal.hpp index 99a5d31..88954ad 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -41,6 +41,11 @@ class Animal: public Organisme { // 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; + // Renvoie une vitesse aléatoire (+ élevé = + rapide) virtual int generationVitesse(void) const noexcept = 0; @@ -50,13 +55,12 @@ class Animal: public Organisme { // Renvoie la liste des cases accesible depuis la position de l'animal std::vector casesPossible(void) const noexcept; + // Permet l'accouplement avec un autre animal template void procreation(void) noexcept; - 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éplace l'animal + void deplacement(void) noexcept; public: const int vitesse; // vitesse de l'organisme diff --git a/src/animal.cpp b/src/animal.cpp index dd5a701..6794378 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -127,9 +127,6 @@ std::vector Animal::casesPossible(void) const noexcept { } } - // On rajoute l'index actuel car l'animal peut décidé de rester sur place - vec.push_back(m_index); - return vec; } @@ -140,3 +137,32 @@ int Animal::choixGenre(void) const noexcept { return aleatoire(graine); } + +void Animal::deplacement(void) 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))]; + + // Retire la nouvel position du vecteur 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 = std::find(debut, fin, m_index); + if(it != fin) { + Univers::m_index_libres_univers[m_univers_ID].second.erase(it); + } + } + +} diff --git a/src/loup.cpp b/src/loup.cpp index 700c233..d19d735 100644 --- a/src/loup.cpp +++ b/src/loup.cpp @@ -22,12 +22,7 @@ bool Loup::carnivore(void) const noexcept { void Loup::action(void) { // Se déplace aléatoirement d'une case - std::vector cases_possible = this->casesPossible(); - std::random_device nombre_aleatoire; - std::default_random_engine graine(nombre_aleatoire()); - std::uniform_int_distribution aleatoire(0, cases_possible.size() - 1); - - m_index = cases_possible[static_cast(aleatoire(graine))]; + deplacement(); // Mange un mouton si besoin // TODO: `m_deposer_sediment` du mouton doit devenir `false` diff --git a/src/mouton.cpp b/src/mouton.cpp index 91ee17b..ebe6145 100644 --- a/src/mouton.cpp +++ b/src/mouton.cpp @@ -22,12 +22,7 @@ bool Mouton::carnivore(void) const noexcept { void Mouton::action(void) { // Se déplace aléatoirement d'une case - std::vector cases_possible = this->casesPossible(); - std::random_device nombre_aleatoire; - std::default_random_engine graine(nombre_aleatoire()); - std::uniform_int_distribution aleatoire(0, cases_possible.size() - 1); - - m_index = cases_possible[static_cast(aleatoire(graine))]; + 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