Programmation Java
Master M2 TTT --- Projet
Sudoku
Règle du jeu
Le Sudoku est un casse-tête qui se présente sous la forme d'une grille 9x9.
Le casse-tête est résolu lorsque chaque case de la grille contient un
chiffre de 1 à 9 de sorte que
- chaque ligne contient une et une seule fois chaque chiffre;
- chaque colonne contient une et une seule fois chaque chiffre;
- si on divise la grille en neuf carrés 3x3, chacun de ces carrés contient
une et une seule fois chaque chiffre.
Au départ, un certain nombre de cases sont remplies, ce qui fixe des
contraintes pour les autres.
Matériel fourni
Dans l'archive sudoku.zip, on trouvera un
répertoire sudoku qui contient:
- un répertoire graphics contenant un certain nombre de classes
permettant l'affichage d'un jeu de sudoku, dont une classe
Sudoban;
- un répertoire game qui contient deux interfaces:
- une interface Case qui déclare les méthodes suivantes:
- public Collection valeursPossibles(); cette méthode
doit retourner la séquence des valeurs qui sont encore possibles pour la case;
- public void setValeurs(int k); cette méthode fixe la valeur k pour la case;
- public void supprimeValeur(int k); cette méthode supprime la valeur k des valeurs possibles pour la case;
- public boolean isFixe(); cette méthode retourne vrai
s'il n'y a qu'une valeur possible pour cette case;
- public int getX() et public void getY(); ces
méthodes retournent les coordonées de la case.
- une interface Jeu qui déclare les méthodes suivantes:
- public Case getCase(int i, int j); cette méthode retourne l'objet Case de coordonnées (i,j) (chaque coordonnée est comprise entre 0 et 8);
- public void resout(); cette méthode tente de résoudre le casse-tête
en restreignant le nombre de valeurs possibles pour chaque case (voir plus loin);
- public boolean isCoherent(); cette méthode retourne vrai si le jeu est cohérent, c'est-à-dire si les cases qui ont une seule valeur respectent les contraintes des règles du jeu;
- public boolean isFini(); cette méthode retourne vrai
si chaque case a une et une seule valeur possible;
- public void enregistre(File f); cette méthode
sauvegarde le jeu en cours dans le fichier f;
- public void charge(File f); cette
méthode remet le jeu dans l'état sauvegardé dans le
fichier f.
Vous ne devez pas modifier ces fichiers.
Travail demandé
Le projet consiste à écrire deux classes qui implémentent respectivement l'interface Case et l'interface Jeu.
Un objet jeu de la classe qui implémente Jeu sera créé à l'aide d'un constructeur sans argument; à sa création, cet objet sera tel que pour tout couple (i,j) dans [0;8]x[0;8], jeu.getCase(i,j) retourne une case dont les valeurs possibles sont tous les chiffres de 1 à 9.
Pour tester votre programme, il suffit d'écrire dans une méthode main l'instruction new Sudoban(jeu); où Sudoban est la classe du package sudoku.graphique qui vous est fournie et jeu est un objet de votre classe qui implémente Jeu. Ceci déclenche, lorsque l'on lance le programme, l'ouverture d'une fenêtre graphique représentant une grille de sudoku. Dans chaque case est affichée la liste des valeurs possibles; lorsque l'on clique sur une case, selon le mode choisi, une fenêtre permettant de fixer la valeur de cette case ou de supprimer certaines valeurs s'affiche.
Pour écrire la méthode résout, on peut appliquer différents principes:
- Si une case à une valeur fixée, on peut supprimer cette valeur de toutes
les cases de la même ligne, la même colonne et du même sous-carré.
- S'il y a une valeur qui n'est possible que dans une seule case d'une ligne
donnée, alors on peut fixer la valeur de cette case.
- Vous pouvez ajouter des règles de manière à rendre votre programme le plus puissant possible.
Rendu de projet
Le projet doit être rendu par courrier électronique au plus tard
le 19 février 2011 à lombardy
monge.univ-mlv.fr
- Le sujet du mail doit être : Rendu Projet TTT
- Le corps du mail doit contenir les noms et prénoms des deux personnes ayant fait le projet;
- Le mail doit contenir deux pièces jointes :
- un fichier pdf dont le nom est XXX_YYY.pdf
où XXX est le nom d'une des deux personnes et YYY le nom de l'autre; ce fichier contient votre rapport, il est inutile de mettre les sources en annexe;
- un fichier zip dont le nom est XXX_YYY.zip qui contient uniquement les fichier .java de votre projet (il est inutile de mettre dans ce fichier les classes fournies dans le sujet).