source: spip-zone/_plugins_/_stable_/jeux/jeux/sudoku.php @ 19808

Last change on this file since 19808 was 19808, checked in by patfr@…, 13 years ago
  • bug sudoku sous SPIP 1.93 (JeanFi?)
  • jQuery pour IE
  • fichier sudoku.js à part (copie exacte de mots_croises.js)
  • meilleure protection des <!-- JEUX-HEAD --> (compatibilité avec le Couteau Suisse)
File size: 7.7 KB
Line 
1<?php
2#---------------------------------------------------#
3#  Plugin  : jeux                                   #
4#  Auteur  : Patrice Vanneufville, 2006             #
5#  Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
6#  Licence : GPL                                    #
7#--------------------------------------------------------------------------#
8#  Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles  #
9#--------------------------------------------------------------------------#
10/*
11
12Insere une grille de mots croises dans vos articles !
13-----------------------------------------------------
14
15separateurs obligatoires : [sudoku], [solution]
16separateurs optionnels   : [titre], [texte], [config]
17parametres de configurations par defaut :
18        solution=oui    // Afficher la solution ?
19        regle=non       // Afficher la regle du jeu ?
20
21Tailles de sudoku acceptees : 4x4, 6x6, 9x9
22
23Exemple de syntaxe dans l'article :
24-----------------------------------
25
26<jeux>
27        [sudoku]
28        -2
29        --5--4
30        3--5
31        ----3
32        --1--6
33        6--1
34        [solution]
35        423615
36        165324
37        314562
38        256431
39        531246
40        642153
41</jeux>
42
43*/
44// affiche la grille de sudoku, en format solution au cas ou...
45function affichage_sudoku($tableau_sudoku, $indexJeux, $solution=false){
46
47        // les variables de la grille
48        $largeur = $hauteur = sizeof($tableau_sudoku);
49        switch ($largeur) {
50         case 4 : $interh = $interv = '24'; $li = $lj = 2; break;
51         case 6 : $interh = '36'; $interv = '246'; $lj = 3; $li = 2; break;
52         case 9 : $interh = $interv = '369'; $li = $lj = 3; break;
53         default : return '<p class="jeux_erreur">'._T('jeux:erreur_taille_grille').' : </p>' ;
54        }
55    $grille='';
56
57    // entetes : formulaire + grille
58    $grille .= (!$solution)? jeux_form_debut('sudoku', $indexJeux, 'jeux_grille', 'post', self())
59                : '<p class="jeux_solution">'._T('jeux:solution').' : </p>' ;
60    $grille .= '<table class="jeux_grille  sudoku" cellspacing="0" border="0" summary="'
61                . _T('sudoku:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur)) . "\">\n";
62   
63        // debut affichage des lignes
64        foreach($tableau_sudoku as $ligne => $contenu_ligne){
65                $ligne++;
66                $grille .= "\t<tr>\n\t";
67               
68                foreach ($contenu_ligne as $colonne =>$cellule){
69                    $colonne++; 
70                        $class = preg_match(",[$interh],", $colonne)?(preg_match(",[$interv],", $ligne)?' class="jeux_bas jeux_droite"':' class="jeux_droite"'):(preg_match(",[$interv],", $ligne)?' class="jeux_bas"':'');
71//                              : ($ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':''))
72//                      );
73                    // s'il s'agit pas d'un espace
74                    if ($cellule != '-') 
75                        $grille .= "\t\t<td$class><strong>$cellule</strong></td>\n";
76                        else if ($solution)
77                                $grille .= "\t\t<td$class>$cellule</td>\n" ;
78                        else {
79                                $name = 'GR'.$indexJeux.'x'.$colonne.'x'.$ligne;
80                                $grille .= "\t\t<td$class><label for=\"$name\">"
81                                        ._T('jeux:ligne_n',Array('n'=>$ligne)).';'
82                                        ._T('jeux:colonne_n',Array('n'=>$colonne)).'</label>'
83                                        . '<input type="text" maxlength="1" '
84                                        . ((isset($_POST[$name]) and $_POST[$name]!='')? 'value="'.$_POST[$name]:'')
85                                        .'" name="'.$name.'" id="'.$name.'" />'
86                                        . "</td>\n" ;
87                        }
88                } // foreach
89                                                   
90        $grille = $grille."\t</tr>\n";}         
91       
92        // fin affichage des lignes
93       
94        $grille.="</table>\n";
95
96       
97        if (!$solution) $grille .=
98                (jeux_config('regle')?'<p class="jeux_regle">'.definir_puce()._T('sudoku:regle',Array('hauteur'=>$li,'largeur'=>$lj, 'max'=>$largeur)).'</p>' : '')
99                .(jeux_config('solution')?"<p><input id=\"affiche_solution_$indexJeux\" name=\"affiche_solution_{$indexJeux}[]\" type=\"checkbox\" class=\"jeux_cocher\" value=\"1\" /><label for=\"affiche_solution_$indexJeux\" >"._T('jeux:afficher_solution')."</label></p>\n":'')
100                .'<p><input type="submit" value="'._T('jeux:verifier_validite')."\" name=\"bouton_envoi_$indexJeux\" /></p>".jeux_form_fin();
101
102        return $grille;
103}
104
105// dechiffre le code source de la grille
106function calcul_tableau_sudoku($texte){
107        $texte = preg_replace(",\s*[\r\n]+\s*,", "\n", trim($texte));
108        // arggh les raccourcis SPIP... TODO : voir pkoi (1.93)
109        $texte = str_replace('&mdash;', '--', $texte);
110        $tableau = split("\n", $texte);
111        $hauteur = count($tableau);
112        foreach ($tableau as $i=>$valeur) {
113                if (strlen($valeur)) $valeur .= str_repeat('-', $hauteur-strlen($valeur));
114                $tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY);
115        }
116        return $tableau;
117}
118
119// valide si la lsite est composee de chiffres tous differents
120function sudoku_valide_liste($liste) {
121        // echo"<br>", join(', ',$liste);
122        $chiffres = "123456789";
123        foreach($liste as $cell) if ($cell!='-') {
124                if ($chiffres[$cell]=='*') return false; else $chiffres[$cell]='*';
125        }
126        // echo ":ok";
127        return true;
128}
129
130// valide si la grille de sudoku est valide
131function sudoku_valide_grille($tableau_sudoku) {
132        $taille = sizeof($tableau_sudoku);
133        foreach($tableau_sudoku as $ligne) if (!sudoku_valide_liste($ligne)) return false;
134        for ($i=0; $i<$taille; $i++) {
135                $colonne=false;
136                foreach($tableau_sudoku as $ligne) $colonne[] = $ligne[$i];
137                if (!sudoku_valide_liste($colonne)) return false;
138        }       
139        switch ($taille) {
140         case 4 : $ii = 2; $li = 2; $ij = 2; $lj = 2; break;
141         case 6 : $ii = 3; $li = 2; $ij = 2; $lj = 3; break;
142         case 9 : $ii = 3; $li = 3; $ij = 3; $lj = 3; break;
143        }
144        for ($i=0; $i<$ii; $i++) for ($j=0; $j<$ij; $j++) {
145                $zone=false;
146                for ($x=0; $x<$li; $x++) for ($y=0; $y<$lj; $y++) $zone[] = $tableau_sudoku[$i*$li+$x][$j*$lj+$y];
147                if (!sudoku_valide_liste($zone)) return false;
148        }
149        return true;
150}
151
152// retourne les erreurs et les cases vides eventuelles
153function sudoku_validite($tableau_sudoku, $solution, $indexJeux) {
154    $vides=0;
155    foreach($tableau_sudoku as $ligne => $contenu_ligne) {
156        foreach ($contenu_ligne as $colonne => $cellule) {
157                        $input = trim(_request('GR'.$indexJeux.'x'.($colonne+1).'x'.($ligne+1)));
158                        if ($input=='' && $cellule=='-') $vides++;
159                        if ($input!='' && $cellule=='-') $tableau_sudoku[$ligne][$colonne] = $input;
160                }
161        }
162    return array(sudoku_valide_grille($tableau_sudoku), $vides);
163}
164
165// renvoie la validite et le nombre de cases vides
166function calcul_erreurs_sudoku($tableau_sudoku, $solution, $indexJeux) {
167        if (_request("bouton_envoi_$indexJeux") == '') return '';
168        else {
169          list($valide, $nbr_vides) = sudoku_validite($tableau_sudoku, $solution, $indexJeux); 
170          return '<p class="jeux_erreur">'
171                . _T('jeux:grille_'.($valide?'':'in').'valide')
172                . (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):(
173                 ($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", Array('n'=>$nbr_vides))
174                ))
175                . '</p><br />';
176        }
177}
178
179// decode une grille de sudoku
180function jeux_sudoku($texte, $indexJeux) { 
181        $sudoku = $solution = $titre = $html = false;
182    // parcourir tous les #SEPARATEURS
183        $tableau = jeux_split_texte('sudoku', $texte);
184        // configuration par defaut
185        jeux_config_init("
186                solution=oui    // Afficher la solution ?
187                regle=non       // Afficher la regle ?
188        ", false);
189        foreach($tableau as $i => $valeur) if ($i & 1) {
190         if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1];
191          elseif ($valeur==_JEUX_SUDOKU) $sudoku = calcul_tableau_sudoku($tableau[$i+1]);
192          elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_sudoku($tableau[$i+1]);
193          elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
194        }
195       
196        return  ($titre?"<p class=\"jeux_titre sudoku_titre\">$titre</p>":'')
197                        . calcul_erreurs_sudoku($sudoku, $solution, $indexJeux)
198                        . affichage_sudoku($sudoku, $indexJeux)
199        // solution
200                        . (($_POST['affiche_solution_'.$indexJeux][0] == 1)? affichage_sudoku($solution, $indexJeux, true) : '');
201}
202?>
Note: See TracBrowser for help on using the repository browser.