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.

JOUER EN LIGNE

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.

Script gratuit à télécharger d'un sudoku php javascript css solution unique !

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 :

  1. Génération de grilles de Sudoku avec différents niveaux de difficulté.
  2. Résolution des grilles en utilisant des méthodes de déduction et de raisonnement humain.
  3. Validation de la résolution possible des grilles générées.
  4. Calcul du niveau de difficulté en fonction des méthodes de résolution utilisées.
  5. Affichage des grilles avec un système de mise en forme CSS.
  6. 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 grille
    • colonne() : retourne les valeurs d’une colonne de la grille
    • Grille() : 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és
    • init() : initialise une nouvelle grille de Sudoku
    • GetGrille() : génère une grille de Sudoku complète
    • NiveauDifficulte() : détermine le niveau de difficulté de la grille
    • create_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’affichage
    • lineariser_grilles() : convertit la grille en une chaîne de caractères pour la stocker en base de données
    • drawing() : affiche la grille de Sudoku avec un système de mise en forme CSS
    • Correction() : vérifie et corrige la grille remplie
    • UnsetInconnus() : supprime les coordonnées d’une case vide de la liste des cases à remplir
    • ValeursInterdites() : retourne les valeurs interdites dans une case en fonction de la ligne, de la colonne et de la zone
    • DeductionParValeurInterdites() : retourne les valeurs possibles dans une case en fonction des valeurs interdites
    • DeductionSolitaireNu() : résout la grille en utilisant la méthode de déduction “Solitaire Nu”
    • SearchPairesNues() et SearchPairesNuesCache() : 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 zone
    • CalculSolutionDeduction() : 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 :

  1. Méthode de la “Déduction par Valeurs Interdites”
    • Implémentée dans la méthode ValeursInterdites() et DeductionParValeurInterdites().
    • 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.
  2. Méthode de la “Paire Nue”
    • Implémentée dans les méthodes SearchPairesNues() et SearchPairesNuesCache().
    • 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.
  3. 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.

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 :

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 :

  1. 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.
  2. 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.

Une petite partie ?