diff --git a/applicationQT2048/GamePage.qml b/applicationQT2048/GamePage.qml index 04bce111907c30c952aeabc3b3af8b3c97155fd9..fc79fdf91b4d8b1809ab72e7752e5fd864d96462 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 810fd89d94781d8ca71af41fb8c4b1f1b579bdce..5ac116a9ca71610c0149c546057ec9ee754e9bb1 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 8e2fd68de7092f134d37e90da2b5b67f22e5d11d..d280f883ff8ba6cbfd386eedf40d84a837599d18 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(); };