diff --git a/.DS_Store b/.DS_Store
index abad47292df03305781df6f13c3abfdd13ffd172..e2ed0431e23f2be9fabdcf0c7fa0dd473aaaf8bb 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/applicationQT2048/gamemanager.cpp b/applicationQT2048/gamemanager.cpp
index 9d5a638dfcd0b5611d36aa430dac65909f2f58b1..6721ea8e7cb78725ae38357a082092a2bf944118 100644
--- a/applicationQT2048/gamemanager.cpp
+++ b/applicationQT2048/gamemanager.cpp
@@ -6,19 +6,166 @@ GameManager::GameManager(QObject *parent) : QObject(parent), grid(4, std::vector
 }
 
 void GameManager::moveLeft() {
-    // Implémentation du mouvement vers la gauche
+    for (int i = 0; i < 4; i++) {
+        std::vector<int> newRow(4, 0);  // Créer une nouvelle ligne vide
+        int newPos = 0;  // Position pour insérer un élément non nul (commence par le début)
+        int temp = 0;  // Variable pour mémoriser l'élément à fusionner
+
+        // Parcourir la ligne de gauche à droite
+        for (int j = 0; j <4; j++) {
+            if (grid[i][j] != 0) {  // Si l'élément n'est pas nul
+                if (temp == 0) {
+                    // Mémoriser l'élément actuel
+                    temp = grid[i][j];
+                } else if (temp == grid[i][j]) {
+                    // Si l'élément est identique au "temp", fusionner
+                    newRow[newPos] = temp * 2;  // Fusionner en doublant la valeur
+                    temp = 0;  // Réinitialiser temp après fusion
+                    newPos++;  // Déplacer la position pour l'élément suivant
+                } else {
+                    // Si l'élément n'est pas identique à "temp", le placer dans la nouvelle ligne
+                    newRow[newPos] = temp;
+                    temp = grid[i][j];  // Mettre à jour temp avec le nouvel élément
+                    newPos++;  // Déplacer la position pour l'élément suivant
+                }
+            }
+        }
+
+        // Si l'élément restant dans "temp" n'a pas été placé, on le place
+        if (temp != 0) {
+            newRow[newPos] = temp;
+        }
+
+        // Mettre à jour la grille avec la nouvelle ligne
+        grid[i] = newRow;
+    }
+    emit addRandomElement();
+    emit gridChanged();
 }
 
 void GameManager::moveRight() {
-    // Implémentation du mouvement vers la droite
+    for (int i = 0; i < 4; i++) {
+        std::vector<int> newRow(4, 0);  // Créer une nouvelle ligne vide
+        int newPos = 3;  // Position pour insérer un élément non nul (commence par la fin)
+        int temp = 0;  // Variable pour mémoriser l'élément à fusionner
+
+        // Parcourir la ligne de droite à gauche
+        for (int j = 3; j >= 0; j--) {
+            if (grid[i][j] != 0) {  // Si l'élément n'est pas nul
+                if (temp == 0) {
+                    // Mémoriser l'élément actuel
+                    temp = grid[i][j];
+                } else if (temp == grid[i][j]) {
+                    // Si l'élément est identique au "temp", fusionner
+                    newRow[newPos] = temp * 2;  // Fusionner en doublant la valeur
+                    temp = 0;  // Réinitialiser temp après fusion
+                    newPos--;  // Déplacer la position pour l'élément suivant
+                } else {
+                    // Si l'élément n'est pas identique à "temp", le placer dans la nouvelle ligne
+                    newRow[newPos] = temp;
+                    temp = grid[i][j];  // Mettre à jour temp avec le nouvel élément
+                    newPos--;  // Déplacer la position pour l'élément suivant
+                }
+            }
+        }
+
+        // Si l'élément restant dans "temp" n'a pas été placé, on le place
+        if (temp != 0) {
+            newRow[newPos] = temp;
+        }
+
+        // Mettre à jour la grille avec la nouvelle ligne
+        grid[i] = newRow;
+    }
+    emit addRandomElement();
+    emit gridChanged();
+
 }
 
+
+
 void GameManager::moveUp() {
     // Implémentation du mouvement vers le haut
+    for (int j = 0; j < 4; j++) {
+        std::vector<int> newCol(4, 0);  // Créer une nouvelle ligne vide
+        int newPos = 0;  // Position pour insérer un élément non nul (commence par la fin)
+        int temp = 0;  // Variable pour mémoriser l'élément à fusionner
+
+        // Parcourir la ligne de droite à gauche
+        for (int i = 0; i <4; i++) {
+            if (grid[i][j] != 0) {  // Si l'élément n'est pas nul
+                if (temp == 0) {
+                    // Mémoriser l'élément actuel
+                    temp = grid[i][j];
+                } else if (temp == grid[i][j]) {
+                    // Si l'élément est identique au "temp", fusionner
+                    newCol[newPos] = temp * 2;  // Fusionner en doublant la valeur
+                    temp = 0;  // Réinitialiser temp après fusion
+                    newPos++;  // Déplacer la position pour l'élément suivant
+                } else {
+                    // Si l'élément n'est pas identique à "temp", le placer dans la nouvelle ligne
+                    newCol[newPos] = temp;
+                    temp = grid[i][j];  // Mettre à jour temp avec le nouvel élément
+                    newPos++;  // Déplacer la position pour l'élément suivant
+                }
+            }
+        }
+
+        // Si l'élément restant dans "temp" n'a pas été placé, on le place
+        if (temp != 0) {
+            newCol[newPos] = temp;
+        }
+
+        // Mettre à jour la colonne dans la grille
+        for (int i=0;i<4;i++){
+            grid[i][j]=newCol[i];
+        }
+
+    }
+    emit addRandomElement();
+    emit gridChanged();
 }
 
 void GameManager::moveDown() {
     // Implémentation du mouvement vers le bas
+    for (int j = 0; j < 4; j++) {
+        std::vector<int> newCol(4, 0);  // Créer une nouvelle ligne vide
+        int newPos = 3;  // Position pour insérer un élément non nul (commence par la fin)
+        int temp = 0;  // Variable pour mémoriser l'élément à fusionner
+
+        // Parcourir la ligne de droite à gauche
+        for (int i = 3; i>=0; i--) {
+            if (grid[i][j] != 0) {  // Si l'élément n'est pas nul
+                if (temp == 0) {
+                    // Mémoriser l'élément actuel
+                    temp = grid[i][j];
+                } else if (temp == grid[i][j]) {
+                    // Si l'élément est identique au "temp", fusionner
+                    newCol[newPos] = temp * 2;  // Fusionner en doublant la valeur
+                    temp = 0;  // Réinitialiser temp après fusion
+                    newPos--;  // Déplacer la position pour l'élément suivant
+                } else {
+                    // Si l'élément n'est pas identique à "temp", le placer dans la nouvelle ligne
+                    newCol[newPos] = temp;
+                    temp = grid[i][j];  // Mettre à jour temp avec le nouvel élément
+                    newPos--;  // Déplacer la position pour l'élément suivant
+                }
+            }
+        }
+
+        // Si l'élément restant dans "temp" n'a pas été placé, on le place
+        if (temp != 0) {
+            newCol[newPos] = temp;
+        }
+
+        // Mettre à jour la colonne dans la grille
+        for (int i=0;i<4;i++){
+            grid[i][j]=newCol[i];
+        }
+
+    }
+    emit addRandomElement();
+    emit gridChanged();
 }
 
 void GameManager::restartGame() {
@@ -43,14 +190,40 @@ void GameManager::restartGame() {
     grid[rg1][col1]=2;
     grid[rg2][col2]=2;
 
+
     emit gridChanged();
 
 }
 
+void GameManager::addRandomElement() {
+    // Créer une liste pour stocker les indices des cases vides
+    std::vector<std::pair<int, int>> emptyCells;
+
+    // Parcourir la grille pour trouver toutes les cases vides
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            if (grid[i][j] == 0) {  // Si la case est vide (valeur 0)
+                emptyCells.push_back({i, j});  // Ajouter l'indice de la case à la liste
+            }
+        }
+    }
+
+    // Si la liste des cases vides n'est pas vide, on ajoute un nouveau '2'
+    if (!emptyCells.empty()) {
+        // Choisir une case vide aléatoire
+        int randomIndex = rand() % emptyCells.size();
+        int row = emptyCells[randomIndex].first;
+        int col = emptyCells[randomIndex].second;
+
+        // Placer un '2' dans cette case
+        grid[row][col] = 2;
+    }
+}
+
 QVector<int> GameManager::getGridValues() const {
     QVector<int> flattenedGrid;
-    for (const auto& row : grid) {  // 🔹 Parcourt chaque ligne
-        for (int value : row) {      // 🔹 Parcourt chaque colonne
+    for (const auto& row : grid) {  // Parcourt chaque ligne
+        for (int value : row) {      // Parcourt chaque colonne
             flattenedGrid.append(value);
         }
     }
diff --git a/applicationQT2048/gamemanager.h b/applicationQT2048/gamemanager.h
index f38899b5acbb1ff9559d8b2bcd8839e9c3b07c79..977859bf7efc53f268e6be0b8cc94b672ee584cf 100644
--- a/applicationQT2048/gamemanager.h
+++ b/applicationQT2048/gamemanager.h
@@ -22,6 +22,7 @@ public:
 
 private:
     std::vector<std::vector<int>> grid;
+    Q_INVOKABLE void addRandomElement();
 
 
 signals: