diff --git a/motus/CMakeLists.txt b/motus/CMakeLists.txt index 7a913d9622fde97304528820dfe73bfb4327ed09..bd2571fbcdc12fb73f708f2c4fe8716376274d78 100644 --- a/motus/CMakeLists.txt +++ b/motus/CMakeLists.txt @@ -35,7 +35,7 @@ qt_add_qml_module(appmotus RESOURCES QML_FILES GameWindow.qml SOURCES jeu.h jeu.cpp - SOURCES grillemanager.h grillemanager.cpp + SOURCES QML_FILES Case.qml QML_FILES Grille.qml SOURCES lettermodel.h lettermodel.cpp diff --git a/motus/GameWindow.qml b/motus/GameWindow.qml index 79a13687f694a526559a623c1ed3c5aeb092f0a7..c12e87f21e57f08ece434a781501dbcfc8961fcc 100644 --- a/motus/GameWindow.qml +++ b/motus/GameWindow.qml @@ -11,28 +11,20 @@ Item { anchors.fill: parent Grid { - id: letterGrid - columns: 8 + id: grid + columns: 5 rows: 5 - spacing: 4 - anchors.centerIn: parent - width: 600 - height: 400 + spacing: 5 Repeater { - model: letterModel // <-- C++ ListModel exposé ici - delegate: Rectangle { - width: 60 - height: 60 - color: "#dddddd" - border.color: "#888" - radius: 5 - - Text { - anchors.centerIn: parent - text: model.letter - font.pixelSize: 24 - } + model: grid.columns * grid.rows + Rectangle { + id: cell + width: 50 + height: 50 + color: "lightgray" + border.color: "black" + objectName: "cell_" + index % grid.columns + "_" + Math.floor(index / grid.columns) } } } diff --git a/motus/Main.qml b/motus/Main.qml index 8d38be1289ebd863a0b8a5da2c3fb2df40a077a0..94633b495a9ba6822e2f04261b725e58f6970bff 100644 --- a/motus/Main.qml +++ b/motus/Main.qml @@ -46,12 +46,5 @@ Window { id: pageLoader anchors.centerIn: parent - // Once the page is loaded, notify C++ - onItemChanged: { - if (item) { - // Call a function in C++ and pass the root item of GameWindow - jeu.setGameWindowItem(item); - } - } } } diff --git a/motus/brain.cpp b/motus/brain.cpp index 985ad217bbe958e9d4c9b582da0dbcf8926a2360..539cc2075c879dc868cd3fb67b61c8fffd3bc9a3 100644 --- a/motus/brain.cpp +++ b/motus/brain.cpp @@ -3,7 +3,6 @@ #include <random> #include <iostream> #include <filesystem> -#include "grillemanager.h" #include "fullligneexception.h" #include <QString> @@ -13,12 +12,20 @@ namespace fs = std::filesystem; #include "nowordexception.h" #include "brain.h" -Brain::Brain(QQmlComponent *grilleComponent, string dicodir, QQuickItem * parentItem) : dicodir(dicodir), parentItem(parentItem), grilleComponent(grilleComponent) { +Brain::Brain(string dicodir) : dicodir(dicodir) { vector<string> files = getTxtFiles(); // TODO // Initialise le menu déroulant avec files } +string Brain::getGrid() { + string res = ""; + for (int i=0;i<mNbEssaisMax;i++) { + res += lignes[i]->getMot(); + } + return res; +} + vector<string> Brain::getTxtFiles() { vector<string> txtFiles; @@ -103,8 +110,6 @@ void Brain::initGame() { // Convertir std::string (getMot()) en QString QString motQString = QString::fromStdString(getMot()); // Conversion de std::string en QString - GrilleManager grille(motQString); // Passer le QString à GrilleManager - grille.createGrid(grilleComponent, parentItem,this, mNbEssaisMax, mTailleMot); // Créer la grille } catch (NoWordException e) { cout << e.what() << endl; } diff --git a/motus/brain.h b/motus/brain.h index 1db79ebe0d365a80bcbf634384cc51c70a2b21ba..9f0ffe35dad84bdbdbb03be9c754713258f33937 100644 --- a/motus/brain.h +++ b/motus/brain.h @@ -13,7 +13,7 @@ using namespace std; class Brain { public: - Brain(QQmlComponent *grilleComponent, string dicodir, QQuickItem * parentItem); + Brain(string dicodir); void trouveMot(); void setFichierDico(string fichierDico); void setNombreEssais(int nbEssais); @@ -25,6 +25,7 @@ public: vector<string> getTxtFiles(); void entreLettre(char lettre); void supprLettre(); + string getGrid(); vector<Ligne*> lignes; private: @@ -35,8 +36,6 @@ private: int nbEssais; int mTailleMot; map<char, int> lettres; - QQuickItem * parentItem; - QQmlComponent *grilleComponent; }; #endif // BRAIN_H diff --git a/motus/grillemanager.cpp b/motus/grillemanager.cpp deleted file mode 100644 index 5f99dfb817a839a25add69dbc9135f19769a4492..0000000000000000000000000000000000000000 --- a/motus/grillemanager.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "grillemanager.h" - -GrilleManager::GrilleManager(const QString &mot, QObject *parent) - : QObject(parent), m_mot(mot) {} - -void GrilleManager::createGrid(QQmlComponent *grilleComponent, QQuickItem * parentItem,Brain* brain, int rows, int columns) { - m_cases.clear(); // Vide la grille avant de la remplir - - // Remplir la grille avec des cases - for (int i = 0; i < rows * columns; ++i) { - VraieCase* lacase = brain->lignes[i / columns]->contenu[i % columns]; - - // Si on est à la première case, on met la première lettre du mot, sinon on met '_' - if (i < m_mot.length()) { - lacase->setLetter(m_mot[i]); // Conversion automatique depuis QString - } else { - lacase->setLetter(QString("_")); // Conversion du char '_' en QString - } - - m_cases.append(lacase); - } - - - // context->setContextProperty("jeu", jeu); - - if (grilleComponent->status() == QQmlComponent::Ready) { - QObject *object = grilleComponent->create(); - QQuickItem *item = qobject_cast<QQuickItem *>(object); - if (item) { - // Add it to the parent item - item->setParentItem(parentItem); - } - } else { - qWarning() << "Failed to load QML component:" << grilleComponent->errorString(); - } - - emit casesChanged(); // Émettre le signal pour indiquer que la grille a changé -} - -QQmlListProperty<VraieCase> GrilleManager::getCases() { - return QQmlListProperty<VraieCase>(this, &m_cases); // Passer un pointeur à la liste -} diff --git a/motus/grillemanager.h b/motus/grillemanager.h deleted file mode 100644 index 00f1d1a9e67f6baf0184069c0c33a2ae775354c6..0000000000000000000000000000000000000000 --- a/motus/grillemanager.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GRILLEMANAGER_H -#define GRILLEMANAGER_H - -#include <QObject> -#include <QQmlListProperty> -#include "vraiecase.h" -#include "brain.h" - -class GrilleManager : public QObject { - Q_OBJECT - Q_PROPERTY(QQmlListProperty<VraieCase> cases READ getCases NOTIFY casesChanged) - -public: - explicit GrilleManager(const QString &mot, QObject *parent = nullptr); // Le mot en argument - void createGrid(QQmlComponent *grilleComponent, QQuickItem * parentItem, Brain* brain, int rows, int columns); // Créer la grille - QQmlListProperty<VraieCase> getCases(); // Obtenir les cases - -signals: - void casesChanged(); - -private: - QString m_mot; - QList<VraieCase *> m_cases; // Liste des cases de la grille -}; - -#endif // GRILLEMANAGER_H diff --git a/motus/jeu.cpp b/motus/jeu.cpp index 0ab0812eb166d19c586e71b14cbacd210b450cc8..9e14b8347861cad2d90180f754f2cb17778d7873 100644 --- a/motus/jeu.cpp +++ b/motus/jeu.cpp @@ -1,9 +1,10 @@ #include "jeu.h" #include <iostream> +#include <QString> +Jeu::Jeu(QObject *parent) : QObject(parent) { -Jeu::Jeu(QObject *parent) : QObject(parent), grilleManager("", this) { } // void Jeu::setMot(const QString& mot) { @@ -17,24 +18,23 @@ QString Jeu::getMotAffiche() { return mot; } -void Jeu::setContext(QQmlComponent *grilleComponent, QQuickItem* parentItem) { - grilleComponent = grilleComponent; - parentItem = parentItem; - brain = new Brain(grilleComponent,"./",parentItem); -} - void Jeu::onClavierClick(QString lettre) { + + if (!m_letterModel) return; - if (currentIndex < 40) { // on évite de dépasser la grille - m_letterModel->setLetter(currentIndex, lettre); - currentIndex++; - } + // if (currentIndex < 40) { // on évite de dépasser la grille + // m_letterModel->setLetter(currentIndex, lettre); + // currentIndex++; + // } brain->entreLettre(lettre.toStdString()[0]); + for (int index = 0; index < 40; index ++) { + m_letterModel->setLetter(index, QString::fromLatin1(&brain->getGrid()[index], 1)); + } } diff --git a/motus/jeu.h b/motus/jeu.h index b5fb35780d111bd674e2ab86f62ce464ac8a3990..a0e24ccbb072cf50e6908d7ea41f1e0950144860 100644 --- a/motus/jeu.h +++ b/motus/jeu.h @@ -5,13 +5,11 @@ #include <QQuickItem> #include <QQmlComponent> #include "brain.h" -#include "grillemanager.h" #include "lettermodel.h" class Jeu : public QObject { Q_OBJECT Q_PROPERTY(QString motAffiche READ getMotAffiche NOTIFY motChanged) - Q_PROPERTY(GrilleManager* grilleManager READ getGrilleManager CONSTANT) Q_PROPERTY(QQuickItem* gameWindow READ getGameWindow NOTIFY gameWindowChanged) public: @@ -20,9 +18,7 @@ public: Q_INVOKABLE void onClavierClick(QString lettre); Q_INVOKABLE void initGame(); Q_INVOKABLE void startGame(); // pour init depuis QML - GrilleManager* getGrilleManager() { return &grilleManager; } QQuickItem* getGameWindow() const { return gameWindow; } // Getter for gameWindow - void setContext(QQmlComponent *grilleComponent, QQuickItem* parentItem); void setLetterModel(LetterModel* model); // Setter pour le modèle @@ -33,8 +29,6 @@ signals: private: Brain* brain; QString mot; - GrilleManager grilleManager; - QQmlComponent* grilleComponent; QQuickItem* gameWindow; // Pointer to the QQuickItem of the GameWindow LetterModel* m_letterModel = nullptr; // Modèle QML int currentIndex = 0; // Pour suivre où on écrit diff --git a/motus/ligne.cpp b/motus/ligne.cpp index 78a424521f81501c1310390cd74475d4f59ddd6c..69a9a0ca353e01df9121179f5c5de88dae349dbb 100644 --- a/motus/ligne.cpp +++ b/motus/ligne.cpp @@ -20,24 +20,33 @@ bool Ligne::isGameCleared() { show(); for (int i = 0; i < bonmot.length(); i++) { char bonnelettre = toupper(bonmot[i]); // Convert to uppercase - QChar lettreacomparer = contenu[i]->getLetter().at(0); // Get the QChar from contenu - int etat1 = (bonnelettre == lettreacomparer.toUpper().toLatin1()) ? 1 : 0; + char lettreacomparer = contenu[i]->getLetter(); // Get the QChar from contenu + int etat1 = (bonnelettre == lettreacomparer) ? 1 : 0; int etat2 = Ligne::dansMot(lettreacomparer, bonmot); int etat = etat1+etat2; cout << etat1 << etat2 << endl; contenu[i]->setEtat(etat); } - cout << "TEST" << endl; + + show(); return (nbjustes == 2*bonmot.length()); } +string Ligne::getMot() { + string res = ""; + for (int i=0;i<bonmot.length();i++) { + res = res + contenu[i]->getLetter(); + } + return res; +} + void Ligne::show() { cout << "La ligne : |"; for (int i=0;i<bonmot.length();i++) { if (contenu[i]->getEtat() == 1) {cout << "\033[33m";} if (contenu[i]->getEtat() == 2) {cout << "\033[31m";} - cout << contenu[i]->getLetter().toStdString(); + cout << contenu[i]->getLetter(); if (contenu[i]->getEtat() >= 1) cout << "\033[30m"; } cout << "|" << endl; @@ -45,7 +54,7 @@ void Ligne::show() { bool Ligne::dansMot(QChar lettre, string mot) { for (int i=0;i<mot.length();i++) { - if (toupper(mot[i]) == lettre.toLatin1()) { + if (mot[i] == lettre) { return true; } } @@ -56,7 +65,7 @@ void Ligne::entreLettre(char lettre) { if (positionCurseur == bonmot.length()) { throw FullLigneException(); } - contenu[positionCurseur]->setLetter(QChar(lettre)); // Conversion ici + contenu[positionCurseur]->setLetter(lettre); // Conversion ici positionCurseur++; } @@ -65,6 +74,6 @@ void Ligne::supprLettre() { throw EmptyLigneException(); } cout << "Suppression d'une lettre" << endl; - contenu[positionCurseur - 1]->setLetter(QChar(' ')); + contenu[positionCurseur - 1]->setLetter(' '); positionCurseur--; } diff --git a/motus/ligne.h b/motus/ligne.h index 8cef7c958de02fe775f1da7ac66e90d63b4399ad..0cc9498cd23d0fbccdd1d2f1407932bfaad64b54 100644 --- a/motus/ligne.h +++ b/motus/ligne.h @@ -23,6 +23,7 @@ public: void supprLettre(); void show(); vector<VraieCase*> contenu; + string getMot(); private: string bonmot; diff --git a/motus/main.cpp b/motus/main.cpp index b8a19260a1316d579d54c657ea33fcb401b31812..f65c4ed875e02e2424058f540597b82095aed9ea 100644 --- a/motus/main.cpp +++ b/motus/main.cpp @@ -5,7 +5,6 @@ #include <QQmlApplicationEngine> #include "jeu.h" #include "vraiecase.h" -#include "grillemanager.h" #include "lettermodel.h" int main(int argc, char *argv[]) { @@ -13,7 +12,6 @@ int main(int argc, char *argv[]) { QQmlApplicationEngine engine; qmlRegisterType<VraieCase>("motus", 1, 0, "VraieCase"); - qmlRegisterType<GrilleManager>("motus", 1, 0, "GrilleManager"); @@ -25,16 +23,12 @@ int main(int argc, char *argv[]) { QObject *rootObject = engine.rootObjects().first(); // Gets the first root object QQuickItem *rootItem = qobject_cast<QQuickItem *>(rootObject); - QQmlComponent grilleComponent(&engine, QUrl::fromLocalFile("../../Grille.qml")); - QQuickItem *parentItem = rootItem; // Créer l'objet Jeu sans mot - Jeu jeu; + Jeu jeu(rootObject); jeu.setLetterModel(&letterModel); engine.rootContext()->setContextProperty("jeu", &jeu); - jeu.setContext(&grilleComponent,parentItem); - return app.exec(); } diff --git a/motus/vraiecase.cpp b/motus/vraiecase.cpp index 39e89d78d8680e2606a5ac940e0385fa4966d4d9..387d590dacce20250daf1ef94a5431d1f670f181 100644 --- a/motus/vraiecase.cpp +++ b/motus/vraiecase.cpp @@ -1,15 +1,14 @@ #include "vraiecase.h" -VraieCase::VraieCase(QObject *parent) : QObject(parent), lettre(""), etat(0) {} +VraieCase::VraieCase() : lettre(' '), etat(0) {} -QString VraieCase::getLetter() const { +char VraieCase::getLetter() const { return lettre; } -void VraieCase::setLetter(const QString &letter) { +void VraieCase::setLetter(const char &letter) { if (lettre != letter) { lettre = letter; - emit letterChanged(); } } @@ -20,6 +19,5 @@ int VraieCase::getEtat() const { void VraieCase::setEtat(int e) { if (etat != e) { etat = e; - emit etatChanged(); } } diff --git a/motus/vraiecase.h b/motus/vraiecase.h index b8346da7ec9c022f155d45fe7c455a34f0d55a29..a00dd2d0ddaef6d7514eac557d3528bc45463340 100644 --- a/motus/vraiecase.h +++ b/motus/vraiecase.h @@ -2,28 +2,18 @@ #define VRAIECASE_H #include <QObject> -#include <QString> - -class VraieCase : public QObject { - Q_OBJECT - Q_PROPERTY(QString letter READ getLetter WRITE setLetter NOTIFY letterChanged) - Q_PROPERTY(int etat READ getEtat WRITE setEtat NOTIFY etatChanged) - +class VraieCase { public: - explicit VraieCase(QObject *parent = nullptr); + VraieCase(); - QString getLetter() const; - void setLetter(const QString &letter); // Mise à jour du type + char getLetter() const; + void setLetter(const char &letter); // Mise à jour du type int getEtat() const; void setEtat(int etat); -signals: - void letterChanged(); - void etatChanged(); - private: - QString lettre; + char lettre; int etat; };