GOL
Game Of Life
Loading...
Searching...
No Matches
D:/Drive/Professionnel/ETS/Enseignement/GPA675/2024_01_Hiver/lab/01/GPA675Lab1App/GOLEngine/GOL.h
1#pragma once
2#ifndef GOL_INTERFACE_H
3#define GOL_INTERFACE_H
4
5
6#include <string>
7#include <vector>
8#include <optional>
9
10
11//
12// ___ __ __ ____ ___ ____ _____ _ _ _ _____
13// |_ _| \/ | _ \ / _ \| _ \_ _|/ \ | \ | |_ _|
14// | || |\/| | |_) | | | | |_) || | / _ \ | \| | | |
15// | || | | | __/| |_| | _ < | |/ ___ \| |\ | | |
16// |___|_| |_|_| \___/|_| \_\|_/_/ \_\_| \_| |_|
17//
18//
19// Attention, vous ne pouvez pas modifier ce fichier.
20//
21
22
23
123class GOL
124{
125public:
126 // ____ __ __ _ _ _ _ _ _
127 // | _ \ /_/ / _(_)_ __ (_) |_(_) ___ _ __ __| | ___ ___ | |_ _ _ _ __ ___ ___
128 // | | | |/ _ \ |_| | '_ \| | __| |/ _ \| '_ \ / _` |/ _ \/ __| | __| | | | '_ \ / _ \/ __|
129 // | |_| | __/ _| | | | | | |_| | (_) | | | | | (_| | __/\__ \ | |_| |_| | |_) | __/\__ \
130 // |____/ \___|_| |_|_| |_|_|\__|_|\___/|_| |_| \__,_|\___||___/ \__|\__, | .__/ \___||___/
131 // |___/|_|
132 //
135 enum class State : uint8_t {
136 dead = 0,
137 alive = 1,
138 };
139 //
142 using IterationType = uint32_t;
143 //
150 enum class BorderManagement : uint8_t {
151 immutableAsIs = 0,
154 warping,
155 mirror,
156 };
157 //
160 using ColorChannelType = uint8_t;
161 //
169 //
186 struct Statistics {
187 std::optional<std::string> rule;
188 std::optional<BorderManagement> borderManagement;
189 std::optional<size_t> width;
190 std::optional<size_t> height;
191 std::optional<size_t> totalCells;
192 std::optional<IterationType> iteration;
193 std::optional<size_t> totalDeadAbs;
194 std::optional<size_t> totalAliveAbs;
195 std::optional<float> totalDeadRel;
196 std::optional<float> totalAliveRel;
197 std::optional<int> tendencyAbs;
198 std::optional<float> tendencyRel;
199 };
200 //
203 struct Author {
204 std::string lastName;
205 std::string firstName;
206 std::string studentEmail;
207 };
208 //
219 std::string title;
220 std::vector<Author> authors;
221 std::vector<std::string> answers;
222 std::vector<std::string> optionnalComments;
223 };
224
225
226
227 //
228 // ____ _ _ __ ____ _ _
229 // / ___|___ _ __ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __ ___ / / | _ \ ___ ___| |_ _ __ _ _ ___| |_ ___ _ _ _ __
230 // | | / _ \| '_ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__/ __| / / | | | |/ _ \/ __| __| '__| | | |/ __| __/ _ \ | | | '__|
231 // | |__| (_) | | | \__ \ |_| | | |_| | (__| || __/ |_| | | \__ \ / / | |_| | __/\__ \ |_| | | |_| | (__| || __/ |_| | |
232 // \____\___/|_| |_|___/\__|_| \__,_|\___|\__\___|\__,_|_| |___/ /_/ |____/ \___||___/\__|_| \__,_|\___|\__\___|\__,_|_|
233 //
234 //
235 // Les classes héritant de GOL doivent réaliser :
236 // - le constructeur par défaut : _class_()
237 // - le constructeur d'initialisation proposé : _class_(size_t width, size_t height, State defaultState = State::dead)
238 // - le destructeur : ~_class_()
239 //
241 GOL() = default;
242 //
244 GOL(size_t width, size_t height, State defaultState = State::dead) {}
245 //
247 virtual ~GOL() = default;
248 //
249 // Les 4 autres fonctions spéciales sont laissées à votre discrétion.
250 // Toutefois, un simple -delete- est suffisant pour ce premier laboratoire.
251 // _class_(_class_ const &) = delete;
252 // _class_(_class_ &&) = delete;
253 // _class_& operator=(_class_ const &) = delete;
254 // _class_& operator=(_class_ &&) = delete;
255
256
257 //
258 // _
259 // / \ ___ ___ ___ ___ ___ ___ _ _ _ __ ___
260 // / _ \ / __/ __/ _ \/ __/ __|/ _ \ | | | '__/ __|
261 // / ___ \ (_| (_| __/\__ \__ \ __/ |_| | | \__ \
262 // /_/ \_\___\___\___||___/___/\___|\__,_|_| |___/
263 //
264 //
268 virtual size_t width() const = 0;
269 //
273 virtual size_t height() const = 0;
274 //
279 virtual size_t size() const = 0;
280 //
290 virtual State state(int x, int y) const = 0;
291 //
292 //
300 virtual std::string rule() const = 0;
301 //
302 //
306 virtual BorderManagement borderManagement() const = 0;
307 //
308 //
316 virtual Color color(State state) const = 0;
317 //
318 //
346 virtual Statistics statistics() const = 0;
347 //
348 //
367 //
368 //
369 // __ __ _ _
370 // | \/ |_ _| |_ __ _| |_ ___ _ _ _ __ ___
371 // | |\/| | | | | __/ _` | __/ _ \ | | | '__/ __|
372 // | | | | |_| | || (_| | || __/ |_| | | \__ \
373 // |_| |_|\__,_|\__\__,_|\__\___|\__,_|_| |___/
374 //
375 //
391 virtual void resize(size_t width, size_t height, State defaultState = State::dead) = 0;
392 //
393 //
432 virtual bool setRule(std::string const & rule) = 0;
433 //
434 //
487 //
488 //
497 virtual void setState(int x, int y, State state) = 0;
498 //
499 //
509 virtual void fill(State state = State::dead) = 0;
510 //
511 //
522 virtual void fillAlternately(State firstCell = State::dead) = 0;
523 //
524 //
536 virtual void randomize(double percentAlive = 0.5) = 0;
537 //
538 //
556 virtual bool setFromPattern(std::string const & pattern, int centerX, int centerY) = 0;
557 //
558 //
569 virtual bool setFromPattern(std::string const & pattern) = 0;
570 //
571 //
582 virtual void setSolidColor(State state, Color const & color) = 0;
583
584
585 //
586 //
587 // __ __ _ _ __ _ _
588 // | \/ | ___ __| (_)/ _(_) ___ __ _| |_ ___ _ _ _ __ ___
589 // | |\/| |/ _ \ / _` | | |_| |/ __/ _` | __/ _ \ | | | '__/ __|
590 // | | | | (_) | (_| | | _| | (_| (_| | || __/ |_| | | \__ \
591 // |_| |_|\___/ \__,_|_|_| |_|\___\__,_|\__\___|\__,_|_| |___/
592 //
608 virtual void processOneStep() = 0;
609 //
610 //
644 virtual void updateImage(uint32_t * buffer, size_t buffer_size) const = 0;
645
646};
647
648
649
650
651
652
653
654//
655// _ _ _
656// (_)_ __ ___ _ __ ___ _ __| |_ __ _ _ __ | |_
657// | | '_ ` _ \| '_ \ / _ \| '__| __/ _` | '_ \| __|
658// | | | | | | | |_) | (_) | | | || (_| | | | | |_
659// |_|_| |_| |_| .__/ \___/|_| \__\__,_|_| |_|\__|
660// |_|
661//
662// Attention, vous devez implémenter et utiliser une classe Grid.
663//
664// L'ébauche sous forme de commentaire plus bas est un guide
665// semi-contraignant.
666//
667// Toutefois :
668// - Vous DEVEZ implémenter l'interface présentée.
669// - Vous POUVEZ ajouter des éléments comme vous le voulez.
670//
671// > Autrement dit, l'interface proposé est minimum.
672// > NÉANMOINS, vous devez garder en tête l'intention générique de
673// cette classe et ne pas la spécialiser pour le contexte du projet
674// de GOL. Par exemple, si on faisait un copier/coller du code et
675// qu'on modifiait le CellType pour autre chose (un Vect2D par exemple),
676// alors, tout fonctionnerait et la classe serait encore pertinente.
677// D'ailleurs, vous remarquez que c'est le seul endroit où il existe un
678// lien entre cette classe et le projet courant.
679//
680// De plus, vous devez gérer manuellement l'allocation dynamique de la mémoire.
681//
682//
683// class Grid // Classe facilitant la gestion d'un tableau dynamique 2d.
684// { //
685// public: //
686// // Définition des types //
687// using CellType = GOL::State; // Correspond au type fondamental de chaque cellule de la grille.
688// using DataType = ...; // Correspond à la grille, au conteneur de cellules. À vous de déterminer la structure de données à utiliser.
689// //
690// // Définition des cosntructeurs / destructeur //
691// Grid(); //
692// Grid(size_t width, size_t height, CellType initValue = CellType{}); //
693// Grid(Grid const&) = delete; //
694// Grid(Grid&&) = delete; //
695// Grid& operator=(Grid const&) = delete; //
696// Grid& operator=(Grid&&) = delete; //
697// ~Grid(); //
698// //
699// // Accesseurs et mutateurs de la grille //
700// size_t width() const; // Accesseur retournant la largeur de la grille.
701// size_t height() const; // Accesseur retournant la hauteur de la grille.
702// size_t size() const; // Accesseur retournant le nombre de cellule de la grille.
703// //
704// void resize(size_t width, size_t height, CellType initValue = CellType{}); // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée.
705// //
706// // Accesseurs et mutateurs des cellules //
707// CellType value(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme.
708// void setValue(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme.
709// //
710// std::optional<CellType> at(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et retourne un optional nul si la coordonnée est invalide.
711// void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide.
712// //
713// // Accesseurs du "buffer" de la grille. //
714// DataType const & data() const; // Accesseur en lecture seule sur le "buffer" de la grille.
715// DataType & data(); // Accesseur en lecture/écriture sur le "buffer" de la grille.
716// //
717// private: //
718// // ... // Il y a des attributs essentiels au fonctionnement de cette classe.
719// // ... // À vous de les déterminer.
720// // ... //
721// }; //
722// //
723// //
724// //
725
726
727
728#endif // GOL_INTERFACE_H
Moteur de simulation d'un automate cellulaire à 2 dimensions.
Definition GOL.h:124
virtual void updateImage(uint32_t *buffer, size_t buffer_size) const =0
Fonction dessinant l'état de la simulation sur une image passée en paramètre.
virtual Color color(State state) const =0
Accesseur retournant la couleur d'un état.
virtual size_t width() const =0
Accesseur retournant la largeur de la grille de simualtion.
virtual void processOneStep()=0
Fonction effectuant une itération de la simulation.
GOL()=default
Constructeur par défaut.
virtual State state(int x, int y) const =0
Accesseur retournant l'état d'une cellule.
virtual std::string rule() const =0
Accesseur retournant la chaîne de caractères correspondant à la règle courante.
virtual void randomize(double percentAlive=0.5)=0
Mutateur remplissant de façon aléatoire toutes les cellules de la grille.
virtual void setBorderManagement(BorderManagement borderManagement)=0
Mutateur modifiant la stratégie de gestion de bord.
virtual size_t height() const =0
Accesseur retournant la hauteur de la grille de simualtion.
uint32_t IterationType
Le type représentant le nombre d'itération de la simulation.
Definition GOL.h:142
virtual ~GOL()=default
Destructeur.
virtual size_t size() const =0
Accesseur retournant le nombre total de cellules de la grille de simualtion.
virtual void fill(State state=State::dead)=0
Mutateur remplissant de façon uniforme toutes les cellules de la grille.
uint8_t ColorChannelType
Le type représentant un canal de couleur.
Definition GOL.h:160
BorderManagement
Le type représentant la stratégie de gestion de bord.
Definition GOL.h:150
@ immutableAsIs
Les cellules du contour ne sont jamais modifiées. Elles sont laissées dans leur état courant.
@ foreverDead
Les cellules du contour ne sont jamais modifiées. Elles sont toujours mortes.
@ foreverAlive
Les cellules du contour ne sont jamais modifiées. Elles sont toujours vivantes.
@ warping
Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la grille pour les c...
@ mirror
Les cellules du contour sont évaluées. On utilise les cellules du côté opposé de la cellule pour les ...
virtual void setSolidColor(State state, Color const &color)=0
Mutateur modifiant la couleur d'un état.
State
Le type représentant l'état d'une cellule.
Definition GOL.h:135
@ alive
L'état vivant.
@ dead
L'état mort.
GOL(size_t width, size_t height, State defaultState=State::dead)
Constructeur d'initialisation personnalisé.
Definition GOL.h:244
virtual Statistics statistics() const =0
Accesseurs retournant des informations générales sur la simulation en cours.
virtual BorderManagement borderManagement() const =0
Accesseur retournant la stratégie courante de gestion des bords.
virtual bool setFromPattern(std::string const &pattern)=0
Mutateur remplissant la grille par le patron passé en argument.
virtual void fillAlternately(State firstCell=State::dead)=0
Mutateur remplissant de façon alternée toutes les cellules de la grille.
virtual void setState(int x, int y, State state)=0
Mutateur modifiant l'état d'une cellule de la grille.
virtual bool setRule(std::string const &rule)=0
Mutateur modifiant la règle de la simulation.
virtual ImplementationInformation information() const =0
Accesseurs retournant les informations sur la réalisation de l'implémentation.
virtual void resize(size_t width, size_t height, State defaultState=State::dead)=0
Mutateur modifiant la taille de la grille de simulation.
virtual bool setFromPattern(std::string const &pattern, int centerX, int centerY)=0
Mutateur remplissant la grille par le patron passé en argument.
Le type représentant les informations permettant d'identifier les auteurs de l'implémentation.
Definition GOL.h:203
std::string lastName
Le nom de famille de l'auteur.
Definition GOL.h:204
std::string firstName
Le prénom de l'auteur.
Definition GOL.h:205
std::string studentEmail
L'adresse courriel de l'auteur. On désire l'adresse courriel étudiante.
Definition GOL.h:206
Le type représentant une couleur.
Definition GOL.h:164
ColorChannelType green
Le canal de couleur verte.
Definition GOL.h:166
ColorChannelType red
Le canal de couleur rouge.
Definition GOL.h:165
ColorChannelType blue
Le canal de couleur bleue.
Definition GOL.h:167
Le type représentant les informations documentant l'implémentation.
Definition GOL.h:218
std::string title
Le titre de l'implémentation.
Definition GOL.h:219
std::vector< Author > authors
Les auteurs de l'implémentation.
Definition GOL.h:220
std::vector< std::string > optionnalComments
Des commentaires optionnels.
Definition GOL.h:222
std::vector< std::string > answers
Les réponses aux questions du laboratoire.
Definition GOL.h:221
Le type représentant des données statistiques de la simulation.
Definition GOL.h:186
std::optional< size_t > totalDeadAbs
Le nombre total de cellules mortes en valeur absolue.
Definition GOL.h:193
std::optional< float > totalDeadRel
Le nombre total de cellules mortes en valeur relative du nombre total de cellules.
Definition GOL.h:195
std::optional< size_t > width
La largeur de la grille.
Definition GOL.h:189
std::optional< IterationType > iteration
Le nombre d'itération de la simulation.
Definition GOL.h:192
std::optional< size_t > totalCells
Le nombre total de cellules.
Definition GOL.h:191
std::optional< BorderManagement > borderManagement
La stratégie de gestion de bord.
Definition GOL.h:188
std::optional< size_t > totalAliveAbs
Le nombre total de cellules vivantes en valeur absolue.
Definition GOL.h:194
std::optional< size_t > height
La hauteur de la grille.
Definition GOL.h:190
std::optional< std::string > rule
La règle de la simulation exprimé par la chaîne de caractères de format "B###/S###".
Definition GOL.h:187
std::optional< int > tendencyAbs
La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur absolue.
Definition GOL.h:197
std::optional< float > tendencyRel
La tendance de la variation entre le nombre de cellules mortes et vivantes en valeur relative.
Definition GOL.h:198
std::optional< float > totalAliveRel
Le nombre total de cellules vivantes en valeur relative du nombre total de cellules.
Definition GOL.h:196