diff --git a/GPA675Lab1GOL/GOLTeamH.cpp b/GPA675Lab1GOL/GOLTeamH.cpp index 7f1b200..68b6894 100644 --- a/GPA675Lab1GOL/GOLTeamH.cpp +++ b/GPA675Lab1GOL/GOLTeamH.cpp @@ -323,8 +323,58 @@ void GOLTeamH::randomize(double percentAlive) // TODO bool GOLTeamH::setFromPattern(std::string const& pattern, int centerX, int centerY) { + // Analyse du pattern + size_t pos = 0; + + // Vérification du '[' initial + if (pattern[pos++] != '[') { + std::cerr << "Erreur de format : '[' manquant." << std::endl; + return false; + } + + // Lecture de la largeur + size_t width = std::stoi(pattern.substr(pos), &pos); + if (width <= 0) { + std::cerr << "Erreur de format : Largeur invalide." << std::endl; + return false; + } + + // Vérification du 'x' + if (pattern[pos++] != 'x') { + std::cerr << "Erreur de format : 'x' manquant." << std::endl; + return false; + } + + // Lecture de la hauteur + size_t height = std::stoi(pattern.substr(pos), &pos); + if (height <= 0) { + std::cerr << "Erreur de format : Hauteur invalide." << std::endl; + return false; + } + + // Vérification du ']' + if (pattern[pos++] != ']') { + std::cerr << "Erreur de format : ']' manquant." << std::endl; + return false; + } + + // Vérification de la taille du reste du pattern + if (pattern.length() - pos != width * height) { + std::cerr << "Erreur de format : Taille du patron incorrecte." << std::endl; + return false; + } + + // Remplissage de la grille aux positions spécifiées par le patron + for (size_t y = 0; y < height; ++y) { + for (size_t x = 0; x < width; ++x) { + char cellChar = pattern[pos++]; + State cellState = (cellChar == '0') ? State::dead : State::alive; + mData.setAt(centerX + x, centerY + y, cellState); + } + } + + return true; mIteration = 0; - return false; } //! \brief Mutateur remplissant la grille par le patron passé en argument. @@ -341,8 +391,59 @@ bool GOLTeamH::setFromPattern(std::string const& pattern, int centerX, int cente // TODO bool GOLTeamH::setFromPattern(std::string const& pattern) { + // Analyse du pattern + size_t pos = 0; + + // Vérification du '[' initial + if (static_cast(pattern[pos++]) != '[') { + std::cerr << "Erreur de format : '[' manquant." << std::endl; + return false; + } + + // Lecture de la largeur + size_t width = std::stoi(pattern.substr(pos), &pos); + if (width <= 0) { + std::cerr << "Erreur de format : Largeur invalide." << std::endl; + return false; + } + pos++; + if (pattern[pos++] != 120 ) { + std::cerr << "Erreur de format : 'x' manquant." << std::endl; + return false; + } + pos++; + // Lecture de la hauteur + size_t height = std::stoi(pattern.substr(pos), &pos); + if (height <= 0) { + std::cerr << "Erreur de format : Hauteur invalide." << std::endl; + return false; + } + pos++; + // Vérification du ']' + if (static_cast(pattern[pos++]) != ']') { + std::cerr << "Erreur de format : ']' manquant." << std::endl; + return false; + } + pos++; + // Vérification de la taille du reste du pattern + if (pattern.length() - pos != width * height) { + std::cerr << "Erreur de format : Taille du patron incorrecte." << std::endl; + return false; + } + size_t centerX = mData.width() / 2; + size_t centerY = mData.height() / 2; + + // Remplissage de la grille aux positions spécifiées par le patron + for (size_t y = 0; y < height; ++y) { + for (size_t x = 0; x < width; ++x) { + char cellChar = pattern[pos++]; + State cellState = (cellChar == '0') ? State::dead : State::alive; + mData.setAt(centerX + x, centerY + y, cellState); + } + } + + return true; mIteration = 0; - return false; } //! \brief Mutateur modifiant la couleur d'un état. diff --git a/GPA675Lab1GOL/GOLTeamH.h b/GPA675Lab1GOL/GOLTeamH.h index 8634370..cef7b0c 100644 --- a/GPA675Lab1GOL/GOLTeamH.h +++ b/GPA675Lab1GOL/GOLTeamH.h @@ -7,6 +7,8 @@ #include #include #include "GridTeamH.h" +#include +#include // Fichier : GridTeam.h // GPA675 – Laboratoire 1