Sépare les index libres pour les animaux du reste pour bien avoir m * n cases dispos

This commit is contained in:
Mylloon 2022-04-10 21:05:30 +02:00
parent ed2bfbb2a3
commit bc629b2374
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 45 additions and 20 deletions

View file

@ -20,11 +20,8 @@ class Organisme {
public: public:
const int ID; // ID unique pour chaque organisme const int ID; // ID unique pour chaque organisme
// ID de l'Univers, index dans l'univers // ID de l'Univers, type de l'organisme, index dans l'univers
Organisme(int, int); Organisme(int, bool = true, int = -1);
// ID de l'Univers (index aléatoire)
Organisme(int);
virtual ~Organisme(void); virtual ~Organisme(void);

View file

@ -1,13 +1,13 @@
#include "../includes/animal.hpp" #include "../includes/animal.hpp"
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): Organisme(univers_ID, index), const int faim_max, const int p_vitesse): Organisme(univers_ID, false, index),
m_age_max(age_max), m_age_max(age_max),
m_faim_max(faim_max), m_faim_max(faim_max),
vitesse(p_vitesse) { } 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): Organisme(univers_ID), const int faim_max, const int p_vitesse): Organisme(univers_ID, false),
m_age_max(age_max), m_age_max(age_max),
m_faim_max(faim_max), m_faim_max(faim_max),
vitesse(p_vitesse) { } vitesse(p_vitesse) { }

View file

@ -1,23 +1,49 @@
#include "../includes/univers.hpp" #include "../includes/univers.hpp"
#include "../includes/organisme.hpp" #include "../includes/organisme.hpp"
Organisme::Organisme(const int univers_ID, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) { Organisme::Organisme(const int univers_ID, const bool superposable, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) {
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres // S'il n'y a plus d'index de libres
throw std::domain_error("Trop d'organismes pour l'univers."); if(superposable) {
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) {
throw std::domain_error("Trop d'organismes \"superposable\" dans l'univers.");
}
} else {
if(Univers::m_index_libres_univers[m_univers_ID].second.size() == 0) {
throw std::domain_error("Trop d'organismes \"non-superposable\" dans l'univers.");
}
} }
m_total_ID = ID; // + 1 aux ID m_total_ID = ID; // + 1 aux ID
// Ajoute l'organisme à la liste des organismes de l'univers
Univers::m_organismes_univers[m_univers_ID].push_back(this); Univers::m_organismes_univers[m_univers_ID].push_back(this);
// Supprime l'index maintenant pris par un organisme // Assigne un index à l'organisme dans l'univers
if(superposable) {
if(index == -1) { // aléatoire si non-renseigné
m_index = Univers::m_index_libres_univers[univers_ID].first.back();
}
// Retire l'index de la liste des index libres (superposable)
auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin(); auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin();
auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end(); auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end();
auto it = std::find(debut, fin, index); auto it = std::find(debut, fin, m_index);
if(it != fin) { if(it != fin) {
Univers::m_index_libres_univers[m_univers_ID].first.erase(it); Univers::m_index_libres_univers[m_univers_ID].first.erase(it);
} }
} else {
if(index == -1) { // aléatoire si non-renseigné
m_index = Univers::m_index_libres_univers[univers_ID].second.back();
} }
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_index_libres_univers[univers_ID].first.back()) {} // Retire l'index de la liste des index libres (non-superposable)
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);
}
}
}
Organisme::~Organisme(void) { Organisme::~Organisme(void) {
// On remet notre index dans le vecteur des index vide // On remet notre index dans le vecteur des index vide

View file

@ -7,13 +7,15 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
ID(m_total_ID + 1) { ID(m_total_ID + 1) {
m_total_ID = ID; // + 1 aux ID m_total_ID = ID; // + 1 aux ID
// On ajoute tous les index possibles car pour l'instant le plateau est vide // On ajoute tous les index possibles car pour l'instant car le plateau est vide
for(int i = 0; i < m_taille_univers; ++i) { for(int i = 0; i < m_taille_univers; ++i) {
m_index_libres_univers[ID].first.push_back(i); m_index_libres_univers[ID].first.push_back(i);
m_index_libres_univers[ID].second.push_back(i);
} }
// On mélange notre vecteur d'index non occupés // On mélange nos vecteur d'index non occupés
melange(&m_index_libres_univers[ID].first); melange(&m_index_libres_univers[ID].first);
melange(&m_index_libres_univers[ID].second);
// Remplie quelques valeurs du tableau avec de l'herbe // Remplie quelques valeurs du tableau avec de l'herbe
while(m_index_libres_univers[ID].first.size() > static_cast<uint64_t>(m_taille_univers - m_taille_univers / 2)) { while(m_index_libres_univers[ID].first.size() > static_cast<uint64_t>(m_taille_univers - m_taille_univers / 2)) {