sujet 2013
Transcription
sujet 2013
Langage C Année 2012-2013 Projet de programmation Promotion Maisonnier 1ière année É. Salvat Le projet de programmation L'objectif du projet est de programmer un jeu de sudoku. Votre programme proposera à un joueur humain de résoudre des grilles de sudoku. Pour ce faire il faudra que le joueur puisse remplir une case d'une grille de sudoku proposée par le programme. Le logiciel devra, de son côté, être en mesure de vérier si une grille de sudoku est correcte ou non. On proposera plusieurs versions du programme. Une première version sans véritable interface, permettant cependant de jouer. On créera ensuite une version proposant un interface plus évoluée basée sur ncurses. Puis une version avec une interface graphique classique basée sur GTK. Le développement se fera donc sous Linux. Jouer au Sudoku Une grille de sudoku se présente sous la forme d'un tableau de 9x9 dans la quelle le joueur doit remplir les cases vides par un chire de telle sorte que chaque colonne, chaque ligne et chaque carré de 3x3 contiennent chaque nombre entre 1 et 9. Ci dessous un exemple de grille de départ et sa solution. 1 2 3 4 5 6 7 8 9 A 0 9 0 0 7 0 0 8 0 Un B C D 0 3 0 0 0 3 0 1 8 0 8 1 0 0 0 0 6 7 0 2 6 0 0 2 0 5 0 exemple de E F 2 0 0 5 0 6 0 2 0 0 0 8 0 9 0 3 1 0 grille à G H I 6 0 0 0 0 1 4 0 0 9 0 0 0 0 8 2 0 0 5 0 0 0 0 9 3 0 0 résoudre. 1 2 3 4 5 6 7 8 9 A B C D 4 8 3 9 9 6 7 3 2 5 1 8 5 4 8 1 7 2 9 5 1 3 6 7 3 7 2 6 8 1 4 2 6 9 5 4 La solution de la E F G H 2 1 6 5 4 5 8 2 7 6 4 9 3 2 9 7 6 4 1 3 9 8 2 4 8 9 5 1 5 3 7 6 1 7 3 8 grille ci-contre. I 7 1 3 6 8 5 4 9 2 Dans cet exemple, les cases à remplir sont celles qui contiennent un zéro. Nous utiliserons cette convention pour notre programme. De même, pour plus de facilité les lignes sont repérées par un numéro de 1 à 9 et les colonnes par une lettre de A à I. Enn pour les carrés de 3x3 à traiter, nous les repérerons par les coordonnées de la case de leur coin supérieur gauche. Ainsi les neufs carrés seront nommés : A1, D1, G1, A4, D4, G4, A7, D7, et G7. 1 Les fonctions de base Pour pourvoir jouer au sudoku vous programmerez les fonctions suivantes : 1. Charger une grille depuis un chier : il s'agit d'un chier texte, dans le quel la grille est simplement inscrite ligne par ligne. Chaque grille est introduite par une ligne de texte contenant au minimum le nom de la grille (on pourra, plus tard ajouter d'autres informations, comme par exemple le niveau de diculté). Un chier peut contenir plusieurs grilles. 2. Acher la grille actuelle. 3. Vérier une ligne : cette fonction vérie si une ligne donnée en paramètre de la grille (également passée en paramètre) contient ou pas des erreurs (plusieurs fois le même chire). En cas d'erreur, un message explicatif sera aché. 4. Vérier une colonne : même travail que la fonction précédente mais sur une colonne. 5. Vérier un carré de 3x3 : même chose, sur un carré passé en paramètre. 6. Vérier une grille : en utilisant les 3 fonctions précédentes. 7. Jouer un coup : pour jouer, le joueur devra d'abord indiquer la case qu'il souhaite modier, puis la valeur à inscrire dans la case. Bien entendu, cela aura pour eet de modier la grille en mémoire... ce qui pourra être vérié par un achage. 8. Mémoriser les coups joués : an de pouvoir éventuellement défaire ce qui a été fait, vous mémoriserez les coups joués par le joueur dans une liste chaînée qui respectera l'ordre des coups joués. 9. En utilisant toutes les fonctions ci-dessus, il ne reste plus qu'à faire le corps du programme qui permette à un joueur de faire une partie complète. Revenir en arrière La mémorisation des coups a pour but de permettre au joueur de changer une case déjà remplie. Lorsque cela se produit, les cases remplies après la cases modiées peuvent ne plus être correctes. On choisira ici, dans un premier temps, de les eacer. En utilisant la liste chaînée des coups mémorisés, écrire la fonction qui permet de modier une case déjà remplie. La bibliothèque ncurses C'est une bibliothèque Linux qui permet de gérer un terminal comme une fenêtre, ainsi que d'utiliser des couleurs. Outre le man, vous trouverez des aides sur les sites suivants : le site ociel : http://www.gnu.org/software/ncurses/ un HowTo pour programmer avec ncurses : http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/index.html Le paquet d'installation de ncurses contient les diérentes documentations. Elles devraient donc être en local sur vos machines, si la bibliothèque ncurses est correctement 2 installée. Je vous ai également mis une copie de ces documentations sur la page du cours (http://perso.imerir.com/salvat/LangC/langC.html). En utilisant la bibliothèque ncurses, ajoutez une première interface graphique à votre jeu de Sudoku : 1. La grille reste visible en permanence sur votre terminal ; 2. Le joueur se déplace jusqu'à la case qu'il souhaite modier en utilisant les èches de direction du clavier (on pourra aussi, ultérieurement, utiliser la souris) ; 3. Lorsque le joueur est sur la case qu'il souhaite modier, il sut de taper sur la touche du numéro à entrer ; 4. Les fonctions de contrôle, modient l'achage (couleur rouge/ inverse vidéo) sur les cases représentant une erreur. 5. Pour la modication d'une case : modier l'aspect (couleur / inverse vidéo) des cases devant être eacées, et demander conrmation au joueur. La bibliothèque GTK+ C'est une bibliothèque Linux qui permet de gérer les interfaces graphiques. A l'origine développée pour le programme The Gimp, elle est aujourd'hui utilisée par de nombreux programmes notamment par le bureau de Gnome. Vous trouverez des aides sur les sites suivants : Le site ociel : http://www.gtk.org/ Le tutoriel ociel : https://developer.gnome.org/gtk-tutorial/stable/ Le but de cette partie du projet est de doter votre jeu de sudoku d'une interface graphique classique. Cela veut donc dire que le jeu ne se déroule plus dans une console, mais qu'il dispose de sa propre fenêtre, et bien sûr que l'on peut jouer en utilisant la souris. Déroulement Il s'agit d'un projet personnel pour vous faire pratiquer la programmation : bien évidement le copier-coller de code source sur internet est proscrit (ce serait de toute façon stupide : vous n'apprendrez pas grand chose, et vous n'avez pas de garantie de la validité du code) Travail personnel, veut aussi dire que chacun d'entre vous fait son propre code. Il ne vous est pas interdit d'échanger entre vous, ni même de consulter des documentations sur internet... le but est d'arriver à écrire votre propre programme ! Vous pouvez également me solliciter pour vous débloquer sur un problème particulier. Le projet est à réaliser entre le lundi 18 mars 2013 et le vendredi 19 avril 2013, ce qui vous laisse 5 semaines complètes. 3 Le projet se fait à l'école : vous devez être présent tout le long du projet, y compris en dehors des rendez-vous que nous aurons. Je passerai vous voir régulièrement... A chaque n de semaine, vous m'enverrai votre projet. Il vous faut donc remettre : vos sources (n'oubliez pas d'inclure dans le chier tar vos bibliothèques et .h) : un chier tar.gz qui devra créer un répertoire Sudoku-NomEtudiant local, ainsi que les sous-répertoires bin, src, lib, include et doc. un rapport synthétique (.pdf, 2 à 5 pages maximum devraient sure) indiquant vos choix, les découpages eectués, une description brève du jeu, d'autres options de jeux que vous auriez ajoutées (aide au joueur...). 4