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:
parent
e6bca39e30
commit
bc0bb59c25
4 changed files with 39 additions and 19 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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`
|
||||||
|
|
|
@ -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
|
||||||
|
|
Reference in a new issue