Home>Programmation>C++

Projet : Sudo Ku

Les règles et Stratégie pour jouer | Le programme (élaboration) | Conclusion et Téléchargement

Le Sudo Ku est une variante du carré magique (ou carré latin), des chiffres y sont placés selon une répartition obéissant à des propriétés bien précises.

Des programmes permettent d'en construire à volonté, et surtout de proposer des grilles à compléter n'admétant qu'une seule solution ! On se retrouve devant l'équivalent numérique des mots croisés. Le Figaro ou Libération en publient régulièrement des grilles, et on peut en trouver en librairie (Sport Cérébral, ...).
D'après le Figaro le programme utilisé pour leurs grilles a demandé deux ans de mise au point.

Les règles :

Le carré est constitué de 9x9 cases, plus précisément 3x3 carrés élémentaires de 3x3 cases.
Les chiffres utilisés vont de 1 à 9.
Chaque chiffre doit être utilisé une fois et une seule :

  • pour chaque ligne
  • pour chaque colonne
  • pour chaque région.

Il n'y a pas de condition sur la somme d'une ligne ou d'une colonne

Stratégie de jeu :

[à venir].
A voir, une excellente description sur Wikipedia (dont est extraite cette image).

Le programme

Le projet est un projet "MFC application", la classe View de base dérivant de CFormView:

  MFC Application Wizard 

Il doit dans un premier temps être capable de sauver ou restaurer une partie, dans un second temps procurer une aide aux solutions d'un problème donné avec les explications

Le tableau du formulaire est constitué de 9x9 contrôles éditables, libellés {IDC_A1, IDC_A2, ... IDC_B1, ... IDC_I9} Visual permet de copier coller des groupes de contrôles ce qui simplifie l'affaire.

  Ajouter des controls et leur assigner un ID

On veut contrôler les entrées : créer un "control event" pour le premier,
 Assigner une gestion d'evenements
...ceci crée la fonction à exécuter (fonction OnEnChangeA1)
 Handler pour la gestion des entrées clavier
...et sa gestion au niveau des évenements :
 Declaration des Handlers


L'astuce est de ne pas faire la même chose pour les contrôles suivants (au total 81 !) mais de simplement dupliquer la ligne en utilisant une fonction générique (voir ci dessus la fonction OnEnChangeAny()). Il suffit de modifier l'ID du contrôle.

L'identité du contrôle lors de la saisie d'une case est retrouvée au moyen des fonctions MFC GetFocus() et GetDlgCtrlID(). Par contre la correspondance entre l'ID du controle et la valeur en mémoire (un tableau data[9][9] membre de la classe View) est plus difficile car les ID ne sont pas attribués de manière séquentielle :
Imprevisibilite de l'assignation des IDs

On pourrait refaire l'attribution, ou procéder à la conversion par un switch mais ce n'est pas très sérieux, car rien ne garanti que la solution sera valable après une modification du formulaire ; l'attribution des IDs est absolument imprévisible.
S'en sortir n'est pas très compliqué : il suffit remplir une table de correspondance au démarrage.

Dans un version future les contrôles pourraient être créé dynamiquement, ce qui allégerait le code.

Conclusion

Le programme est fonctionnel et téléchargeable ci dessous.

Fonctionnalités : Licence : A faire :

Version 1.0.0 (06 Novembre 05)

Version 1.0.1 (07 Novembre 05)

Télécharger le programme version 1.0.1 :
Sudokeur.exe (196 ko)
Sudokeur.zip (46 ko)