Aller au menu - Aller au contenu
> Le Site du Zéro > Les concours > C++ > Voir une œuvre

Fiche d'œuvre

Retour au concours

Auteur

Œuvre

Téléchargement
Rendu le 29/07/2008 à 18:10:04

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

Description de l'auteur

Introduction



Quand j'ai vue ce concours, je me suis tout de suis dit : "Mais c'est parfait ! C'est l'occasion idéal pour me lancer dans l'apprentissage du C/C++ (et par la même occasion d'utiliser la bibliothèque Qt)".
C'est comme ça qu'a débuté mon aventure avec vous ^^. Je me suis mis à lire les cours, tout en m'imaginant plein d'interfaces possibles pour un Sudoku. (bon je vais pas vous mentir, j'ai un peut trop déliré sur certaine :p ), mais une chose était sur, je voulais que mon programme soit original, Qu'il ait une interface qui change radicalement avec celles que l'on trouve habituellement. Mais entre 'vouloir' et 'réussir' il y a un grand chemin, et je ne suis pas totalement satisfait de ce que j'ai réussi à produire sur ce point.
Pour faire simple l'affichage des chiffres de mon Sudoku est devenu facultatif, j'ai décidé de le rendre plus visuel pour permettre de mieux se repérer. Deuxième modification majeur, le contrôle de mon programme peut entièrement se réaliser à l'aide de la souris et/ou de cinq touches du clavier (directionnelles + entrer).


Ce que mon programme peut faire



  • Générer une partie aléatoirement.
  • Ouvrir une partie.
  • Enregistrer une partie
  • Imprimer la grille ou une page de 6 grilles différentes. (pour ceux qui préfèrent jouer sur papier, on peut même imprimer des aides)
  • Vérifier la grille. (par rapport aux règles du Sudoku)
  • Vérifier la grille. (par rapport à la solution)
  • Résoudre la grille.
  • Réinitialiser une grille.
  • Donner le temps de résolution de la grille.


Ce que mon programme aurait pu faire, mais qu'il ne fera pas



  • Gérer des bruitages. (je trouve que cette option est loin d'être indispensable)
  • Calculer/Sauvegarder des scores. (manque de temps et de courage)
  • Être personnalisable. (mais c'est tout de même possible si l'utilisateur créer de nouvelles images)
  • Gérer plusieurs Sudokus. (que l'on m'explique l'utilité d'une telle option ? personnellement résoudre 2 Sudokus en même temps, je n'en suis pas capable ;p)
  • Organiser des concours à l'échelle international par le biais d'internet. (Hahaha... faut je me calme dans mes idées moi :D)


Format des fichiers de sauvegarde (.sdk)



Citation : .sdk
e0008006090630020e700f59c00052000f3i860905a7207i00f85d000460e03005007406f40e20000

  • Les chiffres '1' à '9' représentent les cases fixes.
  • Les lettres 'a' à 'i' représentent les cases remplies par l'utilisateur.
  • Les '0' désignent les cases vides.


Évolution



Citation : Heero78
29/06/08 :
-Début de la lecture du tutoriel 'langage C/C++' de m@theo21. Ce langage m'est pour l'instant totalement inconnu, mais comme je devrai l'apprendre un jour, autant commencer avec un projet motivant. (quoi de mieux qu'un concours ^^)

02/07/08 :
-Premiers pas dans Qt. C'est vrai que cette bibliothèque a vraiment l'air puissante et simple d'utilisation. (mais bon je ne connais aucune autre bibliothèques du C++, je ne vais donc pas faire de comparaison du genre : 'c'est la plus mieux' ;) )
-Je ne sais pas encore ce que je pourrai faire avec cette bibliothèque, mais les idées tourbillonnent dans ma tête, tout en restants très vague, il me faut finir de lire cette partie du tutoriel avant de vraiment pourvoir imaginer mon logiciel.

04/07/08 :
-Début de la création de mon projet qui se compose pour l'instant d'un fichier main.cpp et de 2 classe (Fenetre.cpp et Bouton.cpp).
-Orientation vers un design spécial, avec la découverte majeur de la fonction setStyleSheet() qui comble mes désir (même si je ne comprend pas tout et que j'enchaine les erreurs d'utilisations ;p )

05/07/08 :
-Ajout de la classe Choix. (qui affiche un QWidget pour choisir quel planètes je désire mettre dans une case)
-Blocage sur la modification du titre et de l'icône de mes fenêtres, après un bon moment de recherches, j'ai en partie résolu mes problèmes (mais je n'ai toujours pas réussi à supprimer l'icône)
-Création du design du sudoku. Ce que est, entre nous, loin d'être mon point fort. Mais après plusieurs longues heures de travail j'ai enfin réussi à obtenir 9 planètes acceptables (le premier qui critique je l'achève hein ^^).

06/07/08 :
-Résolution des nombreux problèmes de design dus à ma connaissance encore trop vague des possibilités de Qt.
-La règle 'Réalisation d'une interface graphique permettant de saisir des chiffres dans une grille, un seul chiffre par case.' me laisse penser que mon Sudoku doit obligatoirement utiliser des chiffres. Mais comme le projet est surtout basé sur le réalisation d'une interface, je veux qu'elle soit le plus original possible, d'où mon idée de les remplacer par des planètes. Mais pour des soucis de respect des règles je vais quand même rendre l'affichage des chiffres optionnel (sur les planètes).
-Sudoku opérationnel (J'entend par là que l'on peut y jouer, bien que ce soit pour l'instant toujours sur la même grille ^^')
-Recherche d'algorithme sur la création de grilles, sans grand succès à mon gout. Mais ce n'est pas très grave, cette partie risque d'être difficile, je la remet donc à plus tard.
-Nettoyage du code, et croyez moi, il en à besoin, c'est effroyable toute les variable que j'ai crée et qui n'ont pas de réel utilité (je n'ai pas encore fini mais je terminerai demain si j'ai le temps).

07/07/08
-Fin du nettoyage du code, j'en ai profité pour remplacer quelques fonctions par celles que je viens de découvrir et qui sont plus appropriées. (comme pour la suppression de l'icône de ma fenêtre)
-Je viens de modifier quelques propriétés et images pour que le joueur puisse modifier la taille de mon jeux.
-Modification de la fenêtre Choix (au lieu de la recrée à chaque fois que je voulais l'afficher, je la cache, la modifie et la re-affiche).
-Création du menu, qui comporte 2 boutons (Oo) 'Quitter' et 'Vérifier la grille'. J'en ai profité pour commencer l'algorithme de vérification que je finirais surement demain.

08/07/08
-J'ai fini d'incorporer le menu de vérification à mon jeux, tout les boutons qu'il possède ne sont pas encore tous opérationnels et l'algorithme loin d'être fini, il ne peut pour l'instant que repérer si plusieurs planètes sont placées sur la même ligne.

09/07/08
-Ajout du bouton 'filtrer les planètes' qui active/désactive le filtrage de planètes dans la fenêtre Choix.
-Ajout de deux boutons 'About' et 'About Qt'

10/07/08
-Ajout d'un menu 'Options' qui contient 4 sous-boutons : 'Marquer les planètes fixes' 'Afficher le numéro des planètes' 'vider la grille' et 'Afficher les règles', et toutes les fonctions associées à ces boutons fonctionnent correctement.
-Je viens de commencer mes recherche sur une algorithme de résolution performant, et j'ai trouver des choses intéressantes, et j'ai donc commencer à écrire mon cette fonction.

11/07/08
-Mon algo marche pour la plupart des sudoku, mais je sais quoi faire pour qu'il puisse tous les resoudre, je verai ça un peut plus tard.
-Je ne sais pas trop pourquoi mais je veux arriver à supprimer tout les appel à la fonction setStyleSheet().

12/07/08
-J'ai totalement revue l'ordonnancement des mes widgets, visuellement rien ne change, mais ils deviennent beaucoup plus simples à manipuler.
-Voila, j'ai réglé tout les problèmes de styleSheet (merci la doc), maintenant je n'utilise cette fonction que pour gérer l'arrière plan de mes fenêtres.
-Ajout d'une toolbar qui récapitule le nombre de planètes pressentes sur la grille.

13/07/08
-J'ai enfin fini mon algorithme de résolution, il marche avec tout les grilles que j'ai eu à tester et pour chacune d'elle, il a mis moins de 1ms, mais bon je manque de grille pour pouvoir le tester plus en détails. (j'en ai profité pour lire le Tp zeroClassGenerator et celui des boites de dialogues)
-J'ai enfin mis en service la fonction Ouvrir, cela m'a parmi de découvrir la classe QFile ainsi que la classe QRegExp (qui me sert a vérifier si le contenu de mon fichier est valide).
-Ajout des icônes et raccourcis du menu 'Partie'. (Nouveau, Ouvrir, Enregistrer, Imprimer, Quitter)

14/07/08
-Mise en service de la fonction Enregistrer.
-A là, je suis content, c'est une mise à jour que j'avais en tête depuis longtemps, avant pour jouer à mon jeux, la souris suffisait, elle était même indispensable. Mais maintenant j'ai ajouté tout un mode de jeu au clavier :p, ça m'a permis d'apprendre beaucoup de choses sur la gestion des évènements avec Qt. (à savoir que l'on peut utiliser les 2mode de jeux en même temps, ils sont parfaitement compatibles ;p)

17/07/08
-Création de l'option 'Révéler une planète', pour donner une aide sans afficher tout la solution. ^^

18/07/08
-Implémentation de l'algorithme qui génère aléatoirement les grilles.

19/07/08
-Ajout d'une horloge dans la barre de titre de ma fenetre.
-Modification de l'enregistrement et de l'ouverture de grille, il fait maintenant la différence entre les cases fixes et les autres. (on peut donc enregistrer une partie en cours)
-Avant de quitter, une fenêtre demande si l'on veux enregistrer.

22/07/08
-Création du menu Imprimer, qui permet d'imprimer une page de 6 grilles.
-Découverte de ma méthode sender(), que j'utilise pour simuler le fonctionnement des QAction checkable. (C'est le seul moyen que j'ai trouver pour pouvoir supprimer mes problèmes pour personnaliser l'icône de ce genre de boutons)

25/07/08
-Modification de l'option imprimer, avec la création de la classe Imprimer, cela me permet de rajouter des options, comme imprimer la grille actuelle, ou bien d'ajouter des petites cases d'aide si l'utilisateur le désire.
-Ajout de quelque icônes.

Impression du jury

Si ce que tu dis es vrai, je suis assez impressionné. Apprendre le C++ spécialement pour le concours et produire un programme de cette qualité pour un premier projet Qt, c'est un tour de force.

Disons-le tout net : d'autres participants ont réalisé des interfaces plus complexes et sont allés plus loin dans l'utilisation de la bibliothèque Qt. Toutefois, pour une première réalisation C++ / Qt, cela reste réellement très très bon !


Côté code



Le code est découpé en plusieurs fichiers en fonction des fenêtres, ce qui le rend relativement digeste bien qu'on aurait apprécié une séparation plus nette entre les algorithme et la gestion du GUI. On se retrouve avec un Fenetre.cpp de plus de 1000 lignes ce qui n'est pas rédhibitoire, mais néanmoins assez lourd.

Le code est correctement commenté, mais il aurait été bien de mettre les codes d'en-tête au début des fichiers .h et pas seulement au début des .cpp.

Ceci étant, le style d'indentation utilisé est homogène et est donc respecté sur l'ensemble du code. Les conventions de nommage (majuscule au début des noms de classe, préfixe devant les noms d'attributs) sont elles aussi au rendez-vous, ce qui en fait au final un projet tout à fait exploitable par un autre développeur (et c'est quelque part le but).

Le zip contient uniquement les bons fichiers, qmake puis make, la compilation se passe sans encombres et, signalons-le, sans warnings. Bref, parfait. Le dossier des images est déjà à la bonne place, il n'y a plus qu'à lancer l'exécutable.


Côté utilisateur



Le lancement du programme ne présente aucune erreur. Le développeur a fait le choix d'une interface originale, ce qui mérite d'être souligné : on joue non pas avec des nombres mais avec des planètes. Cela permet, je dois le reconnaître, une meilleure identification visuelle des éléments, mais cela perturbe aussi le joueur qui préférait peut-être de simples nombres.

Pas de panique, l'option pour numéroter les planètes existe... mais les nombres ne sont pas toujours très visible ni très mis en valeur et on se retrouve avec une surcharge d'informations. Il aurait finalement été plus judicieux de faire disparaitre complètement les planètes et les remplacer par des nombres plus gros.

Les menus du programme sont un peu confus : on peut créer une nouvelle partie ou en ouvrir une, mais il faut comprendre que la première option génère une grille tandis que la seconde se base sur une grille prédéfinie. Certains autres participants ont été plus clairs quant aux ouvertures de grilles. De plus, on aurait apprécié que les grilles soient classées par niveau.
D'autres menus ne sont pas très clairs, notamment "filtrer les planètes". Ce qui est clair dans la tête du développeur ne l'est pas forcément dans celle du joueur : il faut documenter le jeu et éventuellement afficher une aide (il y en a bien une mais elle apprend à jouer au sudoku, ce n'est pas suffisant).

Somme toute, le remplissage de la grille est simple et agréable, et on appréciera l'effort d'avoir rendu le programme navigable au clavier. La solution est affichée mais seulement dans une petite fenêtre : c'est original. En revanche, la vérification de la grille n'est pas très claire là encore, on ne sait pas trop comment ça marche. Les erreurs sont corrigées par le programme mais sans trace (pas de logs qui auraient pu aider à voir ce qui s'est passé).

Enfin, le programme permet d'imprimer les sudoku : en voilà une bonne idée !
L'impression (car oui, j'ai testé) est une réussite, on retrouve cette fois une grille au format classique que l'on recherchait dans le programme. On peut même imprimer des cases d'aide !

Détail des notes

Critère M@teo21 Moyenne
Total 27 / 40, soit 13.5 / 20
Interface graphique 6 / 10 6 / 10
Vérification de la grille 5 / 8 5 / 8
Lisibilité du code 5 / 6 5 / 6
Aide à l'utilisateur 1 / 2 1 / 2
Lecture de la grille dans un fichier 3 / 4 3 / 4
Génération aléatoire de la grille 3 / 4 3 / 4
Résolution automatique de la grille 4 / 6 4 / 6