This repository has been archived on 2022-05-02. You can view files and clone it, but cannot push or open issues or pull requests.
Ecosysteme/includes/evenement.hpp

144 lines
5.4 KiB
C++
Raw Normal View History

#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