Browse Source
-------------------------------- Report de [64877] adapté à SPIP 3.0 + Reports de [64912] (retrait des globales QCM/QRM et Trous) + Amélioration des traitements de #TEXTE/jeux grâce à l'utilisation préférentielle d'une nouvelle balise raccourci : #TEXTE_JEU. Grâce à cette balise, le traitement pre_propre (pré-décodage des jeux) qui doit agir sur le texte brut du jeu est effectué au plus tôt, avant le reste des traitements repris de la balise #TEXTE. Les arguments de cette balise sont ajoutes à la config interne du jeu (dans une boucle (JEUX), #TEXTE_JEU{key1, value1, key2, value2,...} ajoute au jeu la section suivante : [config]id_jeu=#ID_JEU, key1=value1, key2=value2, etc.) L'idée est donc d'obtenir la correction des jeux en AJAX, grâce à l'API CVT de SPIP. Ce système n'est pas pleinement utilisé car l'enregistrement des scores en base se fait au moment du calcul de la correction du jeu, bien avant l'action 'Traiter'. L'action 'Vérifier' est aujourd'hui toujours validée, car les jeux ne gèrent pas (encore?) de champ bloquant. TODO : Le reset d'un jeu n'est pas encore ajaxé. Voici donc les 3 façons pour gérer/afficher un jeu : - les jeux inline entre balises <jeux/> et sans score - les jeux créés en base (avec score), appelés grâce au modèle <jeuXX> - les jeux créés en base (avec score), corrigés en AJAX grâce au raccourci <formulaire|jeu|XX>svn/root/tags/v3.4.6

16 changed files with 742 additions and 595 deletions
@ -0,0 +1,16 @@
|
||||
<BOUCLE_jeu(JEUX){id_jeu}> |
||||
<div class="ajax"> |
||||
<!--<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_jeu-#ENV{id_jeu}'>--> |
||||
<div class='formulaire_jeu-#ENV{id_jeu}'> |
||||
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] |
||||
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] |
||||
<form method='post' action='#ENV{action}'> |
||||
<input type='hidden' name='id_jeu' value='#ENV{id_jeu}' /> |
||||
<input type='hidden' name='jeu_cvt' value='oui' /> |
||||
#ACTION_FORMULAIRE{#ENV{action}} |
||||
#TEXTE_JEU{jeu_cvt,oui,index_jeux,#ENV{index_jeux}} |
||||
<!-- <p class="boutons"><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>--> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</BOUCLE_jeu> |
@ -0,0 +1,65 @@
|
||||
<?php |
||||
#---------------------------------------------------# |
||||
# Plugin : Jeux # |
||||
# Auteur : Patrice Vanneufville, 2006 # |
||||
# Gestion des scores : Maieul Rouquette, 2007 # |
||||
# Formulaires CVT : Patrice Vanneufville, 2012 # |
||||
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
||||
# Licence : GNU/GPL (c) 2012 # |
||||
#--------------------------------------------------------------------------# |
||||
# Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
||||
#--------------------------------------------------------------------------# |
||||
|
||||
if (!defined('_ECRIRE_INC_VERSION')) return; |
||||
|
||||
/** |
||||
* Charger : declarer les champs postes et y integrer les valeurs par defaut ou precedemment postees |
||||
* |
||||
* @param int $id_jeu |
||||
* @return array |
||||
*/ |
||||
function formulaires_jeu_charger_dist($id_jeu = 0){ |
||||
// si index_jeu = 0, premier affichage et pas de correction |
||||
$indexJeux = intval(_request('index_jeux')); |
||||
return array( |
||||
// si id_jeu = 0, pas de formulaire possible |
||||
'id_jeu' => $id_jeu, |
||||
// index aleatoire du premier jeu de la page |
||||
'debut_index_jeux' => intval(_request('debut_index_jeux')), |
||||
// index aleatoire du jeu courant |
||||
'index_jeux' => $indexJeux, |
||||
// champ 0/1 indiquant s'il faut corriger ou non |
||||
'correction'.$indexJeux => intval(_request('correction_'.$indexJeux)), |
||||
// l'ensemble des reponses postees |
||||
'reponses'.$indexJeux => _request('reponses'.$indexJeux), |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Verifier : corriger les champs postes |
||||
* |
||||
* @param int $id_jeu |
||||
* @return array |
||||
*/ |
||||
function formulaires_jeu_verifier_dist($id_jeu = 0){ |
||||
// pas de gestion d'erreur bloquante pour l'instant |
||||
return array( |
||||
// erreurs a notifier |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Traiter : stocker les resultats en base |
||||
* |
||||
* @param int $id_jeu |
||||
* @return array |
||||
*/ |
||||
function formulaires_jeu_traiter_dist($id_jeu = 0){ |
||||
// les resultats sont deja enregistres par la correction du jeu |
||||
return array( |
||||
// 'message_ok' => _L('config_info_enregistree'), |
||||
); |
||||
} |
||||
|
||||
|
||||
?> |
@ -1,243 +1,242 @@
|
||||
<?php |
||||
if (!defined("_ECRIRE_INC_VERSION")) return; |
||||
#---------------------------------------------------# |
||||
# Plugin : jeux # |
||||
# Auteur : Patrice Vanneufville, 2006 # |
||||
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
||||
# Licence : GPL # |
||||
#--------------------------------------------------------------------------# |
||||
# Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
||||
#--------------------------------------------------------------------------# |
||||
/* |
||||
|
||||
Insere une grille de mots croises dans vos articles ! |
||||
------------------------------------------------------ |
||||
Idee originale de Ma•eul ROUQUETTE |
||||
------------------------------------------------------ |
||||
|
||||
separateurs obligatoires : [horizontal], [vertical], [solution] |
||||
separateurs optionnels : [titre], [texte], [config] |
||||
parametres de configurations par defaut : |
||||
solution=oui // Afficher la solution ? |
||||
fondnoir=noir // couleur des cases noires |
||||
compact=non // Definitions en format compact ? |
||||
if (!defined("_ECRIRE_INC_VERSION")) return; |
||||
#---------------------------------------------------# |
||||
# Plugin : jeux # |
||||
# Auteur : Patrice Vanneufville, 2006 # |
||||
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
||||
# Licence : GPL # |
||||
#--------------------------------------------------------------------------# |
||||
# Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
||||
#--------------------------------------------------------------------------# |
||||
/* |
||||
|
||||
Insere une grille de mots croises dans vos articles ! |
||||
------------------------------------------------------ |
||||
Idee originale de Ma•eul ROUQUETTE |
||||
------------------------------------------------------ |
||||
|
||||
separateurs obligatoires : [horizontal], [vertical], [solution] |
||||
separateurs optionnels : [titre], [texte], [config] |
||||
parametres de configurations par defaut : |
||||
solution=oui // Afficher la solution ? |
||||
fondnoir=noir // couleur des cases noires |
||||
compact=non // Definitions en format compact ? |
||||
type=0 // types de grilles : 0 ou 1 |
||||
vertical=chiffres // on met des chiffres en vertical |
||||
horizontal=lettres // on met des lettres en horizontal |
||||
Exemple de syntaxe dans l'article : |
||||
----------------------------------- |
||||
|
||||
<jeux> |
||||
[horizontal] |
||||
Definition 1 |
||||
Definition 2. Definition 3 |
||||
Definition 4. Definition 5 |
||||
|
||||
[vertical] |
||||
Definition 1 |
||||
Definition 2 |
||||
Definition 3 |
||||
|
||||
[solution] |
||||
aaa |
||||
b*g |
||||
a*d |
||||
</jeux> |
||||
|
||||
*/ |
||||
|
||||
// retourne la lettre correspondant au chiffre |
||||
function lettre_grille($chiffre) { |
||||
$alphabet = _T('jeux:alphabet'); |
||||
return $alphabet[$chiffre-1]; |
||||
} |
||||
|
||||
// affiche la grille de mot croises, avec la solution au cas ou |
||||
function affichage_grille_mc($tableau_grille, $indexJeux, $form, $solution=false){ |
||||
$jeux_couleurs = _request('jeux_couleurs'); |
||||
// les variables de la grille |
||||
$hauteur = sizeof($tableau_grille); |
||||
$largeur = sizeof($tableau_grille[0]); |
||||
$grille = ''; |
||||
horizontal=lettres // on met des lettres en horizontal |
||||
Exemple de syntaxe dans l'article : |
||||
----------------------------------- |
||||
|
||||
<jeux> |
||||
[horizontal] |
||||
Definition 1 |
||||
Definition 2. Definition 3 |
||||
Definition 4. Definition 5 |
||||
|
||||
[vertical] |
||||
Definition 1 |
||||
Definition 2 |
||||
Definition 3 |
||||
|
||||
[solution] |
||||
aaa |
||||
b*g |
||||
a*d |
||||
</jeux> |
||||
|
||||
*/ |
||||
|
||||
// retourne la lettre correspondant au chiffre |
||||
function lettre_grille($chiffre) { |
||||
$alphabet = _T('jeux:alphabet'); |
||||
return $alphabet[$chiffre-1]; |
||||
} |
||||
|
||||
// affiche la grille de mot croises, avec la solution au cas ou |
||||
function affichage_grille_mc($tableau_grille, $indexJeux, $form, $solution=false){ |
||||
$jeux_couleurs = _request('jeux_couleurs'); |
||||
// les variables de la grille |
||||
$hauteur = sizeof($tableau_grille); |
||||
$largeur = sizeof($tableau_grille[0]); |
||||
$grille = ''; |
||||
|
||||
$type_vertical = jeux_config('vertical'); |
||||
$type_horizontal = jeux_config('horizontal'); |
||||
|
||||
// entetes : formulaire + grille |
||||
$grille .= (!$solution) |
||||
? ($form?jeux_form_debut('motscroises', $indexJeux, 'jeux_grille jeux_left', 'post', self()):'') |
||||
: '<div class="jeux_solution">'._T('jeux:solution').' : </div>' ; |
||||
$grille .= '<table class="jeux_grille" cellspacing="0" border="0" summary="' |
||||
. _T('motscroises:table_summary', array('hauteur'=>$hauteur,'largeur'=>$largeur)) |
||||
. "\">\n\t<tr>\n\t\t<td class=\"jeux_coin\"></td>\n"; |
||||
|
||||
|
||||
// les cellules d'entetes verticales |
||||
|
||||
// entetes : formulaire + grille |
||||
$grille .= (!$solution) |
||||
? ($form?jeux_form_debut('motscroises', $indexJeux, 'jeux_grille jeux_left', 'post', self()):'') |
||||
: '<div class="jeux_solution">'._T('jeux:solution').' : </div>' ; |
||||
$grille .= '<table class="jeux_grille" cellspacing="0" border="0" summary="' |
||||
. _T('motscroises:table_summary', array('hauteur'=>$hauteur,'largeur'=>$largeur)) |
||||
. "\">\n\t<tr>\n\t\t<td class=\"jeux_coin\"></td>\n"; |
||||
|
||||
|
||||
// les cellules d'entetes verticales |
||||
for($i = 1; $i<=$largeur; $i++){ |
||||
$entete_colonne = $type_vertical == 'lettres' ? lettre_grille($i) : $i ; |
||||
$grille .= "\t\t<th scope=\"col\">$entete_colonne</th>\n"; |
||||
} |
||||
$grille .= "\t</tr>\n"; |
||||
|
||||
// debut affichage des lignes |
||||
foreach($tableau_grille as $ligne =>$contenu_ligne){ |
||||
} |
||||
$grille .= "\t</tr>\n"; |
||||
|
||||
// debut affichage des lignes |
||||
foreach($tableau_grille as $ligne =>$contenu_ligne){ |
||||
$ligne++; |
||||
$entete_ligne = $type_horizontal=='chiffres'?$ligne:lettre_grille($ligne); |
||||
$grille .= "\t<tr>\n\t<th scope=\"row\">".$entete_ligne."</th>\n"; // numeros de ligne |
||||
|
||||
foreach ($contenu_ligne as $colonne =>$cellule){ |
||||
$entete_ligne = $type_horizontal=='chiffres'?$ligne:lettre_grille($ligne); |
||||
$grille .= "\t<tr>\n\t<th scope=\"row\">".$entete_ligne."</th>\n"; // numeros de ligne |
||||
|
||||
foreach ($contenu_ligne as $colonne =>$cellule){ |
||||
$colonne++; |
||||
$entete_colonne = $type_vertical == 'lettres' ? lettre_grille($colonne) : $colonne; |
||||
$class = $ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':''); |
||||
$classnoir = ' class="jeux_noir' . ($ligne==$hauteur?($colonne==$largeur?' jeux_bas jeux_droite':' jeux_bas'):($colonne==$largeur?' jeux_droite':'')) . '"'; |
||||
// s'il s'agit d'un noir |
||||
if ($cellule == "*") { |
||||
$noires = $jeux_couleurs[jeux_config('fondnoir')]; |
||||
$noires = "rgb($noires[0], $noires[1], $noires[2])"; |
||||
$grille .= "\t\t<td$classnoir style=\"background-color:$noires; color:$noires;\">*</td>\n"; |
||||
} |
||||
else if ($solution) |
||||
$grille .= "\t\t<td$class>$cellule</td>\n" ; |
||||
else { |
||||
$name = 'GR'.$indexJeux.'x'.$colonne.'x'.$ligne; |
||||
$valeur = _request($name); |
||||
$grille .= "\t\t<td$class><label for=\"$name\">" |
||||
. _T('jeux:ligne_n', array('n'=>$entete_ligne)).';' |
||||
. _T('jeux:colonne_n', array('n'=>$entete_colonne)).'</label>' |
||||
. '<input type="text" maxlength="1" ' |
||||
. ((isset($valeur) and $valeur!='')? 'value="'.$valeur:'') |
||||
.'" name="'.$name.'" id="'.$name.'" />' |
||||
. "</td>\n" ; |
||||
} |
||||
} // foreach |
||||
|
||||
$grille = $grille."\t</tr>\n";} |
||||
|
||||
// fin affichage des lignes |
||||
|
||||
$grille.="</table>\n"; |
||||
|
||||
if (!$solution) $grille .= |
||||
(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":'') |
||||
.'<p><input type="submit" value="'._T('jeux:verifier')."\" name=\"bouton_envoi_$indexJeux\" /></p>" |
||||
.($form?jeux_form_fin():''); |
||||
|
||||
return $grille; |
||||
} |
||||
|
||||
// dechiffre le code source de la grille |
||||
function calcul_tableau_grille($texte){ |
||||
$texte = preg_replace(",\s?[\r\n]+\s?,", "\n", trim($texte)); |
||||
$tableau = preg_split("/\n/", $texte); |
||||
foreach ($tableau as $i=>$valeur) $tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY); |
||||
return $tableau; |
||||
} |
||||
|
||||
// compare les variables Post avec les valeurs de la solution... |
||||
function comparaison_grille($tableau_grille, $indexJeux) { |
||||
$erreurs=0; $vides=0; $total=0; |
||||
foreach($tableau_grille as $ligne =>$contenu_ligne) { |
||||
foreach ($contenu_ligne as $colonne =>$cellule) { |
||||
//compare les valeurs du tableau PHP avec les variables POST |
||||
if ($cellule!='*') { |
||||
$input = trim(_request('GR'.$indexJeux.'x'.($colonne+1).'x'.($ligne+1))); |
||||
$total++; // nombre de case total |
||||
if ($input=='') $vides++; |
||||
elseif (strtoupper($input)!=strtoupper($cellule)) $erreurs++; |
||||
} |
||||
} |
||||
} |
||||
return array($erreurs, $vides,$total); |
||||
} |
||||
|
||||
// renvoie le nombre d'erreurs et de cases vides |
||||
function calcul_erreurs_grille($solution, $indexJeux) { |
||||
if (_request("bouton_envoi_$indexJeux") == '') return ''; |
||||
else { |
||||
list($nbr_erreurs, $nbr_vides,$total) = comparaison_grille($solution, $indexJeux); |
||||
// on insere le resultat dans la base de donnee |
||||
if ($_POST['id_jeu']){ |
||||
include_spip('base/jeux_ajouter_resultat'); |
||||
jeux_ajouter_resultat($_POST['id_jeu'], $total-$nbr_erreurs-$nbr_vides, $total, "erreurs=$nbr_erreurs, vides=$nbr_vides"); |
||||
} |
||||
|
||||
// on retourne ce qu'on affiche |
||||
return '<div class="jeux_erreur">' |
||||
. (($nbr_erreurs==0)?_T('jeux:aucune_erreur'):( |
||||
($nbr_erreurs==1)?_T('jeux:une_erreur'):_T("jeux:n_erreurs", array('n'=>$nbr_erreurs)) |
||||
)) |
||||
. (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):( |
||||
($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", array('n'=>$nbr_vides)) |
||||
)) |
||||
. '</div><br />'; |
||||
} |
||||
} |
||||
|
||||
// retourne une liste compactee alphabetique ou numerique |
||||
function jeux_listes_compacte($texte, $alpha) { |
||||
$tableau = preg_split("/[\r\n]+/", trim($texte)); |
||||
$tableau2 = array(); $i=0; $a=_T('jeux:alphabet'); |
||||
foreach ($tableau as $i=>$valeur) if (($valeur=trim($valeur))!='') { |
||||
$c=$alpha?$a[$i]:$i+1; |
||||
if ($valeur[strlen($valeur)-1]!='.') $valeur.='.'; |
||||
if ($valeur!='-.') $tableau2[] = "<strong>$c.</strong> $valeur"; |
||||
} |
||||
return implode(' ', $tableau2); |
||||
} |
||||
|
||||
// definitions des mots croises |
||||
function affichage_definitions($horizontal, $vertical) { |
||||
if (jeux_config('compact')) return |
||||
'<p><strong>'._T('motscroises:horizontalement').' </strong>' |
||||
.jeux_listes_compacte($horizontal, jeux_config('horizontal')=='lettres') |
||||
.'<br /><strong>'._T('motscroises:verticalement').' </strong>' |
||||
.jeux_listes_compacte($vertical, jeux_config('vertical')=='lettres').'</p>'; |
||||
$entete_colonne = $type_vertical == 'lettres' ? lettre_grille($colonne) : $colonne; |
||||
$class = $ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':''); |
||||
$classnoir = ' class="jeux_noir' . ($ligne==$hauteur?($colonne==$largeur?' jeux_bas jeux_droite':' jeux_bas'):($colonne==$largeur?' jeux_droite':'')) . '"'; |
||||
// s'il s'agit d'un noir |
||||
if ($cellule == "*") { |
||||
$noires = $jeux_couleurs[jeux_config('fondnoir')]; |
||||
$noires = "rgb($noires[0], $noires[1], $noires[2])"; |
||||
$grille .= "\t\t<td$classnoir style=\"background-color:$noires; color:$noires;\">*</td>\n"; |
||||
} |
||||
else if ($solution) |
||||
$grille .= "\t\t<td$class>$cellule</td>\n" ; |
||||
else { |
||||
list($id, $name) = jeux_idname($indexJeux, $colonne, 'C', $ligne, 'L'); |
||||
$value = jeux_form_reponse($indexJeux, $colonne, 'C', $ligne, 'L'); |
||||
$value = strlen($value)?' value="'.$value.'"':''; |
||||
$grille .= "\t\t<td$class><label for=\"$name\">" |
||||
. _T('jeux:ligne_n', array('n'=>$entete_ligne)).';' |
||||
. _T('jeux:colonne_n', array('n'=>$entete_colonne)).'</label>' |
||||
. "<input type='text' maxlength='1'$value name='$name' id='$id' /></td>\n" ; |
||||
} |
||||
} // foreach |
||||
|
||||
$grille = $grille."\t</tr>\n";} |
||||
|
||||
// fin affichage des lignes |
||||
|
||||
$grille.="</table>\n"; |
||||
|
||||
if (!$solution) { |
||||
list($id, $name) = jeux_idname($indexJeux, 'SOL'); |
||||
$grille .= |
||||
(jeux_config('solution')?"<p><input id='$id' name='$name' type='checkbox' class='jeux_cocher' value='1' /><label for='$id' >"._T('jeux:afficher_solution')."</label></p>\n":'') |
||||
.'<p><input type="submit" value="'._T('jeux:verifier')."\" name='submit' /></p>" |
||||
.($form?jeux_form_fin():''); |
||||
} |
||||
|
||||
return $grille; |
||||
} |
||||
|
||||
// dechiffre le code source de la grille |
||||
function calcul_tableau_grille($texte){ |
||||
$texte = preg_replace(",\s?[\r\n]+\s?,", "\n", trim($texte)); |
||||
$tableau = preg_split("/\n/", $texte); |
||||
foreach ($tableau as $i=>$valeur) $tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY); |
||||
return $tableau; |
||||
} |
||||
|
||||
// compare les variables Post avec les valeurs de la solution... |
||||
function comparaison_grille($tableau_grille, $indexJeux) { |
||||
$erreurs=0; $vides=0; $total=0; |
||||
foreach($tableau_grille as $ligne =>$contenu_ligne) { |
||||
foreach ($contenu_ligne as $colonne =>$cellule) { |
||||
//compare les valeurs du tableau PHP avec les variables POST |
||||
if ($cellule!='*') { |
||||
$input = jeux_form_reponse($indexJeux, $colonne+1, 'C', $ligne+1, 'L'); |
||||
$total++; // nombre de case total |
||||
if ($input=='') $vides++; |
||||
elseif (strtoupper($input)!=strtoupper($cellule)) $erreurs++; |
||||
} |
||||
} |
||||
} |
||||
return array($erreurs, $vides,$total); |
||||
} |
||||
|
||||
// renvoie le nombre d'erreurs et de cases vides |
||||
function calcul_erreurs_grille($solution, $indexJeux) { |
||||
if (!jeux_form_correction($indexJeux)) return ''; |
||||
list($nbr_erreurs, $nbr_vides,$total) = comparaison_grille($solution, $indexJeux); |
||||
$id_jeu = _request('id_jeu'); |
||||
// on insere le resultat dans la base de donnee |
||||
if ($id_jeu){ |
||||
include_spip('base/jeux_ajouter_resultat'); |
||||
jeux_ajouter_resultat($id_jeu, $total-$nbr_erreurs-$nbr_vides, $total, "erreurs=$nbr_erreurs, vides=$nbr_vides"); |
||||
} |
||||
|
||||
// on retourne ce qu'on affiche |
||||
return '<div class="jeux_erreur">' |
||||
. (($nbr_erreurs==0)?_T('jeux:aucune_erreur'):( |
||||
($nbr_erreurs==1)?_T('jeux:une_erreur'):_T("jeux:n_erreurs", array('n'=>$nbr_erreurs)) |
||||
)) |
||||
. (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):( |
||||
($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", array('n'=>$nbr_vides)) |
||||
)) |
||||
. '</div><br />'; |
||||
} |
||||
|
||||
// retourne une liste compactee alphabetique ou numerique |
||||
function jeux_listes_compacte($texte, $alpha) { |
||||
$tableau = preg_split("/[\r\n]+/", trim($texte)); |
||||
$tableau2 = array(); $i=0; $a=_T('jeux:alphabet'); |
||||
foreach ($tableau as $i=>$valeur) if (($valeur=trim($valeur))!='') { |
||||
$c=$alpha?$a[$i]:$i+1; |
||||
if ($valeur[strlen($valeur)-1]!='.') $valeur.='.'; |
||||
if ($valeur!='-.') $tableau2[] = "<strong>$c.</strong> $valeur"; |
||||
} |
||||
return implode(' ', $tableau2); |
||||
} |
||||
|
||||
// definitions des mots croises |
||||
function affichage_definitions($horizontal, $vertical) { |
||||
if (jeux_config('compact')) return |
||||
'<p><strong>'._T('motscroises:horizontalement').' </strong>' |
||||
.jeux_listes_compacte($horizontal, jeux_config('horizontal')=='lettres') |
||||
.'<br /><strong>'._T('motscroises:verticalement').' </strong>' |
||||
.jeux_listes_compacte($vertical, jeux_config('vertical')=='lettres').'</p>'; |
||||
else |
||||
$liste_horizontal = jeux_config('horizontal')=='chiffres'?'<div class="spip jeux_horizontal jeux_liste_chiffres">':'<div class="spip jeux_horizontal jeux_liste_lettres">'; |
||||
|
||||
$liste_horizontal .= '<h4 class="spip jeux_grille">' |
||||
$liste_horizontal .= '<h4 class="spip jeux_grille">' |
||||
._T('motscroises:horizontalement')."</h4>\n".jeux_listes($horizontal).'</div>'; |
||||
|
||||
|
||||
$liste_vertical = jeux_config('vertical')=='lettres'?'<div class="spip jeux_vertical jeux_liste_lettres">':'<div class="spip jeux_vertical jeux_liste_chiffres">'; |
||||
$liste_vertical .= '<h4 class="spip jeux_grille">' |
||||
$liste_vertical .= '<h4 class="spip jeux_grille">' |
||||
._T('motscroises:verticalement')."</h4>\n".jeux_listes($vertical).'</div>'; |
||||
return $liste_horizontal.$liste_vertical; |
||||
} |
||||
|
||||
// configuration par defaut : jeu_{mon_jeu}_init() |
||||
function jeux_mots_croises_init() { |
||||
return " |
||||
solution=oui // Afficher la solution ? |
||||
fondnoir=noir // couleur des cases noires |
||||
compact=non // Definitions en format compact ? |
||||
return $liste_horizontal.$liste_vertical; |
||||
} |
||||
|
||||
// configuration par defaut : jeu_{mon_jeu}_init() |
||||
function jeux_mots_croises_init() { |
||||
return " |
||||
solution=oui // Afficher la solution ? |
||||
fondnoir=noir // couleur des cases noires |
||||
compact=non // Definitions en format compact ? |
||||
type=0 // types de grilles : 0 ou 1 |
||||
vertical=chiffres // on met des chiffres en vertical |
||||
horizontal=lettres // on met des lettres en horizontal |
||||
"; |
||||
} |
||||
|
||||
// decode une grille de mots croises |
||||
// traitement du jeu : jeu_{mon_jeu}() |
||||
horizontal=lettres // on met des lettres en horizontal |
||||
"; |
||||
} |
||||
|
||||
// decode une grille de mots croises |
||||
// traitement du jeu : jeu_{mon_jeu}() |
||||
function jeux_mots_croises($texte, $indexJeux, $form=true) { |
||||
|
||||
$horizontal = $vertical = $solution = $html = false; |
||||
$titre = _T('motscroises:titre'); |
||||
// parcourir tous les #SEPARATEURS |
||||
$tableau = jeux_split_texte('mots_croises', $texte); |
||||
|
||||
$horizontal = $vertical = $solution = $html = false; |
||||
$titre = _T('motscroises:titre'); |
||||
// parcourir tous les #SEPARATEURS |
||||
$tableau = jeux_split_texte('mots_croises', $texte); |
||||
foreach($tableau as $i => $valeur) if ($i & 1) { |
||||
if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_HORIZONTAL) $horizontal = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_VERTICAL) $vertical = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_grille($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1]; |
||||
} |
||||
$affiche_solution = _request('affiche_solution_'.$indexJeux); |
||||
return '<div class="mots_croises">' |
||||
. calcul_erreurs_grille($solution, $indexJeux) |
||||
. affichage_grille_mc($solution, $indexJeux, $form) |
||||
. affichage_definitions($horizontal, $vertical) |
||||
// solution |
||||
. (($affiche_solution[0] == 1)? affichage_grille_mc($solution, $indexJeux, $form, true) : '') |
||||
. '</div><br class="jeux_nettoyeur"/>'; |
||||
} |
||||
?> |
||||
if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_HORIZONTAL) $horizontal = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_VERTICAL) $vertical = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_grille($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1]; |
||||
} |
||||
return '<div class="mots_croises">' |
||||
. calcul_erreurs_grille($solution, $indexJeux) |
||||
. affichage_grille_mc($solution, $indexJeux, $form) |
||||
. affichage_definitions($horizontal, $vertical) |
||||
// solution |
||||
. (jeux_form_reponse($indexJeux, 'SOL') ? affichage_grille_mc($solution, $indexJeux, $form, true) : '') |
||||
. '</div><br class="jeux_nettoyeur"/>'; |
||||
} |
||||
?> |
||||
|
@ -1,206 +1,206 @@
|
||||
<?php |
||||
if (!defined("_ECRIRE_INC_VERSION")) return; |
||||
#---------------------------------------------------# |
||||
# Plugin : jeux # |
||||
# Auteur : Patrice Vanneufville, 2006 # |
||||
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
||||
# Licence : GPL # |
||||
#--------------------------------------------------------------------------# |
||||
# Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
||||
#--------------------------------------------------------------------------# |
||||
/* |
||||
|
||||
Insere une grille de mots croises dans vos articles ! |
||||
----------------------------------------------------- |
||||
|
||||
separateurs obligatoires : [sudoku], [solution] |
||||
separateurs optionnels : [titre], [texte], [config] |
||||
parametres de configurations par defaut : |
||||
solution=oui // Afficher la solution ? |
||||
regle=non // Afficher la regle du jeu ? |
||||
|
||||
Tailles de sudoku acceptees : 4x4, 6x6, 9x9 |
||||
|
||||
Exemple de syntaxe dans l'article : |
||||
----------------------------------- |
||||
|
||||
<jeux> |
||||
[sudoku] |
||||
-2 |
||||
--5--4 |
||||
3--5 |
||||
----3 |
||||
--1--6 |
||||
6--1 |
||||
[solution] |
||||
423615 |
||||
165324 |
||||
314562 |
||||
256431 |
||||
531246 |
||||
642153 |
||||
</jeux> |
||||
|
||||
*/ |
||||
// affiche la grille de sudoku, en format solution au cas ou... |
||||
function affichage_sudoku($tableau_sudoku, $indexJeux, $form=true, $solution=false){ |
||||
|
||||
// les variables de la grille |
||||
$largeur = $hauteur = sizeof($tableau_sudoku); |
||||
switch ($largeur) { |
||||
case 4 : $interh = $interv = '24'; $li = $lj = 2; break; |
||||
case 6 : $interh = '36'; $interv = '246'; $lj = 3; $li = 2; break; |
||||
case 9 : $interh = $interv = '369'; $li = $lj = 3; break; |
||||
default : return '<div class="jeux_erreur">'._T('jeux:erreur_taille_grille').' : </div>' ; |
||||
} |
||||
$grille=''; |
||||
|
||||
// entetes : formulaire + grille |
||||
$grille .= (!$solution) |
||||
? ($form?jeux_form_debut('sudoku', $indexJeux, 'jeux_grille', 'post', self()):'') |
||||
: '<div class="jeux_solution">'._T('jeux:solution').' : </div>' ; |
||||
$grille .= '<table class="jeux_grille sudoku" cellspacing="0" border="0" summary="' |
||||
. _T('sudoku:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur)) . "\">\n"; |
||||
|
||||
// debut affichage des lignes |
||||
foreach($tableau_sudoku as $ligne => $contenu_ligne){ |
||||
$ligne++; |
||||
$grille .= "\t<tr>\n\t"; |
||||
|
||||
foreach ($contenu_ligne as $colonne =>$cellule){ |
||||
$colonne++; |
||||
$class = preg_match(",[$interh],", $colonne)?(preg_match(",[$interv],", $ligne)?' class="jeux_bas jeux_droite"':' class="jeux_droite"'):(preg_match(",[$interv],", $ligne)?' class="jeux_bas"':''); |
||||
// : ($ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':'')) |
||||
// ); |
||||
// s'il s'agit pas d'un espace |
||||
if ($cellule != '-') |
||||
$grille .= "\t\t<td$class><strong>$cellule</strong></td>\n"; |
||||
else if ($solution) |
||||
$grille .= "\t\t<td$class>$cellule</td>\n" ; |
||||
else { |
||||
$name = 'GR'.$indexJeux.'x'.$colonne.'x'.$ligne; |
||||
$grille .= "\t\t<td$class><label for=\"$name\">" |
||||
._T('jeux:ligne_n',Array('n'=>$ligne)).';' |
||||
._T('jeux:colonne_n',Array('n'=>$colonne)).'</label>' |
||||
. '<input type="text" maxlength="1" ' |
||||
. ((isset($_POST[$name]) and $_POST[$name]!='')? 'value="'.$_POST[$name]:'') |
||||
.'" name="'.$name.'" id="'.$name.'" />' |
||||
. "</td>\n" ; |
||||
} |
||||
} // foreach |
||||
|
||||
$grille = $grille."\t</tr>\n";} |
||||
|
||||
// fin affichage des lignes |
||||
$grille.="</table>\n"; |
||||
|
||||
if (!$solution) $grille .= |
||||
(jeux_config('regle')?'<div class="jeux_regle">'.definir_puce()._T('sudoku:regle',Array('hauteur'=>$li,'largeur'=>$lj, 'max'=>$largeur)).'</div>' : '') |
||||
.(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":'') |
||||
.'<p><input type="submit" value="'._T('jeux:verifier_validite')."\" name=\"bouton_envoi_$indexJeux\" /></p>" |
||||
.($form?jeux_form_fin():''); |
||||
|
||||
return $grille; |
||||
} |
||||
|
||||
// dechiffre le code source de la grille |
||||
function calcul_tableau_sudoku($texte){ |
||||
$texte = preg_replace(",\s*[\r\n]+\s*,", "\n", trim($texte)); |
||||
// arggh les raccourcis SPIP... TODO : voir pkoi (1.93) |
||||
$texte = str_replace('—', '--', $texte); |
||||
$tableau = preg_split("/\n/", $texte); |
||||
$hauteur = count($tableau); |
||||
foreach ($tableau as $i=>$valeur) { |
||||
if (strlen($valeur)) $valeur .= str_repeat('-', $hauteur-strlen($valeur)); |
||||
$tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY); |
||||
} |
||||
return $tableau; |
||||
} |
||||
|
||||
// valide si la lsite est composee de chiffres tous differents |
||||
function sudoku_valide_liste($liste) { |
||||
// echo"<br>", join(', ',$liste); |
||||
$chiffres = "123456789"; |
||||
foreach($liste as $cell) if ($cell!='-') { |
||||
if ($chiffres[$cell]=='*') return false; else $chiffres[$cell]='*'; |
||||
} |
||||
// echo ":ok"; |
||||
return true; |
||||
} |
||||
|
||||
// valide si la grille de sudoku est valide |
||||
function sudoku_valide_grille($tableau_sudoku) { |
||||
$taille = sizeof($tableau_sudoku); |
||||
foreach($tableau_sudoku as $ligne) if (!sudoku_valide_liste($ligne)) return false; |
||||
for ($i=0; $i<$taille; $i++) { |
||||
$colonne=false; |
||||
foreach($tableau_sudoku as $ligne) $colonne[] = $ligne[$i]; |
||||
if (!sudoku_valide_liste($colonne)) return false; |
||||
} |
||||
switch ($taille) { |
||||
case 4 : $ii = 2; $li = 2; $ij = 2; $lj = 2; break; |
||||
case 6 : $ii = 3; $li = 2; $ij = 2; $lj = 3; break; |
||||
case 9 : $ii = 3; $li = 3; $ij = 3; $lj = 3; break; |
||||
} |
||||
for ($i=0; $i<$ii; $i++) for ($j=0; $j<$ij; $j++) { |
||||
$zone=false; |
||||
for ($x=0; $x<$li; $x++) for ($y=0; $y<$lj; $y++) $zone[] = $tableau_sudoku[$i*$li+$x][$j*$lj+$y]; |
||||
if (!sudoku_valide_liste($zone)) return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
// retourne les erreurs et les cases vides eventuelles |
||||
function sudoku_validite($tableau_sudoku, $solution, $indexJeux) { |
||||
$vides=0; |
||||
foreach($tableau_sudoku as $ligne => $contenu_ligne) { |
||||
foreach ($contenu_ligne as $colonne => $cellule) { |
||||
$input = trim(_request('GR'.$indexJeux.'x'.($colonne+1).'x'.($ligne+1))); |
||||
if ($input=='' && $cellule=='-') $vides++; |
||||
if ($input!='' && $cellule=='-') $tableau_sudoku[$ligne][$colonne] = $input; |
||||
} |
||||
} |
||||
return array(sudoku_valide_grille($tableau_sudoku), $vides); |
||||
} |
||||
|
||||
// renvoie la validite et le nombre de cases vides |
||||
function calcul_erreurs_sudoku($tableau_sudoku, $solution, $indexJeux) { |
||||
if (_request("bouton_envoi_$indexJeux") == '') return ''; |
||||
else { |
||||
list($valide, $nbr_vides) = sudoku_validite($tableau_sudoku, $solution, $indexJeux); |
||||
return '<div class="jeux_erreur">' |
||||
. _T('jeux:grille_'.($valide?'':'in').'valide') |
||||
. (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):( |
||||
($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", Array('n'=>$nbr_vides)) |
||||
)) |
||||
. '</div><br />'; |
||||
} |
||||
} |
||||
|
||||
// configuration par defaut : jeu_{mon_jeu}_init() |
||||
function jeux_sudoku_init() { |
||||
return " |
||||
solution=oui // Afficher la solution ? |
||||
regle=non // Afficher la regle ? |
||||
"; |
||||
} |
||||
|
||||
// decode une grille de sudoku |
||||
function jeux_sudoku($texte, $indexJeux, $form=true) { |
||||
$sudoku = $solution = $titre = $html = false; |
||||
// parcourir tous les #SEPARATEURS |
||||
$tableau = jeux_split_texte('sudoku', $texte); |
||||
foreach($tableau as $i => $valeur) if ($i & 1) { |
||||
if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_SUDOKU) $sudoku = calcul_tableau_sudoku($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_sudoku($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1]; |
||||
} |
||||
|
||||
return ($titre?"<div class=\"jeux_titre sudoku_titre\">$titre</div>":'') |
||||
. calcul_erreurs_sudoku($sudoku, $solution, $indexJeux) |
||||
. affichage_sudoku($sudoku, $indexJeux, $form) |
||||
// solution |
||||
. (($_POST['affiche_solution_'.$indexJeux][0] == 1)? affichage_sudoku($solution, $indexJeux, $form, true) : ''); |
||||
} |
||||
?> |
||||
if (!defined("_ECRIRE_INC_VERSION")) return; |
||||
#---------------------------------------------------# |
||||
# Plugin : jeux # |
||||
# Auteur : Patrice Vanneufville, 2006 # |
||||
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
||||
# Licence : GPL # |
||||
#--------------------------------------------------------------------------# |
||||
# Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
||||
#--------------------------------------------------------------------------# |
||||
/* |
||||
|
||||
Insere une grille de mots croises dans vos articles ! |
||||
----------------------------------------------------- |
||||
|
||||
separateurs obligatoires : [sudoku], [solution] |
||||
separateurs optionnels : [titre], [texte], [config] |
||||
parametres de configurations par defaut : |
||||
solution=oui // Afficher la solution ? |
||||
regle=non // Afficher la regle du jeu ? |
||||
|
||||
Tailles de sudoku acceptees : 4x4, 6x6, 9x9 |
||||
|
||||
Exemple de syntaxe dans l'article : |
||||
----------------------------------- |
||||
|
||||
<jeux> |
||||
[sudoku] |
||||
-2 |
||||
--5--4 |
||||
3--5 |
||||
----3 |
||||
--1--6 |
||||
6--1 |
||||
[solution] |
||||
423615 |
||||
165324 |
||||
314562 |
||||
256431 |
||||
531246 |
||||
642153 |
||||
</jeux> |
||||
|
||||
*/ |
||||
// affiche la grille de sudoku, en format solution au cas ou... |
||||
function affichage_sudoku($tableau_sudoku, $indexJeux, $form=true, $solution=false){ |
||||
|
||||
// les variables de la grille |
||||
$largeur = $hauteur = sizeof($tableau_sudoku); |
||||
switch ($largeur) { |
||||
case 4 : $interh = $interv = '24'; $li = $lj = 2; break; |
||||
case 6 : $interh = '36'; $interv = '246'; $lj = 3; $li = 2; break; |
||||
case 9 : $interh = $interv = '369'; $li = $lj = 3; break; |
||||
default : return '<div class="jeux_erreur">'._T('jeux:erreur_taille_grille').' : </div>' ; |
||||
} |
||||
$grille=''; |
||||
|
||||
// entetes : formulaire + grille |
||||
$grille .= (!$solution) |
||||
? ($form?jeux_form_debut('sudoku', $indexJeux, 'jeux_grille', 'post', self()):'') |
||||
: '<div class="jeux_solution">'._T('jeux:solution').' : </div>' ; |
||||
$grille .= '<table class="jeux_grille sudoku" cellspacing="0" border="0" summary="' |
||||
. _T('sudoku:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur)) . "\">\n"; |
||||
|
||||
// debut affichage des lignes |
||||
foreach($tableau_sudoku as $ligne => $contenu_ligne){ |
||||
$ligne++; |
||||
$grille .= "\t<tr>\n\t"; |
||||
|
||||
foreach ($contenu_ligne as $colonne =>$cellule){ |
||||
$colonne++; |
||||
$class = preg_match(",[$interh],", $colonne)?(preg_match(",[$interv],", $ligne)?' class="jeux_bas jeux_droite"':' class="jeux_droite"'):(preg_match(",[$interv],", $ligne)?' class="jeux_bas"':''); |
||||
// : ($ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':'')) |
||||
// ); |
||||
// s'il s'agit pas d'un espace |
||||
if ($cellule != '-') |
||||
$grille .= "\t\t<td$class><strong>$cellule</strong></td>\n"; |
||||
else if ($solution) |
||||
$grille .= "\t\t<td$class>$cellule</td>\n" ; |
||||
else { |
||||
list($id, $name) = jeux_idname($indexJeux, $colonne, 'C', $ligne, 'L'); |
||||
$value = jeux_form_reponse($indexJeux, $colonne, 'C', $ligne, 'L'); |
||||
$value = strlen($value)?' value="'.$value.'"':''; |
||||
$grille .= "\t\t<td$class><label for=\"$name\">" |
||||
._T('jeux:ligne_n',Array('n'=>$ligne)).';' |
||||
._T('jeux:colonne_n',Array('n'=>$colonne)).'</label>' |
||||
. "<input type='text' maxlength='1'$value name='$name' id='$id' /></td>\n" ; |
||||
} |
||||
} // foreach |
||||
|
||||
$grille = $grille."\t</tr>\n";} |
||||
|
||||
// fin affichage des lignes |
||||
$grille.="</table>\n"; |
||||
|
||||
if (!$solution){ |
||||
list($id, $name) = jeux_idname($indexJeux, 'SOL'); |
||||
$grille .= |
||||
(jeux_config('regle')?'<div class="jeux_regle">'.definir_puce()._T('sudoku:regle',Array('hauteur'=>$li,'largeur'=>$lj, 'max'=>$largeur)).'</div>' : '') |
||||
.(jeux_config('solution')?"<p><input id='$id' name='$name' type='checkbox' class='jeux_cocher' value='1' /><label for='$id' >" |
||||
._T('jeux:afficher_solution')."</label></p>\n":'') |
||||
.'<p><input type="submit" value="'._T('jeux:verifier_validite')."\" name='submit' /></p>" |
||||
.($form?jeux_form_fin():''); |
||||
} |
||||
|
||||
return $grille; |
||||
} |
||||
|
||||
// dechiffre le code source de la grille |
||||
function calcul_tableau_sudoku($texte){ |
||||
$texte = preg_replace(",\s*[\r\n]+\s*,", "\n", trim($texte)); |
||||
// arggh les raccourcis SPIP... TODO : voir pkoi (1.93) |
||||
$texte = str_replace('—', '--', $texte); |
||||
$tableau = preg_split("/\n/", $texte); |
||||
$hauteur = count($tableau); |
||||
foreach ($tableau as $i=>$valeur) { |
||||
if (strlen($valeur)) $valeur .= str_repeat('-', $hauteur-strlen($valeur)); |
||||
$tableau[$i] = preg_split('//', trim($valeur), -1, PREG_SPLIT_NO_EMPTY); |
||||
} |
||||
return $tableau; |
||||
} |
||||
|
||||
// valide si la lsite est composee de chiffres tous differents |
||||
function sudoku_valide_liste($liste) { |
||||
// echo"<br>", join(', ',$liste); |
||||
$chiffres = "123456789"; |
||||
foreach($liste as $cell) if ($cell!='-') { |
||||
if ($chiffres[$cell]=='*') return false; else $chiffres[$cell]='*'; |
||||
} |
||||
// echo ":ok"; |
||||
return true; |
||||
} |
||||
|
||||
// valide si la grille de sudoku est valide |
||||
function sudoku_valide_grille($tableau_sudoku) { |
||||
$taille = sizeof($tableau_sudoku); |
||||
foreach($tableau_sudoku as $ligne) if (!sudoku_valide_liste($ligne)) return false; |
||||
for ($i=0; $i<$taille; $i++) { |
||||
$colonne=false; |
||||
foreach($tableau_sudoku as $ligne) $colonne[] = $ligne[$i]; |
||||
if (!sudoku_valide_liste($colonne)) return false; |
||||
} |
||||
switch ($taille) { |
||||
case 4 : $ii = 2; $li = 2; $ij = 2; $lj = 2; break; |
||||
case 6 : $ii = 3; $li = 2; $ij = 2; $lj = 3; break; |
||||
case 9 : $ii = 3; $li = 3; $ij = 3; $lj = 3; break; |
||||
} |
||||
for ($i=0; $i<$ii; $i++) for ($j=0; $j<$ij; $j++) { |
||||
$zone=false; |
||||
for ($x=0; $x<$li; $x++) for ($y=0; $y<$lj; $y++) $zone[] = $tableau_sudoku[$i*$li+$x][$j*$lj+$y]; |
||||
if (!sudoku_valide_liste($zone)) return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
// retourne les erreurs et les cases vides eventuelles |
||||
function sudoku_validite($tableau_sudoku, $solution, $indexJeux) { |
||||
$vides=0; |
||||
foreach($tableau_sudoku as $ligne => $contenu_ligne) { |
||||
foreach ($contenu_ligne as $colonne => $cellule) { |
||||
$input = jeux_form_reponse($indexJeux, $colonne+1, 'C', $ligne+1, 'L'); |
||||
if ($input=='' && $cellule=='-') $vides++; |
||||
if ($input!='' && $cellule=='-') $tableau_sudoku[$ligne][$colonne] = $input; |
||||
} |
||||
} |
||||
return array(sudoku_valide_grille($tableau_sudoku), $vides); |
||||
} |
||||
|
||||
// renvoie la validite et le nombre de cases vides |
||||
function calcul_erreurs_sudoku($tableau_sudoku, $solution, $indexJeux) { |
||||
if (!jeux_form_correction($indexJeux)) return ''; |
||||
list($valide, $nbr_vides) = sudoku_validite($tableau_sudoku, $solution, $indexJeux); |
||||
return '<div class="jeux_erreur">' |
||||
. _T('jeux:grille_'.($valide?'':'in').'valide') |
||||
. (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):( |
||||
($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", Array('n'=>$nbr_vides)) |
||||
)) |
||||
. '</div><br />'; |
||||
} |
||||
|
||||
// configuration par defaut : jeu_{mon_jeu}_init() |
||||
function jeux_sudoku_init() { |
||||
return " |
||||
solution=oui // Afficher la solution ? |
||||
regle=non // Afficher la regle ? |
||||
"; |
||||
} |
||||
|
||||
// decode une grille de sudoku |
||||
function jeux_sudoku($texte, $indexJeux, $form=true) { |
||||
$sudoku = $solution = $titre = $html = false; |
||||
// parcourir tous les #SEPARATEURS |
||||
$tableau = jeux_split_texte('sudoku', $texte); |
||||
foreach($tableau as $i => $valeur) if ($i & 1) { |
||||
if ($valeur==_JEUX_TITRE) $titre = $tableau[$i+1]; |
||||
elseif ($valeur==_JEUX_SUDOKU) $sudoku = calcul_tableau_sudoku($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_SOLUTION) $solution = calcul_tableau_sudoku($tableau[$i+1]); |
||||
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1]; |
||||
} |
||||
return ($titre?"<div class=\"jeux_titre sudoku_titre\">$titre</div>":'') |
||||
. calcul_erreurs_sudoku($sudoku, $solution, $indexJeux) |
||||
. affichage_sudoku($sudoku, $indexJeux, $form) |
||||
// solution |
||||
. (jeux_form_reponse($indexJeux, 'SOL') ? affichage_sudoku($solution, $indexJeux, $form, true) : ''); |
||||
} |
||||
?> |
||||
|