Ajouts
- 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:
parent
c5589028f1
commit
374b8d8fd5
5 changed files with 102 additions and 83 deletions
|
@ -33,20 +33,25 @@ class Animal: public Organisme {
|
||||||
|
|
||||||
Animal * m_partenaire = nullptr;
|
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
|
const int genre; // genre, 0 = masculin, 1 = féminin
|
||||||
|
|
||||||
// Nombre de tour a attendre avant de pouvoir se reproduire de nouveau
|
// Nombre de tour a attendre avant de pouvoir se reproduire de nouveau
|
||||||
const short m_attente_reproduction;
|
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)
|
// Renvoie une vitesse aléatoire (+ élevé = + rapide)
|
||||||
virtual int generationVitesse(void) const noexcept = 0;
|
virtual int generationVitesse(void) const noexcept = 0;
|
||||||
|
|
||||||
// Renvoie un genre choisit aléatoirement
|
// Renvoie un genre choisit aléatoirement
|
||||||
int choixGenre(void) const noexcept;
|
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
|
// 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;
|
||||||
|
|
||||||
|
@ -55,16 +60,20 @@ class Animal: public Organisme {
|
||||||
|
|
||||||
// Déplace l'animal
|
// Déplace l'animal
|
||||||
void deplacement(void) noexcept;
|
void deplacement(void) noexcept;
|
||||||
|
void deplacement(int) noexcept;
|
||||||
|
|
||||||
public:
|
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
|
const int vitesse; // vitesse de l'organisme
|
||||||
|
|
||||||
// ID de 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);
|
|
||||||
|
|
||||||
// ID de l'univers, index dans l'univers, age max, faim max, vitesse, genre, rythme reproduction
|
|
||||||
Animal(int, int, int, int, int, int, int);
|
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(void);
|
||||||
|
|
||||||
// Animal carnivore ?
|
// Animal carnivore ?
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define ECOSYSTEME_LOUP_HPP 1
|
#define ECOSYSTEME_LOUP_HPP 1
|
||||||
|
|
||||||
#include "animal.hpp"
|
#include "animal.hpp"
|
||||||
|
#include "mouton.hpp"
|
||||||
|
|
||||||
class Loup: public Animal {
|
class Loup: public Animal {
|
||||||
const char _m_lettre = 'L'; // caractère représentant le loup
|
const char _m_lettre = 'L'; // caractère représentant le loup
|
||||||
|
|
110
src/animal.cpp
110
src/animal.cpp
|
@ -2,18 +2,19 @@
|
||||||
|
|
||||||
Animal::Animal(const int univers_ID, const int index, const int age_max,
|
Animal::Animal(const int univers_ID, const int index, const int age_max,
|
||||||
const int faim_max, const int p_vitesse, int p_genre,
|
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),
|
m_age_max(age_max), m_faim_max(faim_max),
|
||||||
genre(p_genre), m_attente_reproduction(rythme_reproduction),
|
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,
|
Animal::Animal(const int univers_ID, const int age_max,
|
||||||
const int faim_max, const int p_vitesse,
|
const int faim_max, const int p_vitesse,
|
||||||
int p_genre, int rythme_reproduction): Organisme(univers_ID, false),
|
int p_genre, int rythme_reproduction,
|
||||||
m_age_max(age_max), m_faim_max(faim_max),
|
int rtlcbdt): Organisme(univers_ID, false),
|
||||||
genre(p_genre), m_attente_reproduction(rythme_reproduction),
|
m_age_max(age_max), m_faim_max(faim_max),
|
||||||
vitesse(p_vitesse)
|
genre(p_genre), m_attente_reproduction(rythme_reproduction),
|
||||||
|
m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
Animal::~Animal(void) {
|
Animal::~Animal(void) {
|
||||||
|
@ -37,93 +38,78 @@ Animal::~Animal(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> Animal::casesPossible(void) const noexcept {
|
std::vector<int> Animal::casesAlentours(void) const noexcept {
|
||||||
std::vector<int> vec;
|
std::vector<int> vec;
|
||||||
|
|
||||||
int longueur_univers = Univers::m_dimensions_univers[m_univers_ID].first,
|
int longueur_univers = Univers::m_dimensions_univers[m_univers_ID].first,
|
||||||
taille_max_univers = longueur_univers * Univers::m_dimensions_univers[m_univers_ID].second,
|
taille_max_univers = longueur_univers * Univers::m_dimensions_univers[m_univers_ID].second,
|
||||||
i;
|
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
|
// En haut à gauche
|
||||||
i = m_index - longueur_univers - 1;
|
i = m_index - longueur_univers - 1;
|
||||||
if(i >= 0 && i % longueur_univers < longueur_univers - 1) {
|
if(i >= 0 && i % longueur_univers < longueur_univers - 1) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// En haut
|
// En haut
|
||||||
i = m_index - longueur_univers;
|
i = m_index - longueur_univers;
|
||||||
if(i >= 0) {
|
if(i >= 0) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// En haut à droite
|
// En haut à droite
|
||||||
i = m_index - longueur_univers + 1;
|
i = m_index - longueur_univers + 1;
|
||||||
if(i >= 0 && i % longueur_univers != 0) {
|
if(i >= 0 && i % longueur_univers != 0) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// A gauche
|
// A gauche
|
||||||
i = m_index - 1;
|
i = m_index - 1;
|
||||||
if(i >= 0 && i % longueur_univers < longueur_univers - 1) {
|
if(i >= 0 && i % longueur_univers < longueur_univers - 1) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// A droite
|
// A droite
|
||||||
i = m_index + 1;
|
i = m_index + 1;
|
||||||
if(i < taille_max_univers && i % longueur_univers != 0) {
|
if(i < taille_max_univers && i % longueur_univers != 0) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// En bas à gauche
|
// En bas à gauche
|
||||||
i = m_index + longueur_univers - 1;
|
i = m_index + longueur_univers - 1;
|
||||||
if(i < taille_max_univers && i % longueur_univers < 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
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// En bas
|
// En bas
|
||||||
i = m_index + longueur_univers;
|
i = m_index + longueur_univers;
|
||||||
if(i < taille_max_univers) {
|
if(i < taille_max_univers) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
auto it = std::find(debut, fin, i);
|
|
||||||
if(it != fin) {
|
|
||||||
vec.push_back(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// En bas à droite
|
// En bas à droite
|
||||||
i = m_index + longueur_univers + 1;
|
i = m_index + longueur_univers + 1;
|
||||||
if(i < taille_max_univers && i % longueur_univers != 0) {
|
if(i < taille_max_univers && i % longueur_univers != 0) {
|
||||||
// On retire ceux qui sont déjà occupés par un animal
|
vec.push_back(i);
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,23 +124,14 @@ int Animal::choixGenre(void) const noexcept {
|
||||||
return aleatoire(graine);
|
return aleatoire(graine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Animal::deplacement(void) noexcept {
|
void Animal::deplacement(int index) noexcept {
|
||||||
// Si l'animal n'est pas entrain de s'accoupler
|
// Si l'animal n'est pas entrain de s'accoupler
|
||||||
if(m_partenaire == nullptr) {
|
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
|
// Ajoute l'index actuel au vecteurs des index libres
|
||||||
Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index);
|
Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index);
|
||||||
|
|
||||||
// Déplace l'animal
|
// 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
|
// Retire la nouvel position du vecteur des index libre
|
||||||
auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin();
|
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))]);
|
||||||
|
}
|
||||||
|
|
32
src/loup.cpp
32
src/loup.cpp
|
@ -1,10 +1,10 @@
|
||||||
#include "../includes/loup.hpp"
|
#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;
|
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;
|
m_correspondance[ID] = _m_lettre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,12 +29,28 @@ void Loup::action(void) {
|
||||||
++m_faim; // augmente la faim
|
++m_faim; // augmente la faim
|
||||||
}
|
}
|
||||||
|
|
||||||
// Se déplace aléatoirement d'une case
|
// Le déplacement est différent du mouton, le loup
|
||||||
deplacement();
|
// 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
|
||||||
// Mange un mouton si besoin
|
// pas faim alors il va se déplacer comme un mouton
|
||||||
// TODO: `m_deposer_sediment` du mouton doit devenir `false`
|
if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) { // mange si besoin
|
||||||
/* TODO */
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
// S'accouple si besoin
|
// S'accouple si besoin
|
||||||
procreation<Loup>();
|
procreation<Loup>();
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#include "../includes/mouton.hpp"
|
#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;
|
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;
|
m_correspondance[ID] = _m_lettre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,12 +32,15 @@ void Mouton::action(void) {
|
||||||
// Se déplace aléatoirement d'une case
|
// Se déplace aléatoirement d'une case
|
||||||
deplacement();
|
deplacement();
|
||||||
|
|
||||||
for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes
|
// Mange si besoin
|
||||||
if(organisme->position().first == m_index) { // si sur ma position
|
if(m_faim >= m_repas_tt_les_cb_de_tours && m_partenaire == nullptr) {
|
||||||
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes
|
||||||
organisme->mortOrganisme(organisme->m_superposable);;
|
if(organisme->position().first == m_index) { // si 1 organisme sur ma position
|
||||||
m_faim = 0;
|
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
||||||
break;
|
organisme->mortOrganisme(organisme->m_superposable);
|
||||||
|
m_faim = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue