From e22daca7a3c09bd0a515d12093b0cbf7e3e4e152 Mon Sep 17 00:00:00 2001 From: sdelplan <sara.delplanque@etu.ec-lyon.fr> Date: Mon, 31 Mar 2025 09:42:29 +0200 Subject: [PATCH] ajout affichage score --- applicationQT2048/GamePage.qml | 2 +- applicationQT2048/gamemanager.cpp | 48 +++++++++++++++++++++++++++---- applicationQT2048/gamemanager.h | 7 +++++ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/applicationQT2048/GamePage.qml b/applicationQT2048/GamePage.qml index 04bce11..fc79fdf 100644 --- a/applicationQT2048/GamePage.qml +++ b/applicationQT2048/GamePage.qml @@ -112,7 +112,7 @@ FocusScope { // Permet de capter le focus pour les raccourcis clavier Text{ id: score - text:"0" + text:gameManager.score color:"white" font.bold: true font.pixelSize: 25 diff --git a/applicationQT2048/gamemanager.cpp b/applicationQT2048/gamemanager.cpp index 810fd89..5ac116a 100644 --- a/applicationQT2048/gamemanager.cpp +++ b/applicationQT2048/gamemanager.cpp @@ -4,11 +4,14 @@ #include <QDebug> -GameManager::GameManager(QObject *parent) : QObject(parent), grid(4, std::vector<int>(4, 0)) { +GameManager::GameManager(QObject *parent) : QObject(parent), grid(4, std::vector<int>(4, 0)),m_score(0), m_gameOver(false) { } void GameManager::moveLeft() { + if (m_gameOver) { // Si la partie est terminée, ne fais rien + return; + } 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) @@ -43,7 +46,7 @@ void GameManager::moveLeft() { grid[i] = newRow; } emit addRandomElement(); - + m_gameOver = isGameOver(); //Mettre a jour l'état et l'enregistrer historyArray.append(gridToJsonArray()); emit gridChanged(); @@ -51,6 +54,9 @@ void GameManager::moveLeft() { } void GameManager::moveRight() { + if (m_gameOver) { // Si la partie est terminée, ne fais rien + return; + } 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) @@ -85,6 +91,7 @@ void GameManager::moveRight() { grid[i] = newRow; } emit addRandomElement(); + m_gameOver = isGameOver(); //Mettre a jour l'état et l'enregistrer historyArray.append(gridToJsonArray()); @@ -96,6 +103,9 @@ void GameManager::moveRight() { void GameManager::moveUp() { + if (m_gameOver) { // Si la partie est terminée, ne fais rien + return; + } // 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 @@ -134,6 +144,7 @@ void GameManager::moveUp() { } emit addRandomElement(); + m_gameOver = isGameOver(); //Mettre a jour l'état et l'enregistrer historyArray.append(gridToJsonArray()); @@ -142,6 +153,9 @@ void GameManager::moveUp() { } void GameManager::moveDown() { + if (m_gameOver) { // Si la partie est terminée, ne fais rien + return; + } // 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 @@ -180,6 +194,7 @@ void GameManager::moveDown() { } emit addRandomElement(); + m_gameOver = isGameOver(); //Mettre a jour l'état et l'enregistrer historyArray.append(gridToJsonArray()); @@ -193,6 +208,7 @@ void GameManager::restartGame() { //demander pour sauvergarder la partie précédente enregistrerPartie("partie1"); + m_gameOver = false; // Réinitialisation des variables @@ -388,15 +404,37 @@ void GameManager::chargerPartie(QString partieName){ file.close(); } +int GameManager::score() const { + return m_score; // Retourne le score actuel +} + void GameManager::calculscore(){ + if (m_gameOver) { // Si la partie est terminée, ne calcule pas le score + return; + } + m_score = 0; // Parcourir la grille pour additionner toute les cases - int score=0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { - score=grid[i][j]+score; + m_score+=grid[i][j]; } } - + emit scoreChanged(); } +bool GameManager::isGameOver() { + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + if (grid[i][j] == 0) { // Une case vide est trouvée, donc le jeu n'est pas fini + return false; + } + // Vérifier les possibilités de fusion (horizontale et verticale) + if ((i < 3 && grid[i][j] == grid[i + 1][j]) || (j < 3 && grid[i][j] == grid[i][j + 1])) { + return false; + } + } + } + return true; // Si la grille est pleine et aucune fusion n'est possible, la partie est terminée +} diff --git a/applicationQT2048/gamemanager.h b/applicationQT2048/gamemanager.h index 8e2fd68..d280f88 100644 --- a/applicationQT2048/gamemanager.h +++ b/applicationQT2048/gamemanager.h @@ -16,6 +16,7 @@ class GameManager : public QObject Q_PROPERTY(QVector<int> gridValues READ getGridValues NOTIFY gridChanged) Q_PROPERTY(QStringList partieHistorique READ getPartieHistorique NOTIFY historiqueChanged) + Q_PROPERTY(int score READ score NOTIFY scoreChanged) public: explicit GameManager(QObject *parent = nullptr); @@ -26,13 +27,16 @@ public: Q_INVOKABLE void restartGame(); Q_INVOKABLE void undo(); Q_INVOKABLE void chargerPartie(QString partieName); + bool isGameOver(); QVector<int> getGridValues() const; QStringList getPartieHistorique(); + int score() const; private: std::vector<std::vector<int>> grid; QJsonArray historyArray; + int m_score; Q_INVOKABLE void addRandomElement(); Q_INVOKABLE void enregistrerPartie(QString partieName); @@ -40,11 +44,14 @@ private: QJsonArray gridToJsonArray(); + bool m_gameOver; + signals: void gridChanged(); void historiqueChanged(); + void scoreChanged(); }; -- GitLab