source: spip-zone/_plugins_/jeux/jeux/mots_croises.php @ 30253

Last change on this file since 30253 was 30253, checked in by gilles.vincent@…, 12 years ago

[30252] suite : split est deprecie en 5.3.0

File size: 8.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
12 Insere une grille de mots croises dans vos articles !
13------------------------------------------------------
14 Idee originale de Maieul ROUQUETTE
15------------------------------------------------------
16
17separateurs obligatoires : [horizontal], [vertical], [solution]
18separateurs optionnels   : [titre], [texte], [config]
19parametres de configurations par defaut :
20        solution=oui    // Afficher la solution ?
21        fondnoir=noir   // couleur des cases noires
22        compact=non             // Definitions en format compact ?
23        type=0                  // types de grilles : 0 ou 1
24
25Exemple de syntaxe dans l'article :
26-----------------------------------
27
28<jeux>
29        [horizontal]
30        Definition 1
31        Definition 2. Definition 3
32        Definition 4. Definition 5
33       
34        [vertical]
35        Definition 1
36        Definition 2
37        Definition 3
38       
39        [solution]
40        aaa
41        b*g
42        a*d
43</jeux>
44
45*/
46
47// retourne la lettre correspondant au chiffre
48function lettre_grille($chiffre) {
49        $alphabet = _T('jeux:alphabet');
50        return $alphabet[$chiffre-1];
51}
52
53// affiche la grille de mot croises, avec la solution au cas ou
54function affichage_grille_mc($tableau_grille, $indexJeux, $solution=false){
55        $jeux_couleurs = _request('jeux_couleurs');
56       
57        // les variables de la grille
58        $hauteur = sizeof($tableau_grille);
59    $largeur = sizeof($tableau_grille[0]);
60    $grille = '';
61
62    // entetes : formulaire + grille
63    $grille .= (!$solution)? jeux_form_debut('motscroises', $indexJeux, 'jeux_grille jeux_left', 'post', self())
64                : '<p class="jeux_solution">'._T('jeux:solution').' : </p>' ;
65    $grille .= '<table class="jeux_grille" cellspacing="0" border="0" summary="'
66                . _T('motscroises:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur))
67                . "\">\n\t<tr>\n\t\t<td class=\"jeux_coin\"></td>\n";
68       
69       
70        // les cellules d'entetes verticales
71        for($i = 1; $i<=$largeur; $i++) $grille .= "\t\t<th scope=\"col\">$i</th>\n";
72        $grille .= "\t</tr>\n";         
73       
74        // debut affichage des lignes
75        foreach($tableau_grille as $ligne =>$contenu_ligne){
76                $ligne++;
77                $grille .= "\t<tr>\n\t<th scope=\"row\">".lettre_grille($ligne)."</th>\n";      // numeros de ligne
78               
79                foreach ($contenu_ligne as $colonne =>$cellule){
80                    $colonne++;
81                        $class = $ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':'');
82                        $classnoir = ' class="jeux_noir' . ($ligne==$hauteur?($colonne==$largeur?' jeux_bas jeux_droite':' jeux_bas'):($colonne==$largeur?' jeux_droite':'')) . '"';
83                    // s'il s'agit d'un noir
84                    if ($cellule == "*") { 
85                                        $noires = $jeux_couleurs[jeux_config('fondnoir')];
86                                        $noires = "rgb($noires[0], $noires[1], $noires[2])";
87                                $grille .= "\t\t<td$classnoir style=\"background-color:$noires; color:$noires;\">*</td>\n";
88                                }
89                                else if ($solution)
90                                        $grille .= "\t\t<td$class>$cellule</td>\n" ;
91                                else {
92                                        $name = 'GR'.$indexJeux.'x'.$colonne.'x'.$ligne;
93                                        $valeur = _request($name);
94                                        $grille .= "\t\t<td$class><label for=\"$name\">"
95                                                . _T('jeux:ligne_n',Array('n'=>lettre_grille($ligne))).';'
96                                                . _T('jeux:colonne_n',Array('n'=>$colonne)).'</label>'
97                                                . '<input type="text" maxlength="1" '
98                                                . ((isset($valeur) and $valeur!='')? 'value="'.$valeur:'')
99                                                .'" name="'.$name.'" id="'.$name.'" />'
100                                                . "</td>\n" ;
101                                }
102                } // foreach
103                                                   
104        $grille = $grille."\t</tr>\n";}         
105       
106        // fin affichage des lignes
107       
108        $grille.="</table>\n";
109       
110        if (!$solution) $grille .=
111                (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":'')
112                .'<p><input type="submit" value="'._T('jeux:verifier')."\" name=\"bouton_envoi_$indexJeux\" /></p>".jeux_form_fin();
113
114        return $grille;
115}
116
117// dechiffre le code source de la grille
118function calcul_tableau_grille($texte){
119        $texte = preg_replace(",\s?[\r\n]+\s?,", "\n", trim($texte));
120        $tableau = preg_split("/\n/", $texte); 
121        foreach ($tableau as $i=>$valeur) $tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY);
122        return $tableau;
123}
124
125// compare les variables Post avec les valeurs de la solution...
126function comparaison_grille($tableau_grille, $indexJeux) {
127    $erreurs=0; $vides=0; $total=0;
128    foreach($tableau_grille as $ligne =>$contenu_ligne) {
129        foreach ($contenu_ligne as $colonne =>$cellule) {
130            //compare les valeurs du tableau PHP avec les variables POST
131                        if ($cellule!='*') {
132                                $input = trim(_request('GR'.$indexJeux.'x'.($colonne+1).'x'.($ligne+1)));
133                                $total++; // nombre de case total
134                    if ($input=='') $vides++;
135                 elseif (strtoupper($input)!=strtoupper($cellule)) $erreurs++;
136                        }       
137                }
138        }
139    return array($erreurs, $vides,$total);
140}
141
142// renvoie le nombre d'erreurs et de cases vides
143function calcul_erreurs_grille($solution, $indexJeux) {
144        if (_request("bouton_envoi_$indexJeux") == '') return '';
145        else {
146          list($nbr_erreurs, $nbr_vides,$total) = comparaison_grille($solution, $indexJeux); 
147          // on insere le resultat dans la base de donnee
148          if ($_POST['id_jeu']){
149                include_spip('base/jeux_ajouter_resultat');
150                jeux_ajouter_resultat($_POST['id_jeu'], $total-$nbr_erreurs-$nbr_vides, $total, "erreurs=$nbr_erreurs, vides=$nbr_vides");
151          }
152
153          // on retourne ce qu'on affiche
154          return '<p class="jeux_erreur">'
155                . (($nbr_erreurs==0)?_T('jeux:aucune_erreur'):(
156                 ($nbr_erreurs==1)?_T('jeux:une_erreur'):_T("jeux:n_erreurs", Array('n'=>$nbr_erreurs))
157                ))
158                . (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):(
159                 ($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", Array('n'=>$nbr_vides))
160                ))
161                . '</p><br />';
162        }
163}
164
165// retourne une liste compactee alphabetique ou numerique
166function jeux_listes_compacte($texte, $alpha) {
167        $tableau = preg_split("/[\r\n]+/", trim($texte));       
168        $tableau2 = array(); $i=0; $a=_T('jeux:alphabet');
169        foreach ($tableau as $i=>$valeur) if (($valeur=trim($valeur))!='') {
170                $c=$alpha?$a[$i]:$i+1;
171                if ($valeur[strlen($valeur)-1]!='.') $valeur.='.';
172                if ($valeur!='-.') $tableau2[] = "<strong>$c.</strong>&nbsp;$valeur";
173        }
174        return implode(' ', $tableau2);
175}
176
177// definitions des mots croises
178function affichage_definitions($horizontal, $vertical) {
179 if (jeux_config('compact')) return 
180                '<p><strong>'._T('motscroises:horizontalement').'&nbsp;</strong>'
181                .jeux_listes_compacte($horizontal, true) 
182                .'<br /><strong>'._T('motscroises:verticalement').'&nbsp;</strong>'
183                .jeux_listes_compacte($vertical, false).'</p>';
184 else return '<div class="spip jeux_horizontal"><h4 class="spip jeux_grille">'
185                ._T('motscroises:horizontalement')."</h4>\n".jeux_listes($horizontal).'</div>'
186        . '<div class="spip jeux_vertical"><h4 class="spip jeux_grille">'
187                ._T('motscroises:verticalement')."</h4>\n".jeux_listes($vertical).'</div>';
188}
189
190
191// decode une grille de mots croises
192function jeux_mots_croises($texte, $indexJeux) {
193        $horizontal = $vertical = $solution = $html = false;
194        $titre = _T('motscroises:titre');
195       
196    // parcourir tous les #SEPARATEURS
197        $tableau = jeux_split_texte('mots_croises', $texte);
198        // configuration par defaut
199        jeux_config_init("
200                solution=oui    // Afficher la solution ?
201                fondnoir=noir   // couleur des cases noires
202                compact=non             // Definitions en format compact ?
203                type=0                  // types de grilles : 0 ou 1
204        ", false);
205        foreach($tableau as $i => $valeur) if ($i & 1) {
206         if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1];
207          elseif ($valeur==_JEUX_HORIZONTAL) $horizontal = $tableau[$i+1];
208          elseif ($valeur==_JEUX_VERTICAL) $vertical = $tableau[$i+1];
209          elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_grille($tableau[$i+1]);
210          elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
211        }
212        $affiche_solution = _request('affiche_solution_'.$indexJeux);
213        return  '<div class="mots_croises">'
214                        . calcul_erreurs_grille($solution, $indexJeux)
215                        . affichage_grille_mc($solution, $indexJeux)
216                        . affichage_definitions($horizontal, $vertical)
217        // solution
218                        . (($affiche_solution[0] == 1)? affichage_grille_mc($solution, $indexJeux, true) : '')
219                        . '</div><br class="jeux_nettoyeur"/>';
220}
221?>
Note: See TracBrowser for help on using the repository browser.