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
|
||||
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)
|
||||
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
|
||||
std::vector<int> casesPossible(void) const noexcept;
|
||||
|
||||
// Permet l'accouplement avec un autre animal
|
||||
template<typename Espece>
|
||||
void procreation(void) noexcept;
|
||||
|
||||
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éplace l'animal
|
||||
void deplacement(void) noexcept;
|
||||
|
||||
public:
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -140,3 +137,32 @@ int Animal::choixGenre(void) const noexcept {
|
|||
|
||||
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) {
|
||||
// Se déplace aléatoirement d'une case
|
||||
std::vector<int> cases_possible = this->casesPossible();
|
||||
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))];
|
||||
deplacement();
|
||||
|
||||
// Mange un mouton si besoin
|
||||
// TODO: `m_deposer_sediment` du mouton doit devenir `false`
|
||||
|
|
|
@ -22,12 +22,7 @@ bool Mouton::carnivore(void) const noexcept {
|
|||
|
||||
void Mouton::action(void) {
|
||||
// Se déplace aléatoirement d'une case
|
||||
std::vector<int> cases_possible = this->casesPossible();
|
||||
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))];
|
||||
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
|
||||
|
|
Reference in a new issue