diff --git a/Motus/Main.qml b/Motus/Main.qml index 0388313b62c19c183b0da087ba88f3ad1cb5c699..fce82e3dd147f779e46a2df1cd014034053618c3 100644 --- a/Motus/Main.qml +++ b/Motus/Main.qml @@ -477,21 +477,117 @@ Window { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: { - if (modelData === "<") { - if (indice_case > 0) { - indice_case--; - caseArray[indice_case]._textText = ""; - case_focus = caseArray[indice_case]; + onClicked: { + if (mot !== "" && !motusGame.loosetry && !motusGame.win && !motusGame.loosetime) { + + // Gestion de la touche Backspace + if (modelData === "<") { + if (indice_case > 0) { + indice_case--; + var cellIndex = current_essai * nb_lettres + indice_case; + caseArray[cellIndex]._textText = ""; + event.accepted = true; + } } - } else if (modelData === "↑") { - // Action pour la touche "↑" si nécessaire - } else { - if (indice_case < caseArray.length) { - caseArray[indice_case]._textText = modelData.toUpperCase(); - indice_case++; - if (indice_case < caseArray.length) - case_focus = caseArray[indice_case]; + // Passage à la ligne suivante avec la touche Entrée + else if (modelData === "↑") { + if (indice_case === nb_lettres) { + // Construire le mot entré en majuscules + var candidate = []; + for (var i = 0; i < nb_lettres; i++){ + candidate[i] = caseArray[current_essai * nb_lettres + i]._textText.toUpperCase(); + } + var mot_entre = candidate.join(""); + console.log("Mot entré :", mot_entre); + + if (motusGame.existWord(mot_entre)) { + // Le mot existe, on procède à l'évaluation avec gestion des doublons + var target = mot_split.map(function(letter) { + return letter.toUpperCase(); + }); + + // Construire un tableau de fréquence des lettres du mot cible + var targetCounts = {}; + for (var i = 0; i < nb_lettres; i++) { + var letter = target[i]; + targetCounts[letter] = (targetCounts[letter] || 0) + 1; + } + + // Tableau pour stocker la couleur à appliquer pour chaque case. + // Par défaut, on ne change pas le style (chaîne vide) + var resultColors = new Array(nb_lettres); + + // Première passe : marquer en vert les lettres bien placées + for (var i = 0; i < nb_lettres; i++) { + if (candidate[i] === target[i]) { + resultColors[i] = "#42cc3d"; // vert + targetCounts[candidate[i]]--; + } else { + resultColors[i] = ""; + } + } + + // Vérifier si le mot entré correspond exactement au mot à deviner + if (mot_entre.toUpperCase() === mot.toUpperCase()) { + motusGame.setWinbool(true); + console.log("✅ Victoire !"); + } + + // Deuxième passe : marquer en jaune les lettres présentes mais mal placées + for (var i = 0; i < nb_lettres; i++) { + if (resultColors[i] === "") { + var letter = candidate[i]; + if (targetCounts[letter] && targetCounts[letter] > 0) { + resultColors[i] = "#f0d437"; // jaune + targetCounts[letter]--; + } + } + } + + // Appliquer les couleurs aux cases et aux touches si une couleur a été définie + for (var i = 0; i < nb_lettres; i++) { + var case_verif = caseArray[current_essai * nb_lettres + i]; + if (resultColors[i] !== "") { + case_verif.rectangleColor = resultColors[i]; + case_verif.rectangleBorderColor = resultColors[i]; + changeKeyColor(candidate[i], resultColors[i]); + } + } + + // Passage à la ligne suivante et mise à jour du focus + if (current_essai < nb_essais - 1) { + current_essai++; + indice_case = 0; + case_focus = caseArray[current_essai * nb_lettres]; + } else { + // Fin de partie : désactiver l'interface ou afficher un message + if (mot_entre.toUpperCase() !== mot.toUpperCase()) { + motusGame.setLoosetrybool(true); + console.log("loosetry=true"); + } + + } + } + + + else { + // Le mot n'existe pas dans le dictionnaire : colorer toute la ligne en rouge + for (var i = 0; i < nb_lettres; i++) { + var case_verif = caseArray[current_essai * nb_lettres + i]; + case_verif.rectangleColor = "#cf1b2a"; + case_verif.rectangleBorderColor = "#cf1b2a"; + } + revertTimer.start(); + } + } + } + // Saisie d'une lettre (de A à Z) + else{ + if (indice_case < nb_lettres) { + var cellIndex = current_essai * nb_lettres + indice_case; + caseArray[cellIndex]._textText = modelData.toUpperCase(); + indice_case++; + } } } }