Skip to content
Snippets Groups Projects
Select Git revision
  • 4894b43de4a12899b36a7e1f3ca8bb7473df9622
  • master default protected
2 results

commentaires.py

Blame
  • gamemanager.cpp 14.65 KiB
    #include "gamemanager.h"
    #include "random"
    #include <QFileInfo>
    #include <QDebug>
    
    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)
            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();
        m_gameOver = isGameOver();
        //Mettre a jour l'état et l'enregistrer
        historyArray.append(gridToJsonArray());
        emit gridChanged();
        emit calculscore();
    }
    
    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)
            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();
        m_gameOver = isGameOver();
    
        //Mettre a jour l'état et l'enregistrer
        historyArray.append(gridToJsonArray());
        emit gridChanged();
        emit calculscore();
    
    }
    
    
    
    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
            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();
        m_gameOver = isGameOver();
    
        //Mettre a jour l'état et l'enregistrer
        historyArray.append(gridToJsonArray());
        emit gridChanged();
        emit calculscore();
    }
    
    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
            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();
        m_gameOver = isGameOver();
    
        //Mettre a jour l'état et l'enregistrer
        historyArray.append(gridToJsonArray());
        emit gridChanged();
        emit calculscore();
    
    }
    
    void GameManager::restartGame(QString partieName) {
    
        //demander pour sauvergarder la partie précédente
    
    <<<<<<< HEAD
        if(partieName=="false"){
            }else{
            enregistrerPartie(partieName);
            };
    =======
        enregistrerPartie("partie1");
        m_gameOver = false;
    >>>>>>> e22daca7a3c09bd0a515d12093b0cbf7e3e4e152
    
    
        // Réinitialisation des variables
        grid.assign(4, std::vector<int>(4, 0));
        historyArray = QJsonArray();
    
        std::random_device rd;
        std::uniform_int_distribution<int> distrib(0, 15);
    
        int num1 = distrib(rd);
        int num2;
    
        // Assure que num2 est différent de num1
        do {
            num2 = distrib(rd);
        } while (num2 == num1);
    
        int rg1= num1/4;
        int col1= num1 - (4*rg1);
    
        int rg2= num2/4;
        int col2= num2 - (4*rg2);
    
        grid[rg1][col1]=2;
        grid[rg2][col2]=2;
    
    
        //Mettre a jour l'état et l'enregistrer
        historyArray.append(gridToJsonArray());
        emit gridChanged();
        emit calculscore();
    
    }
    
    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'ou un '4' dans cette case
            int randValue = std::rand() % 100;
            if (randValue < 75) {
                grid[row][col] = 2;
            } else {
                grid[row][col] = 4;
            };
        }
    }
    
    QVector<int> GameManager::getGridValues() const {
        QVector<int> flattenedGrid;
        for (const auto& row : grid) {  // Parcourt chaque ligne
            for (int value : row) {      // Parcourt chaque colonne
                flattenedGrid.append(value);
            }
        }
        return flattenedGrid;
    }
    
    QStringList GameManager::getPartieHistorique() {
        QFile file("historique.json");
    
        qDebug() << "Fichier JSON enregistré à : " << QFileInfo(file).absoluteFilePath();
    
        if (!file.open(QIODevice::ReadWrite)) {
            qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString();
    
        }
        QJsonDocument doc;
        if (file.size() > 0) {  // Vérifier que le fichier n'est pas vide
            doc = QJsonDocument::fromJson(file.readAll());
        }else{  // Sinon initialiser avec un objet vide
            doc = QJsonDocument(QJsonObject());
        }
    
    
        QJsonObject rootObj = doc.object();
        QStringList list = rootObj.keys();
    
        file.close();
    
        qDebug() << "Liste des parties:" << list ;
        return list;
    
    }
    
    QJsonArray GameManager::gridToJsonArray() {
        QJsonArray jsonGrid;
        for (const auto &row : grid) {
            QJsonArray jsonRow;
            for (int cell : row) {
                jsonRow.append(cell);
            }
            jsonGrid.append(jsonRow); // Ajoute chaque ligne
        }
        return jsonGrid;
    }
    
    void GameManager::undo() {
        if (historyArray.size() > 1) {  // Vérifiez qu'il y a au moins deux états
            historyArray.removeLast();  // Supprimez le dernier état
            QJsonArray previousState = historyArray.last().toArray();  // Récupérez l'avant-dernier état
    
            // Mettez à jour la grille avec l'état précédent
            for (int i = 0; i < 4; ++i) {
                for (int j = 0; j < 4; ++j) {
                    grid[i][j] = previousState[i].toArray()[j].toInt();
                }
            }
    
            emit gridChanged();  // Notifiez que la grille a changé
            emit calculscore();
        }
    }
    
    void GameManager::enregistrerPartie(QString partieName){
        QFile file("historique.json");
        qDebug() << "Fichier JSON enregistré à : " << QFileInfo(file).absoluteFilePath();
        // Ouvrir le fichier en mode lecture/écriture (si existant)
        if (!file.open(QIODevice::ReadWrite)) {
            qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString();
            return;
        }
    
    
        QJsonDocument doc;
        if (file.size() > 0) {  // Vérifier que le fichier n'est pas vide
            doc = QJsonDocument::fromJson(file.readAll());
        }else{  // Sinon initialiser avec un objet vide
            doc = QJsonDocument(QJsonObject());
        }
    
    
        QJsonObject rootObj = doc.object(); // Récupérer l'objet JSON racine
        rootObj[partieName] = historyArray; // Ajouter ou remplacer la grille associée à l'ID
    
        // Réécriture du fichier avec la nouvelle version
        file.resize(0); // Effacer le contenu du fichier avant d'écrire la nouvelle version
        file.write(QJsonDocument(rootObj).toJson());
        file.close();
    
        emit historiqueChanged();
    }
    
    void GameManager::chargerPartie(QString partieName){
        QFile file("historique.json");
    
    
        // Ouvrir le fichier en mode lecture/écriture (si existant)
        if (!file.open(QIODevice::ReadWrite)) {
            qWarning() << "Impossible d'ouvrir le fichier pour écriture :" << file.errorString();
            return;
        }
    
    
        QJsonDocument doc;
        if (file.size() > 0) {  // Vérifier que le fichier n'est pas vide
            doc = QJsonDocument::fromJson(file.readAll());
        }else{  // Sinon erreur
            return;
        }
    
        QJsonObject rootObj = doc.object(); // Récupérer l'objet JSON racine
        historyArray = rootObj[partieName].toArray();  // Charger la grille
    
        QJsonArray previousState = historyArray.last().toArray();  // Récupérez le dernier état de la partie chargée
    
        // Mettez à jour la grille
        for (int i = 0; i < 4; ++i) {
            for (int j = 0; j < 4; ++j) {
                grid[i][j] = previousState[i].toArray()[j].toInt();
            }
        }
    
        emit gridChanged();  // Notifiez que la grille a changé
    
    
        file.close();
    }
    
    int GameManager::score() const {
        return m_score;  // Retourne le score actuel
    }
    
    <<<<<<< HEAD
    
    
    =======
    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
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                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
    }
    >>>>>>> e22daca7a3c09bd0a515d12093b0cbf7e3e4e152