Méthode casesPossible qui renvoie la liste des cases où peut aller l'animal
This commit is contained in:
parent
8c06ac5dde
commit
3d8e676cd8
2 changed files with 102 additions and 0 deletions
|
@ -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<int> casesPossible(void) const noexcept;
|
||||
|
||||
public:
|
||||
const int vitesse; // vitesse de l'organisme
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
#include "../includes/animal.hpp"
|
||||
#include "../includes/univers.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
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<int> Animal::casesPossible(void) const noexcept {
|
||||
std::vector<int> 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;
|
||||
}
|
||||
|
|
Reference in a new issue