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 15/07/2008 à 18:45:29

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

Description de l'auteur

Introduction



J'avais, il y a longtemps de ça, réalisé un petit programme de résolution de sudoku en C. Suite à un reformatage forcé de mon disque, j'avais perdu le travail (plutôt laborieux je dois l'avouer). Têtu, j'ai recommencé en essayant de simplifier au maximum le code. D'abord élaboré en C, je l'ai ensuite ré-écris en C++. Le projet s'était arrêté là : pas d'interface, pas de possibilité de jouer, seul l'algorithme de résolution était implémenté.

Et voila que plus d'un an plus tard, ce concours voit le jour. Il m'a donné la motivation nécessaire pour rendre mon programme initial utilisable aisément (du moins, je l'espère).

Malheureusement, je pars, d'ici quelques jours et pour deux longues semaines dans un coin paumé à plus de 7 heures de vol de mon ordinateur : le Québec.
J'ai donc essayé d'avoir un programme fonctionnel avant mon départ, avec tous les désagréments que cela entraine et qui seront développé dans la suite de cette présentation.


Interface graphique



Défauts



Je commence pas ce qui ne va pas, ça évitera les déçus (et accessoirement ça me permet de finir par ce qui va bien :D )

Tout d'abord, le design est assez moche (fade, terne, sans originalité) je dois l'avouer (surtout à la vue de certaines participations d'autres participants). Ceci est du au fait que je voulais quelque chose qui marche avant d'avoir quelque chose de beau.

En particulier, il n'y a aucun moyen avec mon programme de repérer facilement les différents carrés de 3x3 cases. Je pense essayer de remédier à ce problème mais je ne suis pas du tout sur d'y arriver avant mon départ.(problème réglé :D )


Fonctionnalités implémentées



Ce qui est fait :
  • Gestion de plusieurs grilles à la fois ;
  • Résolution des grilles ;
  • Vérification des grilles ;
  • Réinitialisation des grilles ;
  • Mode Jouer : pour remplir les grilles à la main ;
  • Mode Éditer : pour ajouter/modifier les valeurs initiales de la grille ;
  • Possibilité d'enregistrer et d'ouvrir des grilles à partir d'un fichier (pour la continuer plus tard par exemple);
  • Une aide au joueur (valeurs possibles pour une case) désactivable au besoin.


Ce qui est à améliorer (mais qui ne le sera surement pas à tant) :
  • Résolution des grilles : si la grille n'a pas de solution, le programme rentre en boucle infinie (problème résolu en théorie ;
  • Possibilité d'enregistrer et d'ouvrir des grilles à partir d'un fichier (pour la continuer plus tard par exemple) : le format de fichier est nul, il est entièrement à revoir le format est un peu mieux, il doit encore être un peu amélioré mais ça ne sera pas fait à temps (je part demain matin) et la fonction de lecture du fichier ne gère pas les erreurs mais j'ai pas le temps de le faire ;


Ce qui est prévu mais qui ne sera pas fait à temps :
  • Gestion de grille de tailles variables (2x2, 4*6, ...) : en théorie, l'algorithme de résolution peut déjà le faire mais je n'ai jamais testé.


Ce qui n'est pas prévu (mais on ne sait jamais) :
  • Génération aléatoire de grilles.


Le programme est plutôt intuitif (mais mon avis est peut-être faussé puisque c'est moi qui l'ai conçut :p ).


Quelques capture d'écran :



Tient, des erreurs. Où ça ?

Tient, des erreurs. Où ça ?

Saisie d'un nombre (avec aide)

Saisie d'un nombre (avec aide)

Saisie d'un nombre (sans aide)

Saisie d'un nombre (sans aide)

Saisie d'un nombre (sans aide)

Exemple avec plusieurs grilles ouvertes.


Sous windows

Sous Windows : bizarrement, les erreurs ne se mettent pas en rouge, je ne sais pas pourquoi. En faite, il semble qu'aucune couleur ne fonctionne.


Le Code



L'algorithme de résolution est tout bête : on teste toutes les possibilités :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
on se place à la première case (qui n'est pas une donnée)
tant qu'on arrive pas à la fin de la grille faire
    on incrémente la valeur de la case

    si la valeur convient
        on la met dans la case courant et on passe à la case suivante 
        (qui n'est pas une donnée)
    fin si

    si la valeur dépasse la valeur maximale
        on met la case à zéro et on retourne à la case précédente 
        (qui n'est pas une donnée)
    fin si
fin tant que


Un point du code qui me déçoit : la transformation d'un entier en QString pour l'affichage, j'ai du refaire une fonction assez laborieusement, les autres solutions que j'avais testé ne fonctionnait pas correctement (avec <sstream> notamment j'obtenais des caractères étranges). (problème corrigé : merci à Assaf au passage :) )

En espérant que vous apprécierez :)

Impression du jury

Une archive bien rangée, tout est livré proprement comme demandé, on aime. :)

Côté code



Cela reste dans la lignée des "bons" programmes sans être non plus particulièrement extraordinaire.

Les conventions de nommage sont respectées, l'architecture est claire, aucun souci pour se retrouver dans ce code.

En revanche, s'il y a des commentaires, ceux-ci sont un peu succints et on aurait aimé des commentaires plus généraux qui expliquent par exemple le rôle de telle ou telle classe.
Néanmoins dans l'ensemble, il faut reconnaître que c'est bien fait. L'algorithme de résolution est le backtracking, le plus brutal mais aussi le plus simple à coder. Il est réussi mais d'autres résolutions plus fines existent (qui font plus penser à de l'intelligence artificielle), bien que plus complexes à concevoir.

Côté GUI



C'est une application MDI. Pourquoi pas, c'est original de pouvoir gérer plusieurs sudokus à la fois, mais est-ce vraiment bien utile ? Attention à ne pas sur-utiliser les possibilités de Qt juste pour le plaisir. ;)

Premier (gros) problème : le programme ne propose pas de grille par défaut. Il possède certes un mode éditeur de grille sympathique, mais aucune grille préremplie n'est livrée dans le zip. C'est dommage, d'autant plus qu'il n'y a pas de génération aléatoire. Cela nous oblige à créer une grille nous-mêmes.

L'interface de la grille est claire mais pas des plus simples à remplir. Il faut en effet plutôt jongler entre le clavier et la souris pour sélectionner une case et taper son chiffre.

L'aide fonctionne bien mais est un peu trop masquée : elle n'apparaît que dans la fenêtre de sélection du nombre. Finalement, c'est plutôt la façon de remplir les cases qui est la cause de ce comportement peu évident pour l'utilisateur.

La résolution automatique est efficace et rapide. La vérification a le mérite de signaler les emplacements des cases en erreur, ce qui est un bon point pour ce logiciel.

Détail des notes

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