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