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

)
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é

)
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

).
Quelques capture d'écran :
Tient, des erreurs. Où ça ?
Saisie d'un nombre (avec aide)
Saisie d'un nombre (sans aide)
Exemple avec plusieurs grilles ouvertes.
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 : Autre1
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
