
Un jeu de mots mêlés, ou “word search” en anglais, consiste à trouver des mots déterminés dans une grille remplie de lettres.
Les éléments sont :
Une grille
Considerons une grille carrée, de côté variable n. Elle contient n² cases indexées dans un tableau de 0 à n²-1. Par exemple, pour une grille de côté 5, on a 25 cases, numérotées de 0 à 24 :

Chaque case contiendra une seule lettre.
Des mots
Chaque mot a les attributs suivants :
- Orientation : horizontale, verticale, diagonale
- Texte inversé ou non
- Une case de départ
- Une case de fin

Dans l’exemple ci-dessus, le mot ROYAL est inversé, il est vertical, commence dans la case 1 et se termine dans la case 21.
Une base de données de mots
Les mots seront piochés au hasard. Les sites suivants proposent des dictionnaires libres de droit :
Vous disposez également du Wiktionnaire où il est possible de récupérer des définitions avec le script Wikparser (et en respectant la licence Creative Commons).
NB : Le code source dont le lien se trouve en bas de page contient une base SQLite de 30 000 mots.
Algorithme
Voici ma solution :
- On part d’une case au hasard. Ceci pour éviter de placer systématiquement un mot en première case de la grille.
- On tire au hasard l’orientation et l’inversion du mot.
- On tire au hasard une longueur de mot, comprise entre 3 et n (longueur du côté de la grille).
- Selon l’orientation :
- HORIZONTALE : Si le mot sort de la grille à droite et se retrouve placé sur 2 lignes, on le décale à gauche.
- VERTICALE : Si le mot dépasse de la grille en bas, on le décale vers le haut.
- DIAGONALE (haut gauche - bas droite) : Si le mot dépasse de la grille à droite, on décale à gauche. Si le mot dépasse de la grille en bas, on décale vers le haut.
- DIAGONALE (haut droite - bas gauche) : Si le mot sort de la grille à gauche, on décale à droite. Si le mot dépasse de la grille en bas, on décale vers le haut.
- On regarde si le mot placé passe sur des cases déjà occupées et on construit un pattern SQL. Par exemple dans l’image précédente contenant le mot
ROYAL. On veut dans la case 11 (contenant le Y), placer un mot horizontal de 4 caractères. Le pattern sera Y___. - On tire un mot au hasard correspond à ce pattern.
- Si on en trouve un, on l’ajoute à la liste des mots à chercher.
- Et on recommence avec la case suivante jusqu’à ce qu’elles soient toutes parcourues.
Remarque :
- lors de la boucle sur toutes les cases de la grille, on peut en sauter pour réduire le nombre de mots à trouver.
Implémentation en PHP
Démonstration en ligne
Code source