Skip to content
Snippets Groups Projects
Select Git revision
  • 4a4b081398b4206ccbe17d7c83a1c28fb349d5b9
  • master default protected
2 results

brain.cpp

Blame
  • brain.cpp 3.73 KiB
    #include <fstream>
    #include <vector>
    #include <random>
    #include <iostream>
    #include <filesystem>
    #include "fullligneexception.h"
    #include "emptyligneexception.h"
    #include <QString>
    
    using namespace std;
    namespace fs = std::filesystem;
    
    #include "nowordexception.h"
    #include "brain.h"
    
    Brain::Brain(string dicodir) : dicodir(dicodir), nbEssais(0), inGame(0) {
        vector<string> files = getTxtFiles();
        // TODO
        // Initialise le menu déroulant avec files
    }
    
    string Brain::getGrid() {
        string res = "";
    
        if (inGame > 0) {
            for(int i=0;i<2;i++) {res += "        ";}
             res += (inGame == 1) ? "  LOSER  " : " WINNER ";
            for(int i=0;i<2;i++) {res += "        ";}
            return res;
        }
    
        for (int i=0;i<mNbEssaisMax;i++) {
            res += lignes[i]->getMot();
        }
        return res;
    }
    
    vector<string> Brain::getTxtFiles() {
        vector<string> txtFiles;
    
        try {
            // Iterate through the folder
            for (const auto& entry : fs::directory_iterator(dicodir)) {
                if (entry.is_regular_file() && entry.path().extension() == ".txt") {
                    txtFiles.push_back(entry.path().string());  // Add the file path to the vector
                }
            }
        } catch (const exception& e) {
            std::cerr << "Error reading directory: " << e.what() << std::endl;
        }
    
        return txtFiles;
    }
    
    void Brain::entreLettre(char lettre) {
        if (inGame > 0) return;
    
        if (lettre == '0') {
            validateWord();
            return;
        }
        if (lettre == '!') {
            try {
                supprLettre();
                lignes[nbEssais]->show();
            }
            catch (EmptyLigneException e) {
                cout << e.what() << endl;
            }
            return;
        }
        try {
            lignes[nbEssais]->entreLettre(lettre);
            lignes[nbEssais]->show();
        }
        catch (FullLigneException e) {
            cout << e.what() <<endl;
        }
    }
    void Brain::supprLettre() {
        lignes[nbEssais]->supprLettre();
    }
    
    void Brain::trouveMot() {
    
        vector<string> listeMots;
    
        ifstream file(dico);
        if (!file) {
            throw runtime_error("Error opening file "+dico);
        }
    
        string line;
        cout << "Mot de taille : " << mTailleMot << " dans " << dico << endl;
        while (std::getline(file, line)) {
            if (line.length() == mTailleMot + 1) {
                listeMots.push_back(line.substr(0, 8));
            }
        }
    
        file.close();
    
        if (listeMots.size() == 0) {throw NoWordException(mTailleMot, dico);}
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<int> dist(0, listeMots.size() - 1);
    
        int randomindex = dist(gen);
    
        mot = listeMots.at(randomindex);
    }
    
    void Brain::setFichierDico(string fichierDico) {dico = fichierDico;}
    void Brain::setNombreEssais(int nbEssais) {mNbEssaisMax = nbEssais;}
    void Brain::setTailleMots(int tailleMot) {mTailleMot = tailleMot;}
    string Brain::getMot() {return mot;}
    
    
    void Brain::initGame() {
        try {
            trouveMot();
            for (int i=0;i<mNbEssaisMax;i++) {
                lignes.push_back(new Ligne(getMot()));
                lignes[i]->initLigne();
            }
            cout << "Solution : " << getMot() << endl;
        } catch (NoWordException e) {
            cout << e.what() << endl;
        }
    }
    
    
    
    
    void Brain::validateWord() {
        // Appelé lorsqu'on appuie sur le bouton validate du clavier
        cout << "Validation de la ligne !" << endl;
    
        Ligne* laligne = lignes[nbEssais];
        if (laligne->isGameCleared()) {
            onGameFinish(true);
        }
        else {
            nbEssais++;
            if (nbEssais == mNbEssaisMax) {
                onGameFinish(false);
            }
        }
    }
    
    //
    void Brain::onGameFinish(bool isWin) {
        if (!isWin) {
            cout << "Perdu !" << endl;
            inGame = 1;
        }
        else {
            cout << "Gagné !" << endl;
            inGame = 2;
        }
    
        nbEssais = 0;
        lignes.clear();
    }