Select Git revision
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();
}