diff --git a/Motus/Main.qml b/Motus/Main.qml index fae6a888e0f20d2f6ab3a8c4c18001ac4733e729..58f9e3ae46e6270949927c71130ad1664be93039 100644 --- a/Motus/Main.qml +++ b/Motus/Main.qml @@ -25,6 +25,16 @@ Window { property string mot: "" property var mot_split: [] + property var keysArray: [] + + function changeKeyColor(letter, newColor) { + for (var i = 0; i < keysArray.length; i++) { + if (keysArray[i].keyLetter === letter) { + keysArray[i].keyColor = newColor; + } + } + } + // Rectangle principal qui couvre la fenêtre Rectangle { id: mainRect @@ -57,21 +67,45 @@ Window { 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) { - var mot_entre = ""; + // Construire le mot entré en majuscules + var candidate = []; for (var i = 0; i < nb_lettres; i++){ - mot_entre += caseArray[current_essai * nb_lettres + i]._textText; + candidate[i] = caseArray[current_essai * nb_lettres + i]._textText.toUpperCase(); } +<<<<<<< Updated upstream console.log("Mot entré :", mot_entre.toUpperCase()); if (motusGame.existWord(mot_entre.toUpperCase())){ // Vérification de la proposition sur la ligne actuelle +======= + 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 = {}; +>>>>>>> Stashed changes for (var i = 0; i < nb_lettres; i++) { - var case_verif = caseArray[current_essai * nb_lettres + i]; - var lettre_verif = case_verif._textText; - if (lettre_verif === mot_split[i].toUpperCase()) { - case_verif.rectangleColor = "#42cc3d"; - case_verif.rectangleBordercolor = "#42cc3d"; + 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 (chaine 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 { +<<<<<<< Updated upstream for (var j = 0; j < nb_lettres; j++) { if (lettre_verif === mot_split[j].toUpperCase()) { @@ -101,17 +135,48 @@ Window { } // Passage à la ligne suivante si possible +======= + resultColors[i] = ""; // ne pas modifier le style + } + } + + // 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] === "") { // lettre non marquée en vert + var letter = candidate[i]; + if (targetCounts[letter] && targetCounts[letter] > 0) { + resultColors[i] = "#f0d437"; // jaune + targetCounts[letter]--; + } + // Sinon, resultColors[i] reste vide pour conserver le style de base + } + } + + // Appliquer les couleurs aux cases et aux touches uniquement si une couleur est 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 +>>>>>>> Stashed changes if (current_essai < nb_essais - 1) { current_essai++; indice_case = 0; + case_focus = caseArray[current_essai * nb_lettres]; } else { - // Fin de partie : vous pouvez désactiver l'interface ou afficher un message + // Fin de partie : désactiver l'interface ou afficher un message mot = ""; } } else { - // Le mot n'existe pas dans le dictionnaire : coloration en rouge puis réinitialisation - for (i = 0; i < nb_lettres; i++) { - case_verif = caseArray[current_essai * nb_lettres + i]; + // 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"; } @@ -120,6 +185,7 @@ Window { event.accepted = true; } } + } } // Disposition globale en colonne @@ -153,7 +219,6 @@ Window { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left anchors.leftMargin: 0.05*Window.width - anchors.verticalCenterOffset: 20 Column { id: column_buttons @@ -383,9 +448,10 @@ Window { delegate: Rectangle { width: (modelData === "Entrée" || modelData === "<") ? 80 : 50 height: 60 - color: "#808080" + color: keyColor // Lier la couleur affichée à keyColor radius: 5 - border.color: "#808080" + border.color: keyColor // Pareil pour la bordure + Text { anchors.centerIn: parent text: modelData @@ -415,14 +481,16 @@ Window { } } } + Component.onCompleted: { + // Enregistrer chaque touche dans keysArray pour y accéder plus tard + mainWindow.keysArray.push(keyRect) + } } } } } } } - - } }