Game.cpp h - JulianKerignard/ProjetJeuDeLaVie_POO GitHub Wiki
La classe Game
gère la logique principale du Jeu de la Vie. Elle inclut des méthodes pour initialiser, exécuter, et contrôler le jeu, ainsi que pour gérer les paramètres d'affichage et de configuration.
#ifndef GAME_H
#define GAME_H
#include "Grid.h"
#include "FileHandler.h"
#include "RleReader.h"
#include "DisplayManager.h"
#include <memory>
#include <string>
enum class DisplayMode { CONSOLE, GRAPHICAL };
class Game {
public:
// Constructeur standard avec chemin de fichier et mode d'affichage
Game(const std::string& filePath, DisplayMode mode);
// Constructeur avec choix du type de fichier
Game(const std::string& filePath, DisplayMode mode, FileType fileType);
// Constructeur avec dimensions spécifiées
Game(const std::string& filePath, DisplayMode mode, FileType fileType, int width, int height);
// Interface utilisateur pour configurer le jeu
void userInterface();
// Démarre le jeu
void run();
// Met en pause le jeu
void pause();
// Reprend le jeu
void resume();
// Définit le délai entre les itérations
void setIterationDelay(float ms);
// Met à jour le délai entre les itérations
void updateIterationDelay(float delta);
// Retourne le nombre actuel d'itérations
int getCurrentIteration() const;
private:
Grid grid; // Grille de cellules
std::unique_ptr<DisplayManager> displayManager; // Gestionnaire d'affichage
int iterationCount; // Compteur d'itérations
int maxIterations; // Nombre maximal d'itérations
bool isRunning; // Indique si le jeu est en cours d'exécution
float iterationDelay; // Délai entre les itérations en millisecondes
float lastUpdateSpeed; // Dernière vitesse de mise à jour enregistrée
// Initialise le gestionnaire d'affichage
void initializeDisplay(DisplayMode mode);
// Crée un nouveau fichier de configuration
void createNewConfigFile(int width, int height);
};
#endif // GAME_H
-
Game(const std::string& filePath, DisplayMode mode) :
- Initialise le jeu avec un fichier de configuration et un mode d'affichage.
-
Game(const std::string& filePath, DisplayMode mode, FileType fileType) :
- Initialise le jeu avec un fichier de configuration, un mode d'affichage, et un type de fichier spécifique (STANDARD ou RLE).
-
Game(const std::string& filePath, DisplayMode mode, FileType fileType, int width, int height) :
- Initialise le jeu avec un fichier de configuration, un mode d'affichage, un type de fichier, et des dimensions spécifiques pour la grille.
-
void initializeDisplay(DisplayMode mode) :
- Initialise le gestionnaire d'affichage (console ou graphique) en fonction du mode spécifié.
-
void createNewConfigFile(int width, int height) :
- Crée un nouveau fichier de configuration avec une grille de dimensions spécifiées et un motif initial.
-
void userInterface() :
- Interface utilisateur pour configurer le jeu avant de le démarrer, incluant la sélection du mode d'affichage et le chargement de fichiers de configuration.
-
void run() :
- Démarre l'exécution du jeu, gérant l'évolution des cellules et les mises à jour de l'affichage.
-
void pause() :
- Met en pause le jeu (applicable en mode graphique).
-
void resume() :
- Reprend le jeu après une pause (applicable en mode graphique).
-
void setIterationDelay(float ms) :
- Définit le délai entre les itérations du jeu.
-
void updateIterationDelay(float delta) :
- Met à jour le délai entre les itérations en fonction d'un changement spécifié.
-
int getCurrentIteration() const :
- Retourne le nombre actuel d'itérations effectuées par le jeu.
Initialise le gestionnaire d'affichage en fonction du mode spécifié (console ou graphique).
void Game::initializeDisplay(DisplayMode mode) {
switch (mode) {
case DisplayMode::CONSOLE:
displayManager = std::make_unique<ConsoleDisplay>();
break;
case DisplayMode::GRAPHICAL: {
auto graphicalDisplay = std::make_unique<GraphicalDisplay>();
graphicalDisplay->setGrid(&grid);
graphicalDisplay->setIterationDelay(iterationDelay);
graphicalDisplay->setMaxIterations(maxIterations);
displayManager = std::move(graphicalDisplay);
break;
}
default:
throw std::invalid_argument("Mode d'affichage invalide");
}
}
Démarre l'exécution du jeu, gérant l'évolution des cellules et les mises à jour de l'affichage.
void Game::run() {
isRunning = true;
displayManager->initialize();
std::cout << "Démarrage avec délai : " << iterationDelay << "ms" << std::endl;
if (maxIterations > 0) {
std::cout << "Nombre maximum d'itérations : " << maxIterations << std::endl;
} else {
std::cout << "Mode infini activé" << std::endl;
}
while (isRunning) {
if (auto* graphicalDisplay = dynamic_cast<GraphicalDisplay*>(displayManager.get())) {
if (!graphicalDisplay->isWindowOpen()) {
isRunning = false;
break;
}
float currentSpeed = graphicalDisplay->getIterationSpeed();
if (currentSpeed != lastUpdateSpeed) {
iterationDelay = currentSpeed;
lastUpdateSpeed = currentSpeed;
}
graphicalDisplay->setIterationCount(iterationCount);
displayManager->update(grid);
if (!graphicalDisplay->isPaused()) {
grid.updateCells();
iterationCount++;
if (maxIterations > 0 && iterationCount >= maxIterations) {
std::cout << "Nombre maximum d'itérations atteint (" << maxIterations << ")" << std::endl;
isRunning = false;
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(static_cast<int>(iterationDelay)));
}
} else {
grid.updateCells();
displayManager->update(grid);
iterationCount++;
if (maxIterations > 0 && iterationCount >= maxIterations) {
std::cout << "Nombre maximum d'itérations atteint (" << maxIterations << ")" << std::endl;
isRunning = false;
}
std::this_thread::sleep_for(std::chrono::milliseconds(static_cast<int>(iterationDelay)));
}
}
displayManager->close();
}