diff --git a/applicationQT2048/gamemanager.cpp b/applicationQT2048/gamemanager.cpp
index 6721ea8e7cb78725ae38357a082092a2bf944118..7c2810f08192f46a859d34aaac20415273352a8f 100644
--- a/applicationQT2048/gamemanager.cpp
+++ b/applicationQT2048/gamemanager.cpp
@@ -40,6 +40,9 @@ void GameManager::moveLeft() {
         grid[i] = newRow;
     }
     emit addRandomElement();
+
+    //Mettre a jour l'état et l'enregistrer
+    historyArray.append(gridToJsonArray());
     emit gridChanged();
 }
 
@@ -78,6 +81,9 @@ void GameManager::moveRight() {
         grid[i] = newRow;
     }
     emit addRandomElement();
+
+    //Mettre a jour l'état et l'enregistrer
+    historyArray.append(gridToJsonArray());
     emit gridChanged();
 
 }
@@ -123,6 +129,9 @@ void GameManager::moveUp() {
 
     }
     emit addRandomElement();
+
+    //Mettre a jour l'état et l'enregistrer
+    historyArray.append(gridToJsonArray());
     emit gridChanged();
 }
 
@@ -165,11 +174,23 @@ void GameManager::moveDown() {
 
     }
     emit addRandomElement();
+
+    //Mettre a jour l'état et l'enregistrer
+    historyArray.append(gridToJsonArray());
     emit gridChanged();
+
 }
 
 void GameManager::restartGame() {
+
+    //sauvergarder la partie précédente
+
+    enregistrerPartie();
+
+    // Réinitialisation des variables
     grid.assign(4, std::vector<int>(4, 0));
+    historyArray = QJsonArray();
+
     std::random_device rd;
     std::uniform_int_distribution<int> distrib(0, 15);
 
@@ -191,6 +212,8 @@ void GameManager::restartGame() {
     grid[rg2][col2]=2;
 
 
+    //Mettre a jour l'état et l'enregistrer
+    historyArray.append(gridToJsonArray());
     emit gridChanged();
 
 }
@@ -229,3 +252,35 @@ QVector<int> GameManager::getGridValues() const {
     }
     return flattenedGrid;
 }
+
+QJsonArray GameManager::gridToJsonArray() {
+    QJsonArray jsonGrid;
+    for (const auto &row : grid) {
+        QJsonArray jsonRow;
+        for (int cell : row) {
+            jsonRow.append(cell);
+        }
+        jsonGrid.append(jsonRow); // Ajoute chaque ligne
+    }
+    return jsonGrid;
+}
+
+void GameManager::undo() {
+    if (historyArray.size() > 1) {  // Vérifiez qu'il y a au moins deux états
+        historyArray.removeLast();  // Supprimez le dernier état
+        QJsonArray previousState = historyArray.last().toArray();  // Récupérez l'avant-dernier état
+
+        // Mettez à jour la grille avec l'état précédent
+        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é
+    }
+}
+
+void GameManager::enregistrerPartie(){
+
+}
diff --git a/applicationQT2048/gamemanager.h b/applicationQT2048/gamemanager.h
index 977859bf7efc53f268e6be0b8cc94b672ee584cf..ab6f00a40158bb54465c85bcd83d4bd720edcc02 100644
--- a/applicationQT2048/gamemanager.h
+++ b/applicationQT2048/gamemanager.h
@@ -3,6 +3,12 @@
 
 #include <QObject>
 #include <vector>
+#include <QJsonArray>
+#include <QJsonObject>
+#include <QJsonDocument>
+#include <QFile>
+
+
 
 class GameManager : public QObject
 {
@@ -17,12 +23,19 @@ public:
     Q_INVOKABLE void moveUp();
     Q_INVOKABLE void moveDown();
     Q_INVOKABLE void restartGame();
+    Q_INVOKABLE void undo();
+
 
     QVector<int> getGridValues() const;
 
 private:
     std::vector<std::vector<int>> grid;
+    QJsonArray historyArray;
+
     Q_INVOKABLE void addRandomElement();
+    Q_INVOKABLE void enregistrerPartie();
+    QJsonArray gridToJsonArray();
+
 
 
 signals: