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;
|
||||
|
||||
// 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 ?
|
||||
|
|
|
@ -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
|
||||
|
|
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,
|
||||
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),
|
||||
m_age_max(age_max), m_faim_max(faim_max),
|
||||
genre(p_genre), m_attente_reproduction(rythme_reproduction),
|
||||
vitesse(p_vitesse)
|
||||
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),
|
||||
m_repas_tt_les_cb_de_tours(rtlcbdt), vitesse(p_vitesse)
|
||||
{ }
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
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))]);
|
||||
}
|
||||
|
|
32
src/loup.cpp
32
src/loup.cpp
|
@ -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
|
||||
deplacement();
|
||||
|
||||
// Mange un mouton si besoin
|
||||
// TODO: `m_deposer_sediment` du mouton doit devenir `false`
|
||||
/* TODO */
|
||||
// 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();
|
||||
}
|
||||
|
||||
// S'accouple si besoin
|
||||
procreation<Loup>();
|
||||
|
|
|
@ -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,12 +32,15 @@ void Mouton::action(void) {
|
|||
// Se déplace aléatoirement d'une case
|
||||
deplacement();
|
||||
|
||||
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(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
||||
organisme->mortOrganisme(organisme->m_superposable);;
|
||||
m_faim = 0;
|
||||
break;
|
||||
// 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 1 organisme sur ma position
|
||||
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
||||
organisme->mortOrganisme(organisme->m_superposable);
|
||||
m_faim = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue