Sépare les organismes présent dans l'univers et les index libres

This commit is contained in:
Mylloon 2022-04-10 20:36:07 +02:00
parent 49da1c0d43
commit ed2bfbb2a3
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
5 changed files with 28 additions and 24 deletions

View file

@ -17,7 +17,8 @@ class Univers {
const int m_longueur, m_largeur, m_taille_univers; // dimensions de l'univers
int m_tour; // âge de l'univers
inline static std::map<int, std::pair<int, int>> m_dimensions_univers; // Dimensions de l'univers (largeur, longueur)
// Stocke pour chaque ID d'univers les dimensions de l'univers (largeur, longueur)
inline static std::map<int, std::pair<int, int>> m_dimensions_univers;
inline static int m_total_ID; // s'incrémente à chaque création d'univers
@ -25,10 +26,13 @@ class Univers {
static void melange(std::vector<int> * vecteur);
public:
// Stocke pour chaque numéro d'univers :
// - les index libres (non occupés)
// - les organismes présent dans l'univers
inline static std::map<int, std::pair<std::vector<int>, std::vector<Organisme*>>> m_liste_univers;
// Stocke pour chaque ID d'univers les organismes présent dans l'univers
inline static std::map<int, std::vector<Organisme*>> m_organismes_univers;
// Stocke pour chaque ID d'univers les index libres
// first => organismes qui peuvent se superposer (herbe, sel...)
// second => organismes qui ne le peuvent pas (animaux)
inline static std::map<int, std::pair<std::vector<int>, std::vector<int>>> m_index_libres_univers;
const int ID; // ID unique pour chaque univers

View file

@ -28,7 +28,7 @@ void Evenement::affichage(Univers * univers, const bool traits) noexcept {
// On génère le plateau pour l'affichage
int * plateau = new int[univers->m_taille_univers]();
for(auto it: univers->m_liste_univers[univers->ID].second) {
for(auto it: univers->m_organismes_univers[univers->ID]) {
// Vérification : un animal doit avoir la priorité sur
// un autre organisme dans l'affichage
if(plateau[it->position(univers->ID).first] == 0) { // pas de souci, aucun organisme à cette position
@ -152,10 +152,10 @@ void Evenement::lancerSimulation(Univers * univers) {
// A la fin de chaque tour, on incrémente de 1 le nombre de tours
while(univers->enVie()) {
// On trie les organismes en fonction de leur vitesse
std::sort(univers->m_liste_univers[univers->ID].second.begin(), univers->m_liste_univers[univers->ID].second.end(), comp_organisme());
std::sort(univers->m_organismes_univers[univers->ID].begin(), univers->m_organismes_univers[univers->ID].end(), comp_organisme());
// Pour tout les organismes de notre univers
for(auto it: univers->m_liste_univers[univers->ID].second) {
for(auto it: univers->m_organismes_univers[univers->ID]) {
it->action(); // Fais ce qu'il a à faire pendant son tour
}

View file

@ -2,32 +2,32 @@
#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) {
if(Univers::m_liste_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres
throw std::domain_error("Trop d'organismes pour l'univers.");
}
m_total_ID = ID; // + 1 aux ID
Univers::m_liste_univers[m_univers_ID].second.push_back(this);
Univers::m_organismes_univers[m_univers_ID].push_back(this);
// Supprime l'index maintenant pris par un organisme
auto debut = Univers::m_liste_univers[m_univers_ID].first.begin();
auto fin = Univers::m_liste_univers[m_univers_ID].first.end();
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 it = std::find(debut, fin, index);
if(it != fin) {
Univers::m_liste_univers[m_univers_ID].first.erase(it);
Univers::m_index_libres_univers[m_univers_ID].first.erase(it);
}
}
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_liste_univers[univers_ID].first.back()) {}
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_index_libres_univers[univers_ID].first.back()) {}
Organisme::~Organisme(void) {
// On remet notre index dans le vecteur des index vide
Univers::m_liste_univers[m_univers_ID].first.push_back(m_index);
Univers::m_index_libres_univers[m_univers_ID].first.push_back(m_index);
// Attention: si l'organisme meurt après avoir été mangé, il faut bien faire
// attention que l'index libre soit véritablement libre et pas qu'il soit enfaite
// prit par l'assassin de notre organisme actuel
// On remélange notre vecteur
Univers::melange(&Univers::m_liste_univers[m_univers_ID].first);
Univers::melange(&Univers::m_index_libres_univers[m_univers_ID].first);
}
char Organisme::lettre(const int id) noexcept {

View file

@ -11,11 +11,11 @@ Sel::Sel(const int univers_ID): Organisme(univers_ID) {
Sel::~Sel(void) {
// On se supprime du vecteur
auto debut = Univers::m_liste_univers[m_univers_ID].second.begin();
auto fin = Univers::m_liste_univers[m_univers_ID].second.end();
auto debut = Univers::m_organismes_univers[m_univers_ID].begin();
auto fin = Univers::m_organismes_univers[m_univers_ID].end();
auto it = std::find(debut, fin, this);
if(it != fin) {
Univers::m_liste_univers[m_univers_ID].second.erase(it);
Univers::m_organismes_univers[m_univers_ID].erase(it);
}
// On ajoute une herbe à la place

View file

@ -9,14 +9,14 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
// On ajoute tous les index possibles car pour l'instant le plateau est vide
for(int i = 0; i < m_taille_univers; ++i) {
m_liste_univers[ID].first.push_back(i);
m_index_libres_univers[ID].first.push_back(i);
}
// On mélange notre vecteur d'index non occupés
melange(&m_liste_univers[ID].first);
melange(&m_index_libres_univers[ID].first);
// Remplie quelques valeurs du tableau avec de l'herbe
while(m_liste_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)) {
// cast static grâce à "-Wold-style-cast" et "-Wsign-conversion"
new Herbe(ID);
}
@ -26,7 +26,7 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
}
Univers::~Univers(void) {
for(auto it: m_liste_univers[ID].second) { // Supprime les organismes présent dans l'univers
for(auto it: m_organismes_univers[ID]) { // Supprime les organismes présent dans l'univers
delete it;
}
}
@ -38,7 +38,7 @@ void Univers::melange(std::vector<int> * vecteur) {
}
bool Univers::enVie(void) const noexcept {
for(auto organisme: m_liste_univers[ID].second) { // on parcours les organismes de notre univers
for(auto organisme: m_organismes_univers[ID]) { // on parcours les organismes de notre univers
if(dynamic_cast<Animal *>(organisme)) { // si c'est un animal
return true; // renvoie true
}