Game.cpp h - JulianKerignard/ProjetJeuDeLaVie_POO GitHub Wiki

Documentation pour Game.cpp et Game.h 📄

Fichier game.h

Définition de la Classe Game

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

Fichier game.cpp

Implémentation de la Classe Game

Constructeurs

  • 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.

Méthodes

  • 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.

Exemple de Méthodes Implémentées

void initializeDisplay(DisplayMode mode)

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");
    }
}

void run()

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();
}
⚠️ **GitHub.com Fallback** ⚠️