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