Méthode casesPossible qui renvoie la liste des cases où peut aller l'animal

This commit is contained in:
Mylloon 2022-04-11 00:46:19 +02:00
parent 8c06ac5dde
commit 3d8e676cd8
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 102 additions and 0 deletions

View file

@ -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

View file

@ -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;
}