From 2b3ee5882ce6aae05a9f2ee5cb8caf33c36c1ca8 Mon Sep 17 00:00:00 2001
From: sdelplan <sara.delplanque@etu.ec-lyon.fr>
Date: Mon, 24 Mar 2025 12:03:11 +0100
Subject: [PATCH] Codage jeu
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Codage des mouvements et des fusions des nombres dans toutes les directions et ajout sur une case vide aléatoire du nombre 2
---
 .DS_Store                         | Bin 6148 -> 6148 bytes
 applicationQT2048/gamemanager.cpp | 181 +++++++++++++++++++++++++++++-
 applicationQT2048/gamemanager.h   |   1 +
 3 files changed, 178 insertions(+), 4 deletions(-)

diff --git a/.DS_Store b/.DS_Store
index abad47292df03305781df6f13c3abfdd13ffd172..e2ed0431e23f2be9fabdcf0c7fa0dd473aaaf8bb 100644
GIT binary patch
delta 304
zcmZoMXfc=|#>B)qu~2NHo}wTp0|Nsi1A_oVPP$=ma(-^X#)GRF>p`L{40;Ud44Dii
zFc}6gIH1hHzyO!a&3AE0%E?b+U|`^w@GEht<dI{JsPZXz<qI+(wt|gj0h59Zi4!O3
zOzc+{K(YAzLyL($Y9h!McH7)mbvts*5h9MT2uYkD#e!Q0HXbZx+04$t&%wmRx$)q4
f=E?jbx*{NJ85tND8X#c-Vlr$F5!t{zv4I5upBhd8

delta 96
zcmZoMXfc=|#>CJzF;Q%yo}wrt0|Nsi1A_nqLncEqLn1>7LncH1#6)#Q#>uhFYLizn
z@oZkgoXoO$1M@Sc&Fmcf983&tn-?;FXP(S2qRR==eSm?1fnl-@kM!mkktNIkJ9rk%

diff --git a/applicationQT2048/gamemanager.cpp b/applicationQT2048/gamemanager.cpp
index 9d5a638..6721ea8 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 f38899b..977859b 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:
-- 
GitLab