diff --git a/Motus/Main.qml b/Motus/Main.qml index f355016a589efcae76967e2a8f2e219855296033..5642af2769d49d4aefa68c3e57d65340be9ffa6b 100644 --- a/Motus/Main.qml +++ b/Motus/Main.qml @@ -34,54 +34,43 @@ Window { // Gestion des touches du clavier physique (déclarée sous forme de fonction) Keys.onPressed: function(event) { - if (case_focus != -1 && mot != ""){ - - if (case_focus && case_focus._textText !== undefined && /^[a-zA-Z]$/.test(event.text)) { - case_focus._textText = event.text.toUpperCase(); - indice_case++; - if (indice_case < nb_lettres-1){ - case_focus = caseArray[indice_case+nb_lettres*current_essai]; - } - else { - case_focus = -1 + if (mot != ""){ + // Saisie d'une lettre (de A à Z) + if (/^[a-zA-Z]$/.test(event.text)) { + if (indice_case < nb_lettres) { // On s'assure de ne pas dépasser la ligne + let cellIndex = current_essai * nb_lettres + indice_case; + caseArray[cellIndex]._textText = event.text.toUpperCase(); + indice_case++; + event.accepted = true; } - - event.accepted = true; - } - - } - if (event.key === Qt.Key_Backspace) { - if (indice_case > 0 && indice_case != nb_lettres-1) { - indice_case--; - case_focus = caseArray[indice_case]; - case_focus._textText = " "; } - else if (indice_case === nb_lettres-1) { - case_focus = caseArray[indice_case+nb_lettres*current_essai];; - case_focus.textText = " "; - } - } - else if (event.key === Qt.Key_Return && indice_case === nb_lettres-1) { - - if (current_essai === nb_essais-1){ // on entre dans la boucle de l'endgame - // il faut bloquer toute interaction autre que relancer une partie ; - // reset les paramètres de gestion du focus des cases ; - // déclencher une animation de fin qui indique la victoire ou la défaite - // update les stats - nb_essais = 0; + // Gestion de la touche Backspace + else if (event.key === Qt.Key_Backspace) { + if (indice_case > 0) { // On peut effacer si on a déjà saisi une lettre + indice_case--; + let cellIndex = current_essai * nb_lettres + indice_case; + caseArray[cellIndex]._textText = ""; + event.accepted = true; + } } - else { // verificastr de la propal - // lettre mal placée : f0d437 (jaune) ; lettre mauvaise : 323232 (fond window) ; lettre bien placée : 23ed1c - current_essai ++; - case_focus = caseArray[indice_case+nb_lettres*current_essai]; - - - + // Passage à la ligne suivante avec la touche Entrée + else if (event.key === Qt.Key_Return) { + // On ne passe à la ligne suivante que si la ligne est complètement remplie + if (indice_case === nb_lettres) { + // Ici, vous pouvez ajouter la vérification de la proposition (vérifier les lettres, colorier, etc.) + if (current_essai < nb_essais - 1) { + current_essai++; + indice_case = 0; + } + else { + // Fin de partie : désactiver l'interface ou lancer une animation de fin, etc. + // Par exemple, réinitialiser nb_essais ou afficher un message + mot = ""; + } + event.accepted = true; + } } - - indice_case = 0; } - event.accepted = true; } // Disposition globale en colonne @@ -122,7 +111,7 @@ Window { anchors.fill: parent cursorShape: Qt.PointingHandCursor onClicked: { // début d'une game, il faut bloquer les boutons de régénération etc - mot = motusGame.getRandomWord(); + mot = motusGame.getRandomWord(nb_lettres); motusGame.startTimer(); case3._textText = mot; mot_split = mot.split(""); diff --git a/Motus/motusgame.cpp b/Motus/motusgame.cpp index 469d4a781cdda0b45c915cfd5f52ff6c09ee0825..4d12f5fda09d82457b43f90130292ed21624859f 100644 --- a/Motus/motusgame.cpp +++ b/Motus/motusgame.cpp @@ -42,30 +42,45 @@ MotusGame::MotusGame(QObject *parent) : QObject(parent) { // Générer un mot ////////////////////////////////////////////////////////////////////////////////////////// void MotusGame::loadWords() { - words.clear(); - QFile file(dictionnaryChoosed); // ✅ fonctionne avec le .qrc + // Vider la structure existante + wordsByLength.clear(); + QFile file(dictionnaryChoosed); // Fichier dans le .qrc if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine().trimmed(); - if (!line.isEmpty()) - words.append(line); + if (!line.isEmpty()) { + int len = line.length(); + // On ne conserve que les mots de 4 à 12 lettres + if (len >= 4 && len <= 12) { + wordsByLength[len].append(line); + } + } } file.close(); - qDebug() << "✅ Mots chargés :" << words.size(); + int totalWords = 0; + // Calcul du nombre total de mots chargés dans l'intervalle [4,12] + for (int i = 4; i <= 12; ++i) { + totalWords += wordsByLength[i].size(); + } + qDebug() << "✅ Mots chargés :" << totalWords; } else { - qDebug() << "❌ Erreur : impossible d'ouvrir words_alpha.txt"; + qDebug() << "❌ Erreur : impossible d'ouvrir" << dictionnaryChoosed; } } - - -QString MotusGame::getRandomWord() { - if (words.isEmpty()) +QString MotusGame::getRandomWord(int letterCount) { + // Vérifier que le nombre de lettres est dans l'intervalle autorisé + if (letterCount < 4 || letterCount > 12) { + qDebug() << "❌ Nombre de lettres invalide. Choisissez un nombre entre 4 et 12."; return ""; - - int index = QRandomGenerator::global()->bounded(words.size()); - motChoisi = words[index]; // <- ici on le stocke + } + if (!wordsByLength.contains(letterCount) || wordsByLength[letterCount].isEmpty()) { + qDebug() << "❌ Aucun mot disponible pour" << letterCount << "lettres."; + return ""; + } + int index = QRandomGenerator::global()->bounded(wordsByLength[letterCount].size()); + motChoisi = wordsByLength[letterCount][index]; // Stockage du mot choisi return motChoisi; } diff --git a/Motus/motusgame.h b/Motus/motusgame.h index af6081091a8a55f340be74f41652a84522361af8..1fcee8f461bdfa9c74e9bbc0b542abc4d496cf92 100644 --- a/Motus/motusgame.h +++ b/Motus/motusgame.h @@ -4,6 +4,7 @@ #include <QObject> #include <QString> #include <QStringList> +#include <QMap> #include <QTimer> @@ -24,7 +25,7 @@ class MotusGame : public QObject { public: explicit MotusGame(QObject *parent = nullptr); - Q_INVOKABLE QString getRandomWord(); + Q_INVOKABLE QString getRandomWord(int value); QString getDictionnaryChoosed() const; //Pour le changement de mot à deviner void setDictionnaryChoosed(const QString &value); @@ -45,6 +46,8 @@ private: QString motChoisi; // Mot choisi aléatoirement dans la liste, selon le nombre de lettres choisi par l'utilisateur + QMap<int, QStringList> wordsByLength; + int letterNumber; // Nombre de lettres dans le mot, choisi par l'utilisateur bool randomizeletterNumber = true;