Aller au menu - Aller au contenu

Fiche d'œuvre

Retour au concours

Œuvre

Téléchargement
Rendu le 31/07/2008 à 23:59:09

Titre : SudoQt42
Concours : Le Sudoku : des nombres en folie !

Description de l'auteur

SudoQt42, c'est :
4 fichiers .ui
12 fichiers .cpp
11 fichiers .h
2 fichiers .ts

C'est aussi 3774 mots , en 2083 lignes sur les 23 fichiers de code décrivant 10 classes.
C'est 110 commits sur le svn.
C'est 7 jours de travail.

SudoQt4.2 n'a été testé que sous GNU/Linux, mais il n'y a pas de raison que ça plante avec les autres OS.

Voilà les fonctionnalitées de SudoQt42 :
-l'utilisateur peut avoir des indices, les possibilitées d'une case et la vérification des erreurs
-génération de grille de type : facile, moyen, difficile, très difficile, vide (pour que l'utilisateur l'a remplisse)
-impression, chargement et sauvegarde des grilles
-top 5 pour les 4 niveaux
-résolution de grille
-possible choix de son, de fond (car la grille est transparente), et la couleur des cases
-un petit tuto pour l'utilisateur
-un undo/redo est implémenté

Traduction :

Vous pouvez tester un fichier de traduction en le passant par la ligne de
commande.

Résolution du sudoku :

Nous avons implémenté la recherche des nombres restants :
s'il n'y a qu'un nombre dans une même région/ligne/colonne/case (par ordre de
difficulté), alors ce nombre est bon.
Si cette méthode ne suffit pas, nous avons implémenté un backtracking.
Il recherche la case qui a le moins de possibilitées et cherche récursivement
la bonne.
Au lieu de rappeler le backtracking, il est plus rapide de rééssayer de
résoudre par des techniques plus classiques.
La fonction mémorise dans une table de hashage les résultats
intermédiaires pour aller plus vite.
Une limitation du nombre maximal de solutions est possible (en privé) et
une limitation du nombre de grilles intermédiaires l'est aussi, toujours pour
accélérer la génération.

Génération du sudoku :

Pour les niveaux facile, moyen, et difficile, cela correspond à avoir une
grille résoluble avec les techniques d'élimination mais pas résoluble au
niveau du dessous. Cette grille est générée en partant d'une grille vide et
ajoute des nombres.
Pour le niveau très difficile, c'est une grille non résoluble par la technique
difficile mais avec une seule solution. Elle est générée cette fois-ci en
partant d'une grille pleine (grille facile résolue) et en enlevant des
chiffres pour avoir une grille plus remplie.

Impression :

Nous utilisons QPrinter, associé a un QPrintDialog, qui permet à l'utilisateur
de choisir les paramètres d'impression. On utilise ensuite un QPainter pour
peindre sur la feuille.

Affichage :

L'affichage est composé d'un widget, nommé TableauWidget. Celui-ci contient 81
CaseWidget, chacun contenant 10 CLabel, 1 pour la valeur principale, 9 pour les mémos.
Nous avons préféré utiliser 9 Clabel plutot qu'un widget sur lequel nous aurions
directement peint ce qui nous interessais, pour réduire le code. Les CLabel relaye les
cliques de souris a leurs CaseWidget, pour que ceux-ci les traitent correctement.
On utilise l'html pour centrer, et colorier le texte des QLabel.


Transparence, couleurs et image de fond:

L'image de fond est mise en place grâce au système de styleSheet de Qt. La
transparence variable des CLabel, ainsi que leurs couleurs de fond est possible
grâce à la réimplémentationdu paintEvent des CLabel. Les QToolButtons de la
toolBar sont eux aussi des classes filles, dont le paintEvent est
réimplémenté.

Sauvegarde des paramètres :

Tout le système de sauvegarde des paramètres est basé sur les QSettings de Qt.

Undo/Redo :

Après avoir échoué en essayant d'utiliser les QtUndoStack, nous avons décidé
d'implémenter ceci nous même. Nous utilisons donc 2 QStack, contenant chacune
des SdkCommand, qui décrivent une action.Les SdkCommand ont deux fonctions :
undo() et redo(), ainsi on a juste a transférer les evenements d'une pile à
l'autre quand il le faut. Si l'utilisateur fait une action différente de la
dernière de la pile des redo, on vide la pile des redos.

Impression du jury

Côté code


L'archive est très claire : les sources, images, sons et ui sont chacun à leur place.

Globalement le code est du bon travail.
C'est indenté, les conventions sont respectées.
Sur le fond plus que sur la forme, on apprécie la création de widgets personnalisés et l'utilisation intelligente de certains possibilités offertes par le C++, comme la surcharge des opérateurs.

Côté commentaire, le minimum syndical est là, on aurait aimé que les algos soient un peu plus détaillés et avoir quelques commentaires globaux.

Les-dis algos ont l'air correctement implémentés et fonctionnels, pas grand chose à dire côté code décidemment.


Côté utilisateur



La compilation semble avoir posé quelques problèmes à quelques membres du jury. Pour ma part, tout a bien fonctionné mais on ne sait pas où placer l'exécutable. Après plusieurs tests, le programme peine toujours à trouver l'image de fond et affiche une erreur. Soit.

Le programme commence par présenter les meilleurs scores. C'est peut-être un peu trop à chaque fois.

L'interface utilisateur est très claire et le remplissage des cases est d'autant plus simple et intuitif qu'une aide est intégrée au programme. Bien vu, tous n'en ont pas fait autant.

Le programme peut charger / enregistrer des sudokus ou en générer de différents niveaux.
Pour le remplissage, plusieurs aides sont possibles : indices, valeurs possibles, etc. Le programme peut aussi résoudre le sudoku d'un seul coup.

Un très bon travail a été fait sur les fonctions non demandées, comme annuler / répéter ou encore imprimer le sudoku.

En définitive, ce projet fait donc partie de la tête de liste des participations au concours. Dommage que l'on ait eu des difficultés à faire tourner ce programme correctement. ;)
Bon boulot !

Détail des notes

Critère M@teo21 Moyenne
Total 36
Interface graphique 9 9
Vérification de la grille 8 8
Lisibilité du code 5 5
Aide à l'utilisateur 2 2
Lecture de la grille dans un fichier 4 4
Génération aléatoire de la grille 4 4
Résolution automatique de la grille 4 4