diff --git a/includes/animal.hpp b/includes/animal.hpp index 0ad253c..1567ad9 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -28,6 +28,9 @@ class Animal: public Organisme { // Renvoie une vitesse aléatoire (+ élevé = + rapide) virtual int generationVitesse(void) const noexcept = 0; + // Renvoie la liste des cases accesible depuis la position de l'animal + std::vector casesPossible(void) const noexcept; + public: const int vitesse; // vitesse de l'organisme diff --git a/src/animal.cpp b/src/animal.cpp index 91a4f47..7c70cd2 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -1,4 +1,7 @@ #include "../includes/animal.hpp" +#include "../includes/univers.hpp" + +#include Animal::Animal(const int univers_ID, const int index, const int age_max, const int faim_max, const int p_vitesse): Organisme(univers_ID, false, index), @@ -13,3 +16,99 @@ Animal::Animal(const int univers_ID, const int age_max, vitesse(p_vitesse) { } Animal::~Animal(void) { } + +std::vector Animal::casesPossible(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); + } + } + + // 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); + } + } + + // 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); + } + } + + // 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); + } + } + + // 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); + } + } + + // 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); + } + } + + // 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); + } + } + + // 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); + } + } + + // On rajoute l'index actuel car l'animal peut décidé de rester sur place + vec.push_back(m_index); + + return vec; +}