Appel d'une méthode de déplacement pour tout les animaux, gère correctement le vecteur des index libre à chaque déplacement

This commit is contained in:
Mylloon 2022-04-13 17:03:18 +02:00
parent e6bca39e30
commit bc0bb59c25
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 39 additions and 19 deletions

View file

@ -41,6 +41,11 @@ class Animal: public Organisme {
// Vrai si l'animal doit déposé des sédiment au sol à sa mort // Vrai si l'animal doit déposé des sédiment au sol à sa mort
bool m_deposer_sediment = true; 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) // Renvoie une vitesse aléatoire (+ élevé = + rapide)
virtual int generationVitesse(void) const noexcept = 0; 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 // Renvoie la liste des cases accesible depuis la position de l'animal
std::vector<int> casesPossible(void) const noexcept; std::vector<int> casesPossible(void) const noexcept;
// Permet l'accouplement avec un autre animal
template<typename Espece> template<typename Espece>
void procreation(void) noexcept; void procreation(void) noexcept;
const int genre; // genre, 0 = masculin, 1 = féminin // Déplace l'animal
void deplacement(void) noexcept;
// Nombre de tour a attendre avant de pouvoir se reproduire de nouveau
const short m_attente_reproduction;
public: public:
const int vitesse; // vitesse de l'organisme const int vitesse; // vitesse de l'organisme

View file

@ -127,9 +127,6 @@ std::vector<int> 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; return vec;
} }
@ -140,3 +137,32 @@ int Animal::choixGenre(void) const noexcept {
return aleatoire(graine); 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<int> 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<int> 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<uint64_t>(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);
}
}
}

View file

@ -22,12 +22,7 @@ bool Loup::carnivore(void) const noexcept {
void Loup::action(void) { void Loup::action(void) {
// Se déplace aléatoirement d'une case // Se déplace aléatoirement d'une case
std::vector<int> cases_possible = this->casesPossible(); deplacement();
std::random_device nombre_aleatoire;
std::default_random_engine graine(nombre_aleatoire());
std::uniform_int_distribution<int> aleatoire(0, cases_possible.size() - 1);
m_index = cases_possible[static_cast<uint64_t>(aleatoire(graine))];
// Mange un mouton si besoin // Mange un mouton si besoin
// TODO: `m_deposer_sediment` du mouton doit devenir `false` // TODO: `m_deposer_sediment` du mouton doit devenir `false`

View file

@ -22,12 +22,7 @@ bool Mouton::carnivore(void) const noexcept {
void Mouton::action(void) { void Mouton::action(void) {
// Se déplace aléatoirement d'une case // Se déplace aléatoirement d'une case
std::vector<int> cases_possible = this->casesPossible(); deplacement();
std::random_device nombre_aleatoire;
std::default_random_engine graine(nombre_aleatoire());
std::uniform_int_distribution<int> aleatoire(0, cases_possible.size() - 1);
m_index = cases_possible[static_cast<uint64_t>(aleatoire(graine))];
for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes 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(organisme->position().first == m_index) { // si sur ma position