Script PHP Sudoku gratuit
Il y a quelques années, j’ai développé cette application, parfaitement opérationnelle sur les versions PHP 4 et 5. Dernièrement, j’ai adapté un peu le code pour que le script fonctionne sur php 7 et 8.
L’application permet de générer des grilles de tout type, garantissant toujours une solution unique. L’application propose des grilles de divers formats, allant de 4×4 à 16×16, offrant la possibilité d’utiliser des lettres, des chiffres ou même un mélange des deux.
L’application intègre une correction en temps réel et inclut un chronomètre pour vous permettre de tenter de battre votre meilleur score.
Cette version ne repose pas sur une base de données. Les grilles sont générées à chaque utilisation. Il serait bénéfique d’envisager le stockage des grilles pour améliorer considérablement la performance de l’application. Le calcul d’une grille peut parfois demander un temps significatif, allant jusqu’à plusieurs secondes en fonction de la taille et de la difficulté sélectionnées
+ Télécharger sur Github
+ Un plugin WordPress est aussi disponible !
Le fichier index.php vous présente un exemple d’utilisation. Le script est paramétrable.
Intégration :
<head>
<script src="js/jquery-3.7.1.min.js" type="text/javascript"></script>
<script src="js/phpsudo.js.php" type="text/javascript"></script>
...
</head>
<body>
<div id="grille"></div>
<script type="text/javascript">
$(function() {
$('#grille').PhpSudo({
'TailleCasePX': '35',
'Dimension': '9*3',
'AfficheSelectionGrilles': true,
'AfficherLaGrille': true,
'TailleTexte': '22',
'GenererNouvelleGrille': true
});
});
</script>
...
</body>
TailleCasePX : dimension d’une case en pixel
Dimension : vous pouvez afficher par défaut un type de grille (9*3, 6*2, …)
AfficheSelectionGrilles : affiche les liste déroulantes pour le choix de la grille (true ou false)
AfficherLaGrille : On affiche directement la grille au démarrage à l’affichage de la page
TailleTexte : dimension du texte dans les cases
La grille utilise un « template », vous pouvez donc très facilement changer les couleurs, la police, la disposition du jeu.
Génération et Résolution de Grilles de Sudoku
Nombre de grilles de qualité possible ? Plusieurs millions, voire des milliards !
Ce jeu de SuDoKu
a pour objectif de générer des grilles de Sudoku de qualité et de les résoudre en utilisant des raisonnements humains. Cette approche permet de valider la résolution possible d’une grille. Lorsqu’une grille est générée, la classe vérifie si elle peut être résolue en utilisant uniquement des méthodes de déduction et de raisonnement humain. Si la grille ne peut pas être résolue de cette manière, elle est éliminée et une nouvelle grille est calculée. Le niveau de difficulté de la grille est déterminé en fonction des méthodes de résolution utilisées pour la résoudre. Plus la grille nécessite l’utilisation de techniques de raisonnement humain avancées, plus son niveau de difficulté sera élevé. Ainsi, la classe SuDoKu
permet de générer des grilles de Sudoku qui sont à la fois résolubles et représentatives d’un défi pour un joueur humain. Cette approche vise à offrir une expérience de jeu plus authentique et stimulante, en se rapprochant des techniques de résolution utilisées par les joueurs experts. Les principales fonctionnalités de la classe sont :
- Génération de grilles de Sudoku avec différents niveaux de difficulté.
- Résolution des grilles en utilisant des méthodes de déduction et de raisonnement humain.
- Validation de la résolution possible des grilles générées.
- Calcul du niveau de difficulté en fonction des méthodes de résolution utilisées.
- Affichage des grilles avec un système de mise en forme CSS.
- Correction des grilles remplies par l’utilisateur.
Cette approche permet de créer des grilles de Sudoku qui offrent un véritable défi aux joueurs, tout en restant résolubles à l’aide de techniques de raisonnement humain.
Présentation technique de la classe SuDoKu en PHP :
:Classe calculGrillePleine
- Cette classe contient les méthodes de base pour la génération et la résolution des grilles de Sudoku.
- Elle possède des propriétés telles que
$SudoVide
(une grille vide),$tirage
(les chiffres à utiliser),$sudo
(la grille en cours de résolution),$max
et$min
(les dimensions de la grille),$NbCasesHZone
et$NbCasesVZone
(le nombre de cases horizontales et verticales dans une zone),$TimeLimitCalcul
(le temps limite de calcul),$TimeOut
(un indicateur de dépassement de temps) et$fin
(un indicateur de fin de résolution). - Les méthodes principales sont :
zone()
: retourne les valeurs d’une zone de la grillecolonne()
: retourne les valeurs d’une colonne de la grilleGrille()
: résout la grille de manière récursive en essayant toutes les valeurs possibles dans les cases vides
Classe SuDoKu
- Cette classe hérite de
calculGrillePleine
et ajoute des fonctionnalités supplémentaires. - Propriétés :
$level
,$LevelHard
,$TabValeursPossible
,$YTabValeursPossible
,$XTabValeursPossible
,$LimitNiveau
,$GrillePleine
,$IncompleteGrille
,$TestGrilleSudoku
,$ValidIncompleteGrille
,$CasesVidesCoordonneesX
,$CasesVidesCoordonneesY
,$WithSymbol
,$t0
- Méthodes :
__construct()
: constructeur de la classe, initialise les propriétésinit()
: initialise une nouvelle grille de SudokuGetGrille()
: génère une grille de Sudoku complèteNiveauDifficulte()
: détermine le niveau de difficulté de la grillecreate_grille_sudoku()
: crée une grille de Sudoku incomplète en fonction du niveau de difficultéreplace_by_symbol()
: remplace les chiffres par des symboles (lettres) dans l’affichagelineariser_grilles()
: convertit la grille en une chaîne de caractères pour la stocker en base de donnéesdrawing()
: affiche la grille de Sudoku avec un système de mise en forme CSSCorrection()
: vérifie et corrige la grille remplieUnsetInconnus()
: supprime les coordonnées d’une case vide de la liste des cases à remplirValeursInterdites()
: retourne les valeurs interdites dans une case en fonction de la ligne, de la colonne et de la zoneDeductionParValeurInterdites()
: retourne les valeurs possibles dans une case en fonction des valeurs interditesDeductionSolitaireNu()
: résout la grille en utilisant la méthode de déduction « Solitaire Nu »SearchPairesNues()
etSearchPairesNuesCache()
: résout la grille en utilisant la méthode de déduction « Paires Nues »SelectValues()
: sélectionne les valeurs possibles dans une ligne, une colonne ou une zoneCalculSolutionDeduction()
: résout la grille en utilisant les méthodes de déduction
Cette classe offre une implémentation complète de la génération et de la résolution de grilles de Sudoku, avec différents niveaux de difficulté et des méthodes de résolution avancées. Elle peut être utilisée comme base pour développer des applications de Sudoku plus complexes.
Méthodes de résolutions :
Les méthodes de résolution basées sur des raisonnements humains qui sont présentes :
- Méthode de la « Déduction par Valeurs Interdites »
- Implémentée dans la méthode
ValeursInterdites()
etDeductionParValeurInterdites()
. - Objectif : Identifier les valeurs interdites dans une case en fonction de la ligne, de la colonne et de la zone, puis en déduire les valeurs possibles.
- Implémentée dans la méthode
- Méthode de la « Paire Nue »
- Implémentée dans les méthodes
SearchPairesNues()
etSearchPairesNuesCache()
. - Objectif : Identifier les paires de valeurs qui ne peuvent apparaître que dans deux cases d’une ligne, d’une colonne ou d’une zone, et en déduire les valeurs à placer.
- Implémentée dans les méthodes
- Méthode du « Solitaire Nu »
- Implémentée dans la méthode
DeductionSolitaireNu()
. - Objectif : Identifier les valeurs uniques dans une ligne, une colonne ou une zone, et les placer dans la grille.
- Implémentée dans la méthode
La classe SuDoKu
implémente déjà trois méthodes de résolution basées sur des raisonnements humains :
Ces méthodes permettent de résoudre une partie des grilles de Sudoku en utilisant des techniques similaires à celles employées par les joueurs humains. Cependant, il serait possible d’ajouter d’autres méthodes de résolution humaine, comme la recherche de paires cachées, de chaînes cachées, de poissons, de poissons cachés ou encore la méthode de la supposition.
Voici quelques fonctions de résolution de grilles de Sudoku basées sur des raisonnements humains qui pourraient être ajoutées à la classe SuDoKu
:
- Méthode de la « Paire Cachée »
- Objectif : Identifier les paires de valeurs qui ne peuvent apparaître que dans une seule case d’une ligne, d’une colonne ou d’une zone.
- Implémentation :
- Parcourir les lignes, les colonnes et les zones de la grille.
- Pour chaque case vide, identifier les paires de valeurs possibles.
- Vérifier si ces paires de valeurs sont présentes dans une seule case de la ligne, de la colonne ou de la zone.
- Si c’est le cas, remplir la case avec la valeur de la paire.
- Méthode de la « Chaîne Cachée »
- Objectif : Identifier les chaînes de valeurs qui ne peuvent apparaître que dans une seule ligne, colonne ou zone.
- Implémentation :
- Parcourir les lignes, les colonnes et les zones de la grille.
- Pour chaque case vide, identifier les chaînes de valeurs possibles (séquences de valeurs adjacentes).
- Vérifier si ces chaînes de valeurs sont présentes dans une seule ligne, colonne ou zone.
- Si c’est le cas, remplir les cases de la chaîne avec les valeurs correspondantes.
- Méthode de la « Poisson »
- Objectif : Identifier les valeurs qui ne peuvent apparaître que dans une seule case d’une ligne, d’une colonne ou d’une zone.
- Implémentation :
- Parcourir les lignes, les colonnes et les zones de la grille.
- Pour chaque valeur, identifier les cases où elle peut être placée.
- Si une valeur ne peut être placée que dans une seule case d’une ligne, d’une colonne ou d’une zone, remplir cette case avec la valeur.
- Méthode de la « Poisson Caché »
- Objectif : Identifier les valeurs qui ne peuvent apparaître que dans une seule case d’une ligne, d’une colonne ou d’une zone, en tenant compte des cases déjà remplies.
- Implémentation :
- Parcourir les lignes, les colonnes et les zones de la grille.
- Pour chaque valeur, identifier les cases où elle peut être placée, en tenant compte des cases déjà remplies.
- Si une valeur ne peut être placée que dans une seule case d’une ligne, d’une colonne ou d’une zone, remplir cette case avec la valeur.
- Méthode de la « Supposition »
- Objectif : Faire des suppositions sur les valeurs à placer dans les cases vides, puis vérifier la validité de ces suppositions.
- Implémentation :
- Parcourir les cases vides de la grille.
- Pour chaque case vide, faire une supposition sur la valeur à y placer.
- Vérifier la validité de la supposition en s’assurant qu’elle ne viole pas les règles du Sudoku (pas de doublons dans la ligne, la colonne ou la zone).
- Si la supposition est valide, continuer la résolution de la grille.
- Si la supposition n’est pas valide, revenir en arrière et essayer une autre valeur.
Ces méthodes de résolution basées sur des raisonnements humains peuvent être implémentées dans la classe SuDoKu
en ajoutant de nouvelles méthodes qui seraient appelées dans la boucle de résolution de la grille.
Voici quelques limites et points à améliorer dans le code de la classe SuDoKu
:
- Performances et temps d’exécution:
- Bien que le code gère le temps d’exécution pour éviter les timeouts, il pourrait être optimisé davantage pour améliorer les performances, notamment pour les grilles de grande taille.
- L’utilisation de techniques comme le multithreading ou la parallélisation pourrait être envisagée pour accélérer la résolution des grilles.
- Lisibilité et maintenabilité du code:
- Certaines parties du code sont un peu complexes et difficiles à comprendre, notamment les méthodes de résolution par déduction.
- Une refactorisation du code, avec une meilleure séparation des responsabilités et une documentation plus détaillée, pourrait améliorer la lisibilité et la maintenabilité.
La classe SuDoKu
offre une implémentation de base pour la génération et la résolution de grilles de Sudoku, il existe plusieurs opportunités d’amélioration.
Petit historique :
Vers 2008-2010, j’ai développé une version quasi identique du jeu de Sudoku actuel. Ce projet était avant tout un défi personnel, car je n’étais pas particulièrement passionné par le Sudoku, mais plutôt par les mathématiques et la programmation. Il s’agissait donc pour moi d’une opportunité de relever un défi technique et d’explorer ces domaines qui m’intéressent.
J’ai alors publié ce petit jeu de Sudoku en ligne, sur un hébergement gratuit (phpsudo.free.fr). Pendant des années, je l’ai laissé là, sans y prêter davantage attention.
En 2023, j’ai redécouvert ce projet en retrouvant le code sur un vieux disque dur. J’ai été agréablement surpris de constater que le jeu fonctionnait encore très bien sur l’hébergement free, malgré son ancienneté. Curieux de voir s’il fonctionnerait toujours sur un serveur récent avec php8, j’ai tenté de l’installer sur mon hébergement web actuel. Malheureusement, le code, initialement écrit en PHP4, ne fonctionnait plus tel quel. J’ai donc dû procéder à quelques modifications mineures pour l’adapter à la version PHP8 en vigueur. Une fois ces ajustements effectués, le jeu de Sudoku a pu repartir et fonctionner correctement sur mon nouvel hébergement. Cette redécouverte inattendue m’a permis de renouer avec ce projet, tout en constatant qu’il avait conservé sa solidité et sa fiabilité malgré le temps passé.
Dernièrement, étant le peu de temps qu’il me fallait pour faire cette amélioration, je l’ai transformé en plugin WordPress.
Bonjour,
J’utilise votre programme de sudoku qui fonctionne très bien jusqu’à php 8.1. Avec la version 8.2, il y a un petit problème « deprecated » que je vous remettrai en détails dans un message à venir.
Pour le moment, j’aurai une question ou plutôt une requête à formuler.
J’aurai souhaité à la place des chiffres ou des lettres, utiliser des icônes (des mini images nommées 1.png, 2.png ou jpg…..)
Et bien entendu, il n’est pas possible d’entrer des images au clavier. Donc j’aurai souhaité que la liste des 9 ou 16 images possibles apparaisse en bas de l’écran.
Pensez-vous vous que tout ceci soit possible ?
Merci par avance pour votre réponse
Cordialement, Daniel
Bonjour Daniel,
Je vous remercie de votre intérêt pour mon script de Sudoku et de votre retour concernant l’erreur « deprecated » que vous avez rencontrée avec la version 8.2 de PHP. Je suis désolé de ne pas avoir beaucoup de temps pour faire évoluer le Sudoku, mais je m’efforce de le mettre à jour régulièrement. Ma priorité actuelle est l’ajout d’algorithmes de résolution humaine. Je comprends que certaines fonctions PHP anciennes soient dépréciées, mais je travaille à les mettre à jour au fil du temps.
Concernant votre requête d’utiliser des icônes à la place des chiffres ou des lettres, cela est tout à fait possible. Ca ne devrait pas être trop compliqué à faire. Le coeur de l’algorithme est conçu pour être adaptable à un maximum de possibilités (dimensions, symboles, etc.). La difficulté réside plus dans la modification de l’interface graphique pour permettre une bonne jouabilité (sélection de l’image solution à la souris). Pour le moment, je n’envisage pas cette mise à jour, mais je donne l’autorisation à ceux qui le souhaitent de le faire. Mon code est ouvert et libre de droit.
Je vous remercie à nouveau pour votre retour et je suis à votre disposition si vous avez d’autres questions ou remarques.
Cordialement, Nicolas Lion