- Définition du repas tout les N tours dans la construction de l'animal
- Méthodes qui renvoie les cases aux alentours de l'animal
- Possibilité de déplacer un animal avec un index donné
- Loup mange mouton
- Ne peux pas manger si l'animal s'accouple
This commit is contained in:
Mylloon 2022-04-18 02:26:27 +02:00
parent c5589028f1
commit 374b8d8fd5
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
5 changed files with 102 additions and 83 deletions

View file

@ -33,20 +33,25 @@ class Animal: public Organisme {
Animal * m_partenaire = nullptr;
// 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;
// Définit les repas que doit prendre l'animal, par exemple
// 1 = 1 repas par tour
// 3 = 1 repas tout les 3 tours
const short m_repas_tt_les_cb_de_tours;
// Renvoie une vitesse aléatoire (+ élevé = + rapide)
virtual int generationVitesse(void) const noexcept = 0;
// Renvoie un genre choisit aléatoirement
int choixGenre(void) const noexcept;
// Renvoie la liste des cases atours de l'animal
std::vector<int> casesAlentours(void) const noexcept;
// Renvoie la liste des cases accesible depuis la position de l'animal
std::vector<int> casesPossible(void) const noexcept;
@ -55,16 +60,20 @@ class Animal: public Organisme {
// Déplace l'animal
void deplacement(void) noexcept;
void deplacement(int) noexcept;
public:
// Vrai si l'animal doit déposé des sédiment au sol à sa mort
bool m_deposer_sediment = true;
const int vitesse; // vitesse de l'organisme
// ID de l'univers, age max, faim max, vitesse, genre, rythme reproduction
Animal(int, int, int, int, int, int);
// ID de l'univers, index dans l'univers, age max, faim max, vitesse, genre, rythme reproduction
// ID de l'univers, age max, faim max, vitesse, genre, rythme reproduction, repas tout les n de tours
Animal(int, int, int, int, int, int, int);
// ID de l'univers, index dans l'univers, age max, faim max, vitesse, genre, rythme reproduction, repas tout les n de tours
Animal(int, int, int, int, int, int, int, int);
~Animal(void);
// Animal carnivore ?

View file

@ -2,6 +2,7 @@
#define ECOSYSTEME_LOUP_HPP 1
#include "animal.hpp"
#include "mouton.hpp"
class Loup: public Animal {
const char _m_lettre = 'L'; // caractère représentant le loup

View file

@ -2,18 +2,19 @@
Animal::Animal(const int univers_ID, const int index, const int age_max,
const int faim_max, const int p_vitesse, int p_genre,
int rythme_reproduction): Organisme(univers_ID, false, index),
int rythme_reproduction, int rtlcbdt): Organisme(univers_ID, false, index),
m_age_max(age_max), m_faim_max(faim_max),
genre(p_genre), m_attente_reproduction(rythme_reproduction),
vitesse(p_vitesse)
m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse)
{ }
Animal::Animal(const int univers_ID, const int age_max,
const int faim_max, const int p_vitesse,
int p_genre, int rythme_reproduction): Organisme(univers_ID, false),
int p_genre, int rythme_reproduction,
int rtlcbdt): Organisme(univers_ID, false),
m_age_max(age_max), m_faim_max(faim_max),
genre(p_genre), m_attente_reproduction(rythme_reproduction),
vitesse(p_vitesse)
m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse)
{ }
Animal::~Animal(void) {
@ -37,94 +38,79 @@ Animal::~Animal(void) {
}
}
std::vector<int> Animal::casesPossible(void) const noexcept {
std::vector<int> Animal::casesAlentours(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);
}
return vec;
}
std::vector<int> Animal::casesPossible(void) const noexcept {
std::vector<int> vec = casesAlentours();
// On retire ceux qui sont déjà occupés par un animal
// C'est à dire pas dans la liste 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 = vec.begin();
while(it != vec.end()) {
auto recherche = std::find(debut, fin, *it);
if(recherche == fin) { // si non-libre on supprime
vec.erase(it);
} else { // sinon on va à la prochaine position possible
++it;
}
}
return vec;
@ -138,23 +124,14 @@ int Animal::choixGenre(void) const noexcept {
return aleatoire(graine);
}
void Animal::deplacement(void) noexcept {
void Animal::deplacement(int index) 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))];
m_index = index;
// Retire la nouvel position du vecteur des index libre
auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin();
@ -166,3 +143,16 @@ void Animal::deplacement(void) noexcept {
}
}
void Animal::deplacement(void) noexcept {
// 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);
deplacement(cases_possible[static_cast<uint64_t>(aleatoire(graine))]);
}

View file

@ -1,10 +1,10 @@
#include "../includes/loup.hpp"
Loup::Loup(const int univers_ID): Animal(univers_ID, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3) {
Loup::Loup(const int univers_ID): Animal(univers_ID, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3, 4) {
m_correspondance[ID] = _m_lettre;
}
Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3) {
Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60, 10, Loup::generationVitesse(), Loup::choixGenre(), 3, 4) {
m_correspondance[ID] = _m_lettre;
}
@ -29,12 +29,28 @@ void Loup::action(void) {
++m_faim; // augmente la faim
}
// Se déplace aléatoirement d'une case
// Le déplacement est différent du mouton, le loup
// va regarder toutes les cases autour de lui, s'il a faim il va pouvoir
// se déplacer vers une case où un mouton se trouve et le manger, s'il n'a
// pas faim alors il va se déplacer comme un mouton
if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) { // mange si besoin
std::vector<int> cases_aux_alentours = casesAlentours();
for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes
for(auto it: cases_aux_alentours) { // regarde toutes les cases aux alentours
if(organisme->position().first == it) { // si 1 organisme sur la position
if(auto proie = dynamic_cast<Mouton *>(organisme)) { // si c'est un mouton
proie->m_deposer_sediment = false;
organisme->mortOrganisme(organisme->m_superposable);
m_faim = 0;
deplacement(proie->position().first);
break;
}
}
}
}
} else {
deplacement();
// Mange un mouton si besoin
// TODO: `m_deposer_sediment` du mouton doit devenir `false`
/* TODO */
}
// S'accouple si besoin
procreation<Loup>();

View file

@ -1,10 +1,10 @@
#include "../includes/mouton.hpp"
Mouton::Mouton(const int univers_ID): Animal(univers_ID, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1) {
Mouton::Mouton(const int univers_ID): Animal(univers_ID, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1, 1) {
m_correspondance[ID] = _m_lettre;
}
Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1) {
Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index, 50, 5, Mouton::generationVitesse(), Mouton::choixGenre(), 1, 1) {
m_correspondance[ID] = _m_lettre;
}
@ -32,15 +32,18 @@ void Mouton::action(void) {
// Se déplace aléatoirement d'une case
deplacement();
// Mange si besoin
if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) {
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 1 organisme sur ma position
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
organisme->mortOrganisme(organisme->m_superposable);;
organisme->mortOrganisme(organisme->m_superposable);
m_faim = 0;
break;
}
}
}
}
// S'accouple si besoin
procreation<Mouton>();