PROJET AUTOBLOG


ThomasInTheSky

Archivé

source: ThomasInTheSky

⇐ retour index

Lettres : algorithme open-source d’aide aux jeux de lettres

samedi 20 juillet 2013 à 11:30

Je suis sûr qu’il vous est déjà arrivé de jouer au Scrabble par exemple et de ne rien trouver. Heureusement, j’ai la solution pour vous aider, et même dans d’autres jeux !

Je vous présente donc Lettres, un programme simple créé en .NET vous permettant de trouver des mots à partir d’une liste de lettre. En effet, il pourra non seulement vous aider au Scrabble avec cette fonctionnalité, mais aussi aux jeux comme 4 image 1 mot (et tous les autres du genre qui font fureur en ce moment sur les smart devices). Il vous suffira d’entrer toutes les lettres dont vous disposez et de donner le nombre de lettres composant le mot et le programme cherchera automatiquement dans un dictionnaire prédéfini ou dans le votre si vous le souhaitez des mots qui correspondent. Il vous suffira ensuite de choisir celui qui va le mieux, c’est aussi simple que cela.

Pourquoi avoir fait ce programme ? Vous savez, je connais beaucoup de jeux sur iOS et Android, et certains d’entre eux sont de vraies œuvres d’art. Il ne me dérange donc pas de verser quelques centimes pour rémunérer le développeur qui aura sans doute travaillé dur pour le finir et proposer quelque chose de stable aux utilisateurs. Seulement, je ne pense pas que les auteurs des nombreux jeux de lettres soient aussi méritants. En effet, la plupart auront copié une idée de départ (qui comme elle est simple, et facile à reproduire) et le développeur original n’aura pas non plus eu à déplacer des montagnes pour coder ce genre de trucs. Alors vous comprendrez que verser un euro pour avoir la solution à cinq énigmes, ça me dérange un peu. En plus si vous avez différents jeu, il faut payer pour chaque jeu, ce qui vous fait pas mal d’argent à la fin.

1. Si vous êtes uniquement utilisateur

Dans ce cas là, pas la peine de vous compliquer la vie. Téléchargez le programme (au bas de la page) et lancez-le. Vous vous retrouverez en face d’une fenêtre de ce type :

Démarrage Lettres 1.1.1

Notez qu’il est possible que l’apparence de la fenêtre diffère un peu en fonction de la version du programme et de votre système d’exploitation. Mais ça devrait quand même globalement rester ça. Alors, pour l’utilisation, voilà comment ça se passe. Déjà, sachez que vous aurez le choix entre utiliser un dictionnaire personnalisé et le dictionnaire intégré. Vous pouvez prendre ce dernier pour la plupart des utilisations (il contient plus de deux cent mille mots de la langue française :)), sinon, utilisez Parcourir pour choisir un fichier contenant une liste de mots, chaque mot étant sur une ligne, de cette façon :

Mot 1
Mot 2
Mot 3
Mot 4
Mot 5
Mot 6
Mot n

Le dictionnaire peut bien sûr contenir autant de mots que vous voulez. Une fois le dictionnaire choisi, cliquez sur “Charger le dictionnaire”, après avoir sélectionné ReadLine ou Split. Ces deux boutons décrivent la technique qui devra être utilisée pour lire le dictionnaire. Les résultats dépendront de votre ordinateur, je vous conseille d’essayer les deux pour être fixé sur le quel est le meilleur pour vous. Une fois le dictionnaire chargé, passons à la suite. Le champ nombre de lettres décrit le nombre de lettres qu’il devra y avoir dans le mot final. Le champ lettres précise de quelles lettre vous disposez. Deux cas possibles :

  1. Vous n’avez que les lettres du mot, mais dans le désordre
  2. Vous avez les lettres du mot plus d’autres lettres

Dans les deux cas, il est possible que vous récupéreriez plusieurs mots à la sortie (ce sont des anagrammes du mot, il suffit de voir le quel va mieux dans votre cas). Si jamais vous avez plus de lettres que le mot en contient, il est fortement possible que vous récupéreriez plus de mots à la sortie qu’un seul. Il faudra encore une fois voir le quel va mieux. Pour générer les mots, cliquez sur Trouver les mots. Pendant la recherche, l’interface du programme s’arrêtera de répondre. Si jamais Windows vous avertit d’une erreur (et notamment d’un ne répond pas), ignorez le message ou dites lui d’attendre, c’est tout à fait normal. Si vous vous demandez pourquoi ne pas avoir ajouté de barre de progression à la recherche, c’est pour des raisons techniques et d’optimisation. En effet, ajouter une barre de progression ajouterait des opérations à exécuter, et pourrait multiplier le temps d’exécution jusque par trois fois. Note : Plus vous aurez de lettre dans votre mot, moins vous aurez de mots erronés, par exemple, une recherche avec dix lettres fournies pour un mot de quatre lettres produira beaucoup plus de résultats qu’une recherche d’un mot de huit lettres avec dix lettres données.

Il est aussi possible que vous ayez utilisé l’option “placer une lettre” une ou plusieurs fois et que du coup une lettre soit déjà dans le mot… Tant mieux ! C’est pris en charge par le programme. Pour utiliser cette fonctionnalité, il vous suffit de remplir le champ “Lettres connues” de cette façon :

<position1>;<lettre1>,<position2>;<lettre2>,<positionX>;<lettreX>

Vous pouvez mettre autant de lettres que vous le souhaitez. Par exemple, dans ce cas, la fenêtre ressemblera à ça.

A quoi sert l’option Vider la mémoire ?

Si jamais vous avez chargé un dictionnaire et que vous en changez, il est fortement recommandé d’exécuter cette option afin que le programme ne se mélange pas les pinceaux entre les données précédentes et actuelles. C’est quasiment vital.

Mon dictionnaire n’est pas séparé par des sauts de ligne, comment faire ?

Dans votre cas, vous serez obligés de passer par la méthode Split. Cliquez sur Split et entrez le séparateur des mots dans le champ Séparateur. Si jamais votre dictionnaire est séparé par des sauts de ligne et que vous voulez utiliser Split, il suffit de laisser le champ vide.

Exemple d’utilisation :

Screenshot_2013-07-19-14-52-22

donnera :

Capture 2

2. Si vous êtes développeur (ou curieux)

1. Comment fonctionne Lettres ?

Lettres est relativement simple. Je vais donc vous décrire le moyen de fonctionnement de Lettres en langage naturel.

1. Charger le dictionnaire

Pour cela, j’utilise un StreamReader (System.IO.StreamReader), un tableau de String et une boucle.

Variable Tableau Dictionnaire
Variable Ligne = Lire une ligne dans le fichier
Tant que (Ligne != "")
    Changer la taille de Dictionnaire : nouvelle taille = taille + 1
    Dictionnaire(taille de dictionnaire - 1) = Ligne
    Ligne = Lire une ligne dans le fichier
Fin Tant Que

 2. Dans le cas où on a le nombre exact de lettres

On a notre dictionnaire et un nombre de lettres qui devront toutes être utilisées. On a aussi un tableau Alphabet qui contient toutes les lettres de l’alphabet. Et c’est tout.

Variable LettresDonnees
Variable Tableau LettresUtilisables
Variable Tableau LettresDansMotAnalysé
Variable Tableau BonMots

Pour i allant de 0 à TailleDeAlphabet - 1
    LettresUtilisables(i) = CompterOccurences(LettresDonnees, Alphabet(i))
Fin Pour

Pour i allant de 0 à TailleDeDictionnaire - 1
    Pour j allant de 0 à TailleDeAlphabet - 1
        TailleDeLettresDansMotAnalysé(i) = CompterOccurences(Dictionnaire(i), Alphabet(j))
    Fin Pour
    Variable Booléen Bon = False
    Pour j allant de 0 à TailleDeLettresUtilisables - 1
        Si LettresUtilisables(j) = LettresDansMotAnalysé(j)
            Bon = True
        Sinon
            Bon = False
            Sortir du Pour
        Fin Si
    Fin Pour
    Si Bon
        Changer la taille de BonMots : nouvelle taille = taille + 1
        BonMots(taille de BonMots - 1) = TableauDictionnaire(i)
    Fin Si
Fin Pour

On récupère donc un tableau BonMots qui contient tous les mots qui correspondent à nos critères. Il ne reste plus qu’à les ajouter à la liste! On aurait pu utiliser pour ce cas la même méthode que pour le deuxième, mais j’ai trouvé intéressant d’utiliser deux techniques différentes.

3. Dans le cas où on a des lettres en plus

Cette fois ci, on a des lettres et une taille pour le mot final. Mais on a surtout des lettres en trop. On aura forcément une marge d’erreur où on utilisera ces lettres supplémentaires, puisqu’on ne sait pas les quelles utiliser. Ce cas est un peu plus compliqué.

Variable TailleMot

Pour i allant de 0 à TailleDeDictionnaire - 1
    Si Taille de Dictionnaire(i) = TailleMot
        Variable AlphabetTemporaire = LettresDonnees
        Variable Bon = False
        Pour j allant de 0 à TailleDeDictionnaire(i) - 1
            Variable LettreEnCours = SupprimerAccents(Dictionnaire(i))
            If AlphabetTemporaire contient LettreEnCours
                Variable nbrLettreEnCours = CompterOccurences(AlphabetTemporaire, LettreEnCours)
                AlphabetTemporaire = Remplacer LettreEnCours par "" (Rien) dans AlphabetTemporaire
                Pour k allant de 1 à nbrLettreEnCours - 1
                    Dictionnaire = Dictionnaire et LettreEnCours
                Fin Pour
                Bon = True
            Sinon
                Bon = False
                Sortir du For
            Fin Si
        Fin Pour
        Si Bon
            Changer la taille de BonMots : nouvelle taille = taille + 1
            BonMots(taille de BonMots - 1) = TableauDictionnaire(i)
        Fin Si
    Fin Si
Fin Pour

Encore une fois il ne nous reste plus qu’à ajouter les mots à la ListBox.

4. Questions et remarques

Pourquoi avoir créé plusieurs fonctions, une seule n’aurait-elle pas suffit avec des if ?

A vrai dire, si j’aurais pu ne conserver qu’une seule et unique fonction qui aurait fait des tests à chaque tour dans le For pour voir si tel ou tel truc était coché, mais par souci d’optimisation, j’ai préféré en garder plusieurs.

Les liens de téléchargement :

Anciennes versions :

Pour que le programme fonctionne, il faudra avoir installé le .NET Framework. Il y a des chances qu’il le soit déjà, mais de toute façon s’il ne l’est pas, le programme l’installera automatiquement.

Changelog :
    20/07/2013 Version 1.0
        - Première version
    20/07/2013 Version 1.0.1
        - Ajout de la barre de progression lors de la recherche des mots
    05/08/2013 Version 1.1
        - Ajout de la boîte de dialogue Aide
        - Ajout de la prise en charge des lettres déjà placées
    05/08/2013 Version 1.1.1
        - Modifications dans l'interface