Déplacement des fonctions/méthodes d'évènement dans une classe spécialisée
This commit is contained in:
parent
eec1524b79
commit
32de6b9498
4 changed files with 152 additions and 136 deletions
143
includes/evenement.hpp
Normal file
143
includes/evenement.hpp
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
#ifndef ECOSYSTEME_EVENEMENT_HPP
|
||||||
|
#define ECOSYSTEME_EVENEMENT_HPP 1
|
||||||
|
|
||||||
|
#include "../includes/univers.hpp"
|
||||||
|
#include "../includes/mouton.hpp"
|
||||||
|
#include "../includes/loup.hpp"
|
||||||
|
|
||||||
|
struct Evenement {
|
||||||
|
Evenement() = delete;
|
||||||
|
|
||||||
|
// Créer un univers pour préparer la simulation
|
||||||
|
static inline void creationSimulation(Univers ** univers, const int m, const int n, int nb_moutons, int nb_loups) {
|
||||||
|
*univers = new Univers(m, n);
|
||||||
|
|
||||||
|
while(nb_moutons > 0) { // Création des moutons dans l'univers
|
||||||
|
new Mouton((*univers)->ID);
|
||||||
|
nb_moutons--;
|
||||||
|
}
|
||||||
|
while(nb_loups > 0) { // Création des loups dans l'univers
|
||||||
|
new Loup((*univers)->ID);
|
||||||
|
nb_loups--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lance la simulation pour un univers
|
||||||
|
static inline void lancerSimulation(Univers *) { }
|
||||||
|
|
||||||
|
// Arrête la simulation d'un univers
|
||||||
|
static inline void arreterSimulation(Univers * univers) {
|
||||||
|
delete univers;
|
||||||
|
univers = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affiche un univers, possibilité d'afficher les
|
||||||
|
// traits séparant les valeurs du tableaux (par défaut : non)
|
||||||
|
static inline void affichage(Univers * univers, const bool traits = false) 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) {
|
||||||
|
plateau[it->position(univers->ID).first] = it->ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
int largeur_affichage = univers->m_largeur * 4;
|
||||||
|
|
||||||
|
// On affiche les coordonées type "échequier" seulement
|
||||||
|
// si on a assez de lettre et que le nombre est inférieur à 100 (3 caractères)
|
||||||
|
char echequier = 0;
|
||||||
|
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) {
|
||||||
|
std::cout << " "; // espace du début
|
||||||
|
for(int i = 0; i < univers->m_largeur; ++i) { // pour toute la largeur
|
||||||
|
if(i < 9 && univers->m_largeur > 9) { // si on affiche + 9 nombres on ajoute
|
||||||
|
// un 0 au 9 premiers
|
||||||
|
std::cout << "0";
|
||||||
|
} else {
|
||||||
|
if (i < 9) { // sinon si on affiche que max 9 nombres on met un espace
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << static_cast<int>(echequier++) + 1 << " "; // cast en int
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
echequier = 'A';
|
||||||
|
|
||||||
|
for(int i = 0; i < largeur_affichage; ++i) {
|
||||||
|
if(i == 0) { // coin supérieur gauche
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) { // espace si il faut afficher l'echequier
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
std::cout << "┌";
|
||||||
|
} else { // haut
|
||||||
|
std::cout << "─";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << "┐" << std::endl; // coin supérieur droit
|
||||||
|
|
||||||
|
// premier côté gauche
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) { // espace pour l'alignement du tableau si nécessaire
|
||||||
|
std::cout << echequier++ << " ";
|
||||||
|
}
|
||||||
|
std::cout << "│ ";
|
||||||
|
|
||||||
|
for(int i = 0; i < univers->m_taille_univers; i += univers->m_largeur) {
|
||||||
|
for(int j = 0; j < univers->m_largeur; ++j) {
|
||||||
|
std::cout << Organisme::lettre(plateau[i + j]);
|
||||||
|
if(j == univers->m_largeur - 1) {
|
||||||
|
std::cout << " │ "; // côté droit
|
||||||
|
} else { // espace dans le tableau
|
||||||
|
if(traits) {
|
||||||
|
std::cout << " ┊ ";
|
||||||
|
} else {
|
||||||
|
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i != univers->m_taille_univers - univers->m_largeur) {
|
||||||
|
std::cout << std::endl;
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) {
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ligne vide
|
||||||
|
std::cout << "│";
|
||||||
|
if(traits) {
|
||||||
|
for(int j = 0; j < univers->m_largeur - 1; ++j) {
|
||||||
|
std::cout << "---+";
|
||||||
|
}
|
||||||
|
std::cout << "---";
|
||||||
|
} else {
|
||||||
|
std::cout << std::string(static_cast<uint64_t>(largeur_affichage - 1), ' '); // saut de ligne et remplissage
|
||||||
|
// de la ligne de vide pour y mettre
|
||||||
|
// le caractère fermant le tableau
|
||||||
|
}
|
||||||
|
std::cout << "│" << std::endl;
|
||||||
|
|
||||||
|
// saut de ligne et suite du côté gauche
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) {
|
||||||
|
std::cout << echequier++ << " ";
|
||||||
|
}
|
||||||
|
std::cout << "│ ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
for(int i = 0; i < largeur_affichage; ++i) {
|
||||||
|
if(i == 0) {
|
||||||
|
if(univers->m_longueur <= 26 && univers->m_largeur < 100) { // espace si il faut afficher l'echequier
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
std::cout << "└"; // coin inférieur gauche
|
||||||
|
} else {
|
||||||
|
std::cout << "─"; // bas
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << "┘" << std::endl; // coin inférieur droit
|
||||||
|
|
||||||
|
delete[] plateau;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
class Univers {
|
class Univers {
|
||||||
friend class Organisme;
|
friend class Organisme;
|
||||||
|
friend class Evenement;
|
||||||
|
|
||||||
const int m_longueur, m_largeur, m_taille_univers; // dimensions de l'univers
|
const int m_longueur, m_largeur, m_taille_univers; // dimensions de l'univers
|
||||||
int m_tour; // âge de l'univers
|
int m_tour; // âge de l'univers
|
||||||
|
@ -36,11 +37,6 @@ class Univers {
|
||||||
|
|
||||||
~Univers(void);
|
~Univers(void);
|
||||||
|
|
||||||
// Affiche l'univers à l'instant présent, possibilité
|
|
||||||
// d'afficher les traits séparant les valeurs du
|
|
||||||
// tableaux, non par défaut
|
|
||||||
void affichage(bool = false) const noexcept;
|
|
||||||
|
|
||||||
// Vérifie s'il y a de la vie dans l'univers
|
// Vérifie s'il y a de la vie dans l'univers
|
||||||
bool enVie(void) const noexcept;
|
bool enVie(void) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
33
src/main.cpp
33
src/main.cpp
|
@ -1,26 +1,5 @@
|
||||||
#include "../includes/univers.hpp"
|
#include "../includes/univers.hpp"
|
||||||
#include "../includes/mouton.hpp"
|
#include "../includes/evenement.hpp"
|
||||||
#include "../includes/loup.hpp"
|
|
||||||
|
|
||||||
// Lance la simulation pour un univers
|
|
||||||
void lancerSimulation(Univers ** univers, const int m, const int n, int nb_moutons, int nb_loups) {
|
|
||||||
*univers = new Univers(m, n);
|
|
||||||
|
|
||||||
while(nb_moutons > 0) { // Création des moutons dans l'univers
|
|
||||||
new Mouton((*univers)->ID);
|
|
||||||
nb_moutons--;
|
|
||||||
}
|
|
||||||
while(nb_loups > 0) { // Création des loups dans l'univers
|
|
||||||
new Loup((*univers)->ID);
|
|
||||||
nb_loups--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arrête la simulation d'un univers
|
|
||||||
void arreterSimulation(Univers * univers) {
|
|
||||||
delete univers;
|
|
||||||
univers = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// m x n = taille de l'univers
|
// m x n = taille de l'univers
|
||||||
// nb_moutons = nombre de moutons
|
// nb_moutons = nombre de moutons
|
||||||
|
@ -46,11 +25,15 @@ int main(int argc, char const *argv[]) {
|
||||||
|
|
||||||
Univers * univers = nullptr;
|
Univers * univers = nullptr;
|
||||||
try {
|
try {
|
||||||
lancerSimulation(&univers, m, n, nb_moutons, nb_loups);
|
Evenement::creationSimulation(&univers, m, n, nb_moutons, nb_loups);
|
||||||
|
|
||||||
univers->affichage();
|
Evenement::affichage(univers);
|
||||||
|
|
||||||
arreterSimulation(univers);
|
Evenement::lancerSimulation(univers);
|
||||||
|
|
||||||
|
Evenement::affichage(univers);
|
||||||
|
|
||||||
|
Evenement::arreterSimulation(univers);
|
||||||
} catch(const std::exception& e) {
|
} catch(const std::exception& e) {
|
||||||
std::cerr << e.what() << std::endl;
|
std::cerr << e.what() << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
106
src/univers.cpp
106
src/univers.cpp
|
@ -37,112 +37,6 @@ void Univers::melange(std::vector<int> * vecteur) {
|
||||||
std::shuffle(vecteur->begin(), vecteur->end(), graine);
|
std::shuffle(vecteur->begin(), vecteur->end(), graine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Univers::affichage(bool traits) const noexcept {
|
|
||||||
// On génère le plateau pour l'affichage
|
|
||||||
int * plateau = new int[m_taille_univers]();
|
|
||||||
for(auto it: m_liste_univers[ID].second) {
|
|
||||||
plateau[it->position(ID).first] = it->ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
int largeur_affichage = m_largeur * 4;
|
|
||||||
|
|
||||||
// On affiche les coordonées type "échequier" seulement
|
|
||||||
// si on a assez de lettre et que le nombre est inférieur à 100 (3 caractères)
|
|
||||||
char echequier = 0;
|
|
||||||
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) {
|
|
||||||
std::cout << " "; // espace du début
|
|
||||||
for(int i = 0; i < m_largeur; ++i) { // pour toute la largeur
|
|
||||||
if(i < 9 && m_largeur > 9) { // si on affiche + 9 nombres on ajoute
|
|
||||||
// un 0 au 9 premiers
|
|
||||||
std::cout << "0";
|
|
||||||
} else {
|
|
||||||
if (i < 9) { // sinon si on affiche que max 9 nombres on met un espace
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cout << static_cast<int>(echequier++) + 1 << " "; // cast en int
|
|
||||||
}
|
|
||||||
std::cout << std::endl;
|
|
||||||
}
|
|
||||||
echequier = 'A';
|
|
||||||
|
|
||||||
for(int i = 0; i < largeur_affichage; ++i) {
|
|
||||||
if(i == 0) { // coin supérieur gauche
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) { // espace si il faut afficher l'echequier
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
std::cout << "┌";
|
|
||||||
} else { // haut
|
|
||||||
std::cout << "─";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cout << "┐" << std::endl; // coin supérieur droit
|
|
||||||
|
|
||||||
// premier côté gauche
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) { // espace pour l'alignement du tableau si nécessaire
|
|
||||||
std::cout << echequier++ << " ";
|
|
||||||
}
|
|
||||||
std::cout << "│ ";
|
|
||||||
|
|
||||||
for(int i = 0; i < m_taille_univers; i += m_largeur) {
|
|
||||||
for(int j = 0; j < m_largeur; ++j) {
|
|
||||||
std::cout << Organisme::lettre(plateau[i + j]);
|
|
||||||
if(j == m_largeur - 1) {
|
|
||||||
std::cout << " │ "; // côté droit
|
|
||||||
} else { // espace dans le tableau
|
|
||||||
if(traits) {
|
|
||||||
std::cout << " ┊ ";
|
|
||||||
} else {
|
|
||||||
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(i != m_taille_univers - m_largeur) {
|
|
||||||
std::cout << std::endl;
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) {
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ligne vide
|
|
||||||
std::cout << "│";
|
|
||||||
if(traits) {
|
|
||||||
for(int j = 0; j < m_largeur - 1; ++j) {
|
|
||||||
std::cout << "---+";
|
|
||||||
}
|
|
||||||
std::cout << "---";
|
|
||||||
} else {
|
|
||||||
std::cout << std::string(static_cast<uint64_t>(largeur_affichage - 1), ' '); // saut de ligne et remplissage
|
|
||||||
// de la ligne de vide pour y mettre
|
|
||||||
// le caractère fermant le tableau
|
|
||||||
}
|
|
||||||
std::cout << "│" << std::endl;
|
|
||||||
|
|
||||||
// saut de ligne et suite du côté gauche
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) {
|
|
||||||
std::cout << echequier++ << " ";
|
|
||||||
}
|
|
||||||
std::cout << "│ ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << std::endl;
|
|
||||||
for(int i = 0; i < largeur_affichage; ++i) {
|
|
||||||
if(i == 0) {
|
|
||||||
if(m_longueur <= 26 && m_largeur < 100) { // espace si il faut afficher l'echequier
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
std::cout << "└"; // coin inférieur gauche
|
|
||||||
} else {
|
|
||||||
std::cout << "─"; // bas
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cout << "┘" << std::endl; // coin inférieur droit
|
|
||||||
|
|
||||||
delete[] plateau;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Univers::enVie(void) const noexcept {
|
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_liste_univers[ID].second) { // on parcours les organismes de notre univers
|
||||||
if(organisme->animal()) { // si on a un animal
|
if(organisme->animal()) { // si on a un animal
|
||||||
|
|
Reference in a new issue