ABADIE Martin BENMOUFFOK Yasmine HEIDMANN Paul UTZEL Sylvain Encadré par : Mr Philippe Janssen 2014-2015
<<Nos sincères remerciements à monsieur Phillipe JANSSEN, pour son sérieux, son dévouement et ses conseils.>> 2
Sommaire Slitherlink Qu'est-ce que Slitherlink?... 3 Comment le résoudre Les règles de cellules... 4 Les Les règles de chemin... 5 Le Backtracking... 6 Les algorithmes Allumer... 7 Cellules aux arêtes Pleines... 8 Points à trois arêtes vides... 9 Structure de données Diagramme des classes... 10 Héritage... 11 Fichier de données... 11 Interface graphique Choix de la bibliothèque... 12 Affichage... 13 Conclusion... 13 Bibliographie... 14 3
1. Qu'est-ce que le Slitherlink: Le SlitherLink se joue sur une matrice rectangulaire formée de points. Entre ces points, on retrouve parfois des nombres (entre 0 et 3). L'objectif est de relier horizontalement ou verticalement les points adjacents afin de créer un cycle. Les nombres indiquent le nombre de côtés entourant chaque case. Par exemple, si une case contient le nombre 3, trois de ses côtés doivent être touchés par le trait continu. On indique souvent d'un X une ligne que l'on peut pas allumer. La figure ci dessous donne un exemple d instance de problème et sa solution. Comme beaucoup de casse-têtes et de puzzles le Slitherlink est un problème NP-complet. C'est un jeu difficile à résoudre. Les règles qu'on appliquent ne sont pas toujours suffisantes,nous ne pouvons pas donc espérer trouver un algorithme de complexité polynomiale qui résoudrait n'importe quelle instance de problème. Pour la création de notre programme nous traiterons que les grilles ayant une solution unique. 4
Comment résoudre? Pour la compréhension de ce jeu nous avons joué à plusieurs parties de SlitherLink, lors de ces parties nous avons mieux compris la méthode de résolution. Nous avons remarqué qu'il existe différentes règles qui s'appliquent tout au long de la grille pour la résolution. Ces règles permettent de déduire l'état de certaines arêtes. Les règles des cellules : Figure 1 Cellule 0 Cette règle montre que si une case contient le chiffre 0, alors aucune arête de cette case ne s'allumera. Figure 2 Deux 3 adjacents Dans le cas des deux 3 adjacents, il existe deux façons de contourner les cases(comme le représente le contour gris ). Dans les deux cas on empreinte les trois arêtes. De plus les arrêtes marquées d'une croix rouge restent nécessairement éteintes. 5
Figure 3 Règle des coins Nous voyons les trois différentes possibilités pour une case dans un coin (ou à coté du 0). Si le 1 est dans un coin alors les deux arêtes du coin s'éteignent. Si le 2 est dans le coin alors on peut allumer les arêtes comme sur le la figure. Si le 3 est dans un coin alors les deux arêtes du coin s allument. Les règles des points : Figure 4 Points aux arêtes vides Si le nombre d'arêtes allumées et rattachées à un même point est égale à deux, alors les deux autres arêtes rattachées à ce point restent éteintes. Figure 5 Points aux traits vides Si le nombre de trais vides autours d'un point est égale à trois, alors le quatrième trait est forcement vide aussi. 6
Les règles des chemins Nous avons découvert les règles des chemins un peu plus tard mais lors de certaines parties nous avons vu qu'il pouvait exister plusieurs chemins. Pour cette règle nous voyons dans la figure ci-dessus que s'il existe plusieurs chemins, alors nous devons toujours éteindre l'arête dont les deux extrémités ( les points de cette arête) sont elles mêmes les extrémités du chemin. Le backtracking: le retour sur trace est aussi une approche de résolution nécessaire.elle permet de designer une stratégie pour trouver des solutions à des problèmes de satisfaction de contraintes. Dans le cas du Slitherlink nous avons essayé pas à pas de trouver des solutions tout en s'assurant que le chemin mène à une résolution possible.dans le cas échéant, nous reprenons du point où la résolution pose problème et essayons de traiter le problème avec une approche différente. 7
Les algorithmes A partir des règles nous avons commencé à écrire les algorithmes correspondant aux règles de résolution. Pour cela nous avons procédé au partage de taches pour la rédaction des algorithmes. Martin a rédigé les algorithmes s'appliquant à un point. Yasmine a rédigé les algorithmes s'appliquant à une case. Sylvain a rédigé les algorithmes s'appliquant à une arête. Paul à son tour a rédigé les règles plus générales (comme celles vues plus haut). Chaque règle est implémentée par un algorithme, dont l'exécution vérifie si les conditions de déclanchement sont appliquées. Si c'est le cas, alors certaines arêtes s'allument ou s'éteignent. Voici quelques algorithmes représentant quelques exemples: Algorithme de la méthode allumer 8
Cellule aux nombres d'arêtes pleines 9
Diagramme des classes 10
Structure de données Pour la modélisation de notre grille nous avons utilisé comme structure de données un tableau dynamique multidimensionnels.chaque case du tableau représente une structure de données illustrant un point, une arête ou une cellule. Le tableau est de dimension (2*n+5, 2*m+5).Mais nous avons rajouté au tableau une ligne et une colonne supplémentaire pour limiter les bords de la grille. Les objets Pour la création de la grille, nous avons décidé d'utiliser une matrice d'objets, les objets correspondent à un point, une cellule ou une arête. Pour l'efficacité du programme nous avons utilisé l'héritage, même si nous n'avions aucune connaissance sur cette méthode nous avons fini par nous documenter et comprendre que grâce à l'héritage, la classe dérivée permettait de tirer profit de l'implémentation de la classe de base. Si B dérive de A avec cette sémantique, alors toutes les fonctions de B peuvent appeler les fonctions de A. Nous avions donc conclu que c'était la meilleure façon d'optimiser notre programme. De ce fait la classe Objet est la classe mère de Point, arête et Case. Pour la création et l'utilisation des objets de la matrice nous avons créé une classe "Coordonnées" qui a partir des i et j définissent si c'est un Point, Arête ou Case. Cordonnées.cpp 11
2-Lecture de fichier Le programme va en premier lieu lire les fichiers de données qui renvoie le contenu de la grille. 5 4 4 4 4 2 4 4 4 2 4 4 4 3 4 3 4 3 4 4 2 4 4 1 4 4 Voici un fichier de données qui représente une grille carrée 5x5 du jeu SlitherLink.. Le nombre 4 correspond a une case sans valeurs. Apres la lecture du fichier, le programme va agir localement case par case pour créer un chemin. Si la première case contient une valeur, alors celui ci récupère la valeur de la case, vérifie toutes les règles du programme susceptibles d'être appliquées.si celle ci le permettent, on allume une arête et de cette maniéré on agrandit le chemin, sinon on affiche une croix pour interdire d'allumer cette arête. Interface graphique : 1-le choix de bibliothèque L'une de nos plus grandes difficultés étaient le choix de la bibliothèque. Nous avons passé beaucoup de temps a comparer toutes les bibliothèques qui existent pour pouvoir finalement se focaliser sur la bonne. Nous avons finalement choisi la bibliothèque SFML(Simple and Fast Multimedia Library), car c'est une bibliothèque qui offre une interface simple vers les différents composants d'un PC, elle est multi plateforme et multi-langage. 2-Affichage: 12
Difficultés: o Le programme que nous avons crée reste incomplet. Comme nous l'avons cité au par avant c'est un problème NP-complet.Il existe encore des règles à déterminer pour la résolution de toutes les grilles. o Dans notre programme, nous avons traité que les grilles carrées, donc il faudrait plus de règles à déterminer pour les grilles plus difficiles. o Le backtrack, comme le montre l'exemple ci dessous : Supposition : Conséquence Conclusion o l'intégration du code de l'interface graphique. o Les conditions d'application de la règle des chemins. Ce projet en groupe fut bénéfique pour chaque membre de notre groupe, Nous avons su gérer notre temps de travail, la répartition des taches et l'organisation de notre équipe.nous avons acquis de nouvelles expériences avec des concepts nouveaux comme l'héritage et l'interface graphique. 13
Bibliographie: http://fr.wikipedia.org/wiki/slither_link http://www.puzzle-loop.com/ https://github.com/timhutton/slinker http://openclassrooms.com/ http://www.sfml-dev.org/index-fr.php http://www.developpez.net/forums/ 14