diff --git a/applicationQT2048/MenuPage.qml b/applicationQT2048/MenuPage.qml index dd718bd73ca87aacbffc5a58035cd5389761f5ee..5f04abc10eb6dba3dc42f45346da96984b431d4d 100644 --- a/applicationQT2048/MenuPage.qml +++ b/applicationQT2048/MenuPage.qml @@ -71,6 +71,33 @@ Rectangle { } } + Rectangle { + + width: 90; height: 30 + anchors.horizontalCenter: parent.horizontalCenter + y:250 + radius:5 + + + + MenuBar { + Menu { + title: "Charger une ancienne partie" + + Repeater { + model: gameManager.partieHistorique + MenuItem { + text: modelData + background: Rectangle { color: "grey"; radius: 5 } + onTriggered: gameManager.chargerPartie(modelData) + } + } + } + } + + + } + Rectangle { color:"blue" @@ -92,3 +119,6 @@ Rectangle { } } } + + + diff --git a/applicationQT2048/gamemanager.cpp b/applicationQT2048/gamemanager.cpp index 7c2810f08192f46a859d34aaac20415273352a8f..ceaf2046f5415ee00485cb99320769a213f27bc9 100644 --- a/applicationQT2048/gamemanager.cpp +++ b/applicationQT2048/gamemanager.cpp @@ -1,5 +1,9 @@ #include "gamemanager.h" #include "random" +#include <QFileInfo> +#include <QInputDialog> +#include <QLineEdit> +#include <QDebug> GameManager::GameManager(QObject *parent) : QObject(parent), grid(4, std::vector<int>(4, 0)) { @@ -183,9 +187,19 @@ void GameManager::moveDown() { void GameManager::restartGame() { - //sauvergarder la partie précédente + //demander pour sauvergarder la partie précédente + + bool ok; + QString nomPartie = QInputDialog::getText(nullptr, "Sauvegarde", + "Entrez le nom de la partie :", + QLineEdit::Normal, "", &ok); + if (ok && !nomPartie.isEmpty()) { + qDebug() << "Nom de la partie sauvegardée :" << nomPartie; + enregistrerPartie(nomPartie); // Appelle la fonction de sauvegarde + } else { + qDebug() << "Saisie annulée ou vide."; + } - enregistrerPartie(); // Réinitialisation des variables grid.assign(4, std::vector<int>(4, 0)); @@ -195,7 +209,7 @@ void GameManager::restartGame() { std::uniform_int_distribution<int> distrib(0, 15); int num1 = distrib(rd); - int num2 = distrib(rd); + int num2; // Assure que num2 est différent de num1 do { @@ -253,6 +267,33 @@ QVector<int> GameManager::getGridValues() const { return flattenedGrid; } +QStringList GameManager::getPartieHistorique() { + QFile file("historique.json"); + + qDebug() << "Fichier JSON enregistré à : " << QFileInfo(file).absoluteFilePath(); + + if (!file.open(QIODevice::ReadWrite)) { + qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString(); + + } + QJsonDocument doc; + if (file.size() > 0) { // Vérifier que le fichier n'est pas vide + doc = QJsonDocument::fromJson(file.readAll()); + }else{ // Sinon initialiser avec un objet vide + doc = QJsonDocument(QJsonObject()); + } + + + QJsonObject rootObj = doc.object(); + QStringList list = rootObj.keys(); + + file.close(); + + qDebug() << "Liste des parties:" << list ; + return list; + +} + QJsonArray GameManager::gridToJsonArray() { QJsonArray jsonGrid; for (const auto &row : grid) { @@ -281,6 +322,69 @@ void GameManager::undo() { } } -void GameManager::enregistrerPartie(){ +void GameManager::enregistrerPartie(QString partieName){ + QFile file("historique.json"); + qDebug() << "Fichier JSON enregistré à : " << QFileInfo(file).absoluteFilePath(); + // Ouvrir le fichier en mode lecture/écriture (si existant) + if (!file.open(QIODevice::ReadWrite)) { + qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString(); + return; + } + + + QJsonDocument doc; + if (file.size() > 0) { // Vérifier que le fichier n'est pas vide + doc = QJsonDocument::fromJson(file.readAll()); + }else{ // Sinon initialiser avec un objet vide + doc = QJsonDocument(QJsonObject()); + } + + + QJsonObject rootObj = doc.object(); // Récupérer l'objet JSON racine + rootObj[partieName] = historyArray; // Ajouter ou remplacer la grille associée à l'ID + + // Réécriture du fichier avec la nouvelle version + file.resize(0); // Effacer le contenu du fichier avant d'écrire la nouvelle version + file.write(QJsonDocument(rootObj).toJson()); + file.close(); + + emit historiqueChanged(); +} + +void GameManager::chargerPartie(QString partieName){ + QFile file("historique.json"); + + + // Ouvrir le fichier en mode lecture/écriture (si existant) + if (!file.open(QIODevice::ReadWrite)) { + qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString(); + return; + } + + + QJsonDocument doc; + if (file.size() > 0) { // Vérifier que le fichier n'est pas vide + doc = QJsonDocument::fromJson(file.readAll()); + }else{ // Sinon erreur + return; + } + QJsonObject rootObj = doc.object(); // Récupérer l'objet JSON racine + historyArray = rootObj[partieName].toArray(); // Charger la grille + + QJsonArray previousState = historyArray.last().toArray(); // Récupérez le dernier état de la partie chargée + + // Mettez à jour la grille + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + grid[i][j] = previousState[i].toArray()[j].toInt(); + } + } + + emit gridChanged(); // Notifiez que la grille a changé + + + file.close(); } + + diff --git a/applicationQT2048/gamemanager.h b/applicationQT2048/gamemanager.h index ab6f00a40158bb54465c85bcd83d4bd720edcc02..445ffa2e3b7992049275727147459b1724eaa4af 100644 --- a/applicationQT2048/gamemanager.h +++ b/applicationQT2048/gamemanager.h @@ -15,6 +15,7 @@ class GameManager : public QObject Q_OBJECT Q_PROPERTY(QVector<int> gridValues READ getGridValues NOTIFY gridChanged) + Q_PROPERTY(QStringList partieHistorique READ getPartieHistorique NOTIFY historiqueChanged) public: explicit GameManager(QObject *parent = nullptr); @@ -24,22 +25,25 @@ public: Q_INVOKABLE void moveDown(); Q_INVOKABLE void restartGame(); Q_INVOKABLE void undo(); - + Q_INVOKABLE void chargerPartie(QString partieName); QVector<int> getGridValues() const; + QStringList getPartieHistorique(); private: std::vector<std::vector<int>> grid; QJsonArray historyArray; Q_INVOKABLE void addRandomElement(); - Q_INVOKABLE void enregistrerPartie(); + Q_INVOKABLE void enregistrerPartie(QString partieName); + QJsonArray gridToJsonArray(); signals: void gridChanged(); + void historiqueChanged(); }; diff --git a/applicationQT2048/historique.json b/applicationQT2048/historique.json new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391