Changeset 7660 in spip-zone


Ignore:
Timestamp:
Nov 29, 2006, 5:46:53 PM (12 years ago)
Author:
patfr@…
Message:

un petit nouveau : le sudoku !
(un peu brut de decoffrage...)

Location:
_plugins_/_stable_/jeux
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/_stable_/jeux/inc/mots_croises.php

    r7659 r7660  
    11<?php
     2/*
     3insere une grille de mots croises dans vos articles !
     4-----------------------------------------------------
     5
     6balises : <jeux></jeux>
     7separateurs obligatoires : #HORIZONTAL, #VERTICAL, #SOLUTION
     8separateurs optionnels   : #TITRE, #HTML
     9
     10Esemble de syntaxe dans l'article :
     11-----------------------------------
     12
     13<jeux>
     14        #HORIZONTAL
     15        Definition 1
     16        Definition 2. Definition 3
     17        Definition 4. Definition 5
     18       
     19        #VERTICAL
     20        Definition 1
     21        Definition 2
     22        Definition 3
     23       
     24        #SOLUTION
     25        aaa
     26        b*g
     27        a*d
     28</jeux>
     29
     30*/
    231
    332//retourne la lettre correspondant au chiffre
     
    736}
    837
     38//affiche la grille de mot croises, avec la solution au cas ou
    939function affichage_grille($tableau_grille, $solution=false){
    10         //affiche la grille de mot croisés, avec la solution au cas ou
    1140       
    1241        // les variables de la grille
    13         (! $solution) ? $page=self() : pass ;
    14         $hauteur =sizeof($tableau_grille);
    15     $largeur= sizeof($tableau_grille[0]);
    16     $grille='';
    17     //fin variable de la grille
    18    
    19     (! $solution) ? $grille.="<form class=\"grille\" action=\"".$page."\" method=\"post\">\n" : $grille.="<div class=\"solution\"><h2 class=\"spip\">"._T('motscroises:Solution')." : </h2>" ;  // debut formulaire
    20    
    21     $grille.='<table class="grille" cellspacing="0" border="0" summary="'._T('motscroises:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur))."\">\n
    22     \t<tr>\n\t\t<td class=\"coin\"></td>\n";    // debut tableau + 1ere celule
     42        $hauteur = sizeof($tableau_grille);
     43    $largeur = sizeof($tableau_grille[0]);
     44    $grille = '';
     45
     46    // entetes : formulaire + grille
     47    $grille .= (!$solution)? "<form class=\"grille\" action=\"".self()."\" method=\"post\">\n"
     48                : "<div class=\"solution\"><h2 class=\"spip\">"._T('motscroises:solution')." : </h2>" ;
     49    $grille .= '<table class="grille" cellspacing="0" border="0" summary="'
     50                . _T('motscroises:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur))
     51                . "\">\n\t<tr>\n\t\t<td class=\"coin\"></td>\n";
    2352       
    24         $increment_largeur=1;   //un iccrément pour les cellules d'entete
    2553       
    2654        //les cellules d'entetes verticales
    27         while ($increment_largeur<=$largeur){
    28         $grille.="\t\t<th scope=\"col\">".$increment_largeur."</th>\n";
    29         $increment_largeur++;}
    30         // fin des cellules d'entête verticale
    31        
    32         $grille=$grille."\t</tr>\n";            // cloture de la ligne d'entête
     55        for($i = 1; $i<=$largeur; $i++) $grille .= "\t\t<th scope=\"GR\">$i</th>\n";
     56        $grille .= "\t</tr>\n";         
    3357       
    3458        //debut affichage des lignes
    3559        foreach($tableau_grille as $ligne =>$contenu_ligne){
    3660                $ligne++;
    37                 $grille=$grille."\t<tr>\n\t<th scope=\"row\">".lettre_grille($ligne)."</th>\n"; //numeros de ligne
     61                $grille .= "\t<tr>\n\t<th scope=\"row\">".lettre_grille($ligne)."</th>\n";      //numeros de ligne
    3862               
    3963                foreach ($contenu_ligne as $colonne =>$cellule){
     
    4670                                else {
    4771                                        $grille .= "\t\t<td>"
    48                                                 .'<label for="col'.$colonne.'lig'.$ligne.'">'
     72                                                .'<label for="GR'.$colonne.'x'.$ligne.'">'
    4973                                                ._T('motscroises:ligne',Array('n'=>lettre_grille($ligne))).';'
    5074                                                ._T('motscroises:colonne',Array('n'=>$colonne)).'</label>';
    5175                                               
    5276                                        // test l'existence de la variable global correpsonte à cette cellule   
    53                                         if (isset($GLOBALS['col'.$colonne.'lig'.$ligne]) and $GLOBALS['col'.$colonne.'lig'.$ligne]!='')
    54                                                 $grille.='<input type="text" maxlength="1" value="'.$GLOBALS['col'.$colonne.'lig'.$ligne].'" name="col'.$colonne.'lig'.$ligne.'" id="col'.$colonne.'lig'.$ligne."\" />";
     77                                        if (isset($GLOBALS['GR'.$colonne.'x'.$ligne]) and $GLOBALS['GR'.$colonne.'x'.$ligne]!='')
     78                                                $grille.='<input type="text" maxlength="1" value="'.$GLOBALS['GR'.$colonne.'x'.$ligne].'" name="GR'.$colonne.'x'.$ligne.'" id="GR'.$colonne.'x'.$ligne."\" />";
    5579                                        else
    56                                                 $grille.='<input type="text" maxlength="1"  name="col'.$colonne.'lig'.$ligne.'" id="col'.$colonne.'lig'.$ligne."\" />";                       
     80                                                $grille.='<input type="text" maxlength="1"  name="GR'.$colonne.'x'.$ligne.'" id="GR'.$colonne.'x'.$ligne."\" />";                       
    5781                                       
    5882                                        $grille .= "</td>\n" ;          //cloture de la cellule
     
    105129            //compare les valeurs du tableau PHP avec les variables POST
    106130                        if ($cellule!='*') {
    107                     if (trim($GLOBALS["col".$colonne."lig".$ligne])=='') $vides++;
    108                 elseif (strtoupper($GLOBALS["col".$colonne."lig".$ligne])!=strtoupper($cellule)) $erreurs++;
     131                    if (trim($GLOBALS["GR".$colonne."x".$ligne])=='') $vides++;
     132                elseif (strtoupper($GLOBALS["GR".$colonne."x".$ligne])!=strtoupper($cellule)) $erreurs++;
    109133                        }       
    110134                }
     
    143167        }
    144168
    145         // trouver un titre, coute que coute...
    146 //      if (!$titre) $titre = jeux_recupere_le_titre($chaine, '<intro>', '</intro>');
     169        // un titre, coute que coute...
    147170        if (!$titre) $titre = _T('motscroises:titre');
    148171       
  • _plugins_/_stable_/jeux/inc/sudoku.php

    r7659 r7660  
    11<?php
     2/*
     3insere une grille de mots croises dans vos articles !
     4-----------------------------------------------------
    25
    3 function affichage_grille($tableau_grille, $solution=false){
    4         //affiche la grille de mot croisés, avec la solution au cas ou
     6balises : <jeux></jeux>
     7separateurs obligatoires : #HORIZONTAL, #VERTICAL, #SOLUTION
     8separateurs optionnels   : #TITRE, #HTML
     9
     10Esemble de syntaxe dans l'article :
     11-----------------------------------
     12
     13<jeux>
     14        #SUDOKU
     15        98-4----3
     16        64-3-----
     17        --3--5--1
     18        8-4---365
     19        2-6---8-9
     20        159---2-7
     21        3--8--1--
     22        -----6-38
     23        5----2-94
     24       
     25        #SOLUTION
     26        985421673
     27        641378952
     28        723965481
     29        874219365
     30        236547819
     31        159683247
     32        397854126
     33        412796538
     34        568132794
     35</jeux>
     36
     37*/
     38//affiche la grille de sudoku, en format solution au cas ou
     39function affichage_sudoku($tableau_sudoku, $solution=false){
    540       
    641        // les variables de la grille
    7         (! $solution) ? $page=self() : pass ;
    8         $hauteur =sizeof($tableau_grille);
    9     $largeur= sizeof($tableau_grille[0]);
     42        $hauteur =sizeof($tableau_sudoku);
     43    $largeur= sizeof($tableau_sudoku[0]);
    1044    $grille='';
    11     //fin variable de la grille
    1245   
    13     (! $solution) ? $grille.="<form class=\"grille\" action=\"".$page."\" method=\"post\">\n" : $grille.="<div class=\"solution\"><h2 class=\"spip\">"._T('sudoku:Solution')." : </h2>" ;       // debut formulaire
     46    // entetes : formulaire + grille
     47    $grille .= (!$solution)? "<form class=\"grille\" action=\"".self()."\" method=\"post\">\n"
     48                : "<div class=\"solution\"><h2 class=\"spip\">"._T('sudoku:solution')." : </h2>" ;
     49    $grille .= '<table class="grille" cellspacing="0" border="0" summary="'
     50                . _T('sudoku:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur)) . "\">\n";
    1451   
    15     $grille.='<table class="grille" cellspacing="0" border="0" summary="'._T('sudoku:table_summary',Array('hauteur'=>$hauteur,'largeur'=>$largeur))."\">\n
    16     \t<tr>\n\t\t<td class=\"coin\"></td>\n";    // debut tableau + 1ere celule
    17        
    18         $increment_largeur=1;   //un iccrément pour les cellules d'entete
    19        
    20         //les cellules d'entetes verticales
    21         while ($increment_largeur<=$largeur){
    22         $grille.="\t\t<th scope=\"col\">".$increment_largeur."</th>\n";
    23         $increment_largeur++;}
    24         // fin des cellules d'entête verticale
    25        
    26         $grille=$grille."\t</tr>\n";            // cloture de la ligne d'entête
    27        
    2852        //debut affichage des lignes
    29         foreach($tableau_grille as $ligne =>$contenu_ligne){
     53        foreach($tableau_sudoku as $ligne => $contenu_ligne){
    3054                $ligne++;
    31                 $grille=$grille."\t<tr>\n\t<th scope=\"row\">".lettre_grille($ligne)."</th>\n"; //numeros de ligne
     55                $grille .= "\t<tr>\n\t";
    3256               
    3357                foreach ($contenu_ligne as $colonne =>$cellule){
    3458                    $colonne++;
    35                     //s'il s'agit d'un noir
    36                     if ($cellule == "*")
    37                         $grille .= "\t\t<td class=\"noir\">*</td>\n";
     59                    //s'il s'agit pas d'un espace
     60                    if ($cellule != "-")
     61                        $grille .= "\t\t<td><strong>$cellule</strong></td>\n";
    3862                                else if ($solution)
    3963                                        $grille .= "\t\t<td>$cellule</td>\n" ;
    4064                                else {
    4165                                        $grille .= "\t\t<td>"
    42                                                 .'<label for="col'.$colonne.'lig'.$ligne.'">'
    43                                                 ._T('sudoku:ligne',Array('n'=>lettre_grille($ligne))).';'
     66                                                .'<label for="GR'.$colonne.'x'.$ligne.'">'
     67                                                ._T('sudoku:ligne',Array('n'=>$ligne)).';'
    4468                                                ._T('sudoku:colonne',Array('n'=>$colonne)).'</label>';
    4569                                               
    4670                                        // test l'existence de la variable global correpsonte à cette cellule   
    47                                         if (isset($GLOBALS['col'.$colonne.'lig'.$ligne]) and $GLOBALS['col'.$colonne.'lig'.$ligne]!='')
    48                                                 $grille.='<input type="text" maxlength="1" value="'.$GLOBALS['col'.$colonne.'lig'.$ligne].'" name="col'.$colonne.'lig'.$ligne.'" id="col'.$colonne.'lig'.$ligne."\" />";
     71                                        if (isset($GLOBALS['GR'.$colonne.'x'.$ligne]) and $GLOBALS['GR'.$colonne.'x'.$ligne]!='')
     72                                                $grille.='<input type="text" maxlength="1" value="'.$GLOBALS['GR'.$colonne.'x'.$ligne].'" name="GR'.$colonne.'x'.$ligne.'" id="GR'.$colonne.'x'.$ligne."\" />";
    4973                                        else
    50                                                 $grille.='<input type="text" maxlength="1"  name="col'.$colonne.'lig'.$ligne.'" id="col'.$colonne.'lig'.$ligne."\" />";                       
     74                                                $grille.='<input type="text" maxlength="1"  name="GR'.$colonne.'x'.$ligne.'" id="GR'.$colonne.'x'.$ligne."\" />";                       
    5175                                       
    5276                                        $grille .= "</td>\n" ;          //cloture de la cellule
     
    6791
    6892// dechiffre le code source de la grille
    69 function calcul_tableau_grille($texte){
     93function calcul_tableau_sudoku($texte){
    7094        $tableau = explode("\r", trim($texte));
    7195        foreach ($tableau as $i=>$v) $tableau[$i] = preg_split('//', trim($v), -1, PREG_SPLIT_NO_EMPTY);
     
    7397}
    7498
    75 // déchiffre le code source de la grille
    76 function calcul_tableau_grille_vieille_syntaxe($texte){
    77         $texte = trim($texte);
    78         $tableau = explode("\r", $texte);       
    79         //ligne par ligne
    80         $j =0;
    81         foreach ($tableau as $i){       
    82                 $tableau[$j] = explode('|',trim($i));           //une cellule, c'est beau !
    83                 array_shift($tableau[$j]);
    84                 array_pop($tableau[$j]);
    85                 $j++;
    86         }
    87         return $tableau;
    88 }
    89 
    90 
    9199// compare les variables Post avec les valeurs de la solution...
    92 function comparaison_grille($tableau_grille){
     100function comparaison_sudoku($tableau_sudoku){
    93101    $erreurs=0; $vides=0;
    94     foreach($tableau_grille as $ligne =>$contenu_ligne){
     102    foreach($tableau_sudoku as $ligne =>$contenu_ligne){
    95103        $ligne++;
    96104        foreach ($contenu_ligne as $colonne =>$cellule){
     
    99107            //compare les valeurs du tableau PHP avec les variables POST
    100108                        if ($cellule!='*') {
    101                     if (trim($GLOBALS["col".$colonne."lig".$ligne])=='') $vides++;
    102                 elseif (strtoupper($GLOBALS["col".$colonne."lig".$ligne])!=strtoupper($cellule)) $erreurs++;
     109                                $input = trim($GLOBALS["GR".$colonne."x".$ligne]);
     110                    if ($input=='') $vides++;
     111                 elseif (strtoupper($input)!=strtoupper($cellule)) $erreurs++;
    103112                        }       
    104113                }
     
    108117
    109118// renvoie le nombre d'erreurs de de cases vides
    110 function calcul_erreurs_grille($solution) {
     119function calcul_erreurs_sudoku($solution) {
    111120        if ($GLOBALS["bouton_envoi"] == '') return '';
    112121        else {
    113           list($nbr_erreurs, $nbr_vides) = comparaison_grille($solution);
     122          list($nbr_erreurs, $nbr_vides) = comparaison_sudoku($solution);
    114123          return '<strong class="erreur">'
    115124                . (($nbr_erreurs==0)?_T('sudoku:aucune_erreur'):(
     
    124133
    125134// decode une grille de sudoku
    126 function jeux_sudoku($texte) { return('SUDOKU : en cours de développement !!');
    127         $tableau = preg_split('/('._JEUX_TITRE.'|'._JEUX_SUDOKU._JEUX_SOLUTION.'|'._JEUX_HTML.')/',
     135function jeux_sudoku($texte) {
     136        $tableau = preg_split('/('._JEUX_TITRE.'|'._JEUX_SUDOKU.'|'._JEUX_SOLUTION.'|'._JEUX_HTML.')/',
    128137                        trim(_JEUX_HTML.$texte), -1, PREG_SPLIT_DELIM_CAPTURE);
    129138        $titre = $sudoku = $solution = $html = false;
    130139        foreach($tableau as $i => $v){
    131          $v = trim($v);
     140         $v = trim($v);
     141//       echo "$i. ", trim($v), '<br>';
    132142         if ($v==_JEUX_TITRE) $titre = trim($tableau[$i+1]);
    133           elseif ($v==_JEUX_SUDOKU) $sudoku = jeux_listes($tableau[$i+1]);
    134           elseif ($v==_JEUX_SOLUTION) $solution = calcul_tableau_grille($tableau[$i+1]);
     143          elseif ($v==_JEUX_SUDOKU) $sudoku = calcul_tableau_sudoku($tableau[$i+1]);
     144          elseif ($v==_JEUX_SOLUTION)$solution = calcul_tableau_sudoku($tableau[$i+1]);
    135145          elseif ($v==_JEUX_HTML) $html .= trim($tableau[$i+1]);
    136146        }
    137 
     147// print_r($tableau);
    138148        // trouver un titre, coute que coute...
    139149//      if (!$titre) $titre = jeux_recupere_le_titre($chaine, '<intro>', '</intro>');
    140150        if (!$titre) $titre = _T('sudoku:titre');
    141151       
    142         return calcul_erreurs_grille($solution)
    143                         . affichage_grille($solution)
    144         // definitions 
    145                         . '<div class="spip horizontal"><h4 class="spip grille">'
    146                                         ._T('sudoku:horizontalement')."</h4>\n".$horizontal.'</div>'
    147                         . '<div class="spip vertical"><h4 class="spip grille">'
    148                                         ._T('sudoku:verticalement')."</h4>\n".$vertical.'</div>'
     152        return calcul_erreurs_sudoku($solution)
     153                        . affichage_sudoku($sudoku)
    149154        // solution
    150                         . (($GLOBALS["solution"][0] == 1)? affichage_grille($solution, true) : '');
     155                        . (($GLOBALS["solution"][0] == 1)? affichage_sudoku($solution, true) : '');
    151156}
    152157?>
  • _plugins_/_stable_/jeux/jeux.js

    r7652 r7660  
    99 if ($('table.grille').length) {
    1010        // sens d'écriture basculé à 'h' (horizontal)
    11         changeDir();
    12         // gestion du clavier par function mykey()
    13         $('table.grille tr td input').bind('keypress', mykey);
     11        changeDeDirection();
     12        // gestion du clavier par function clavierPourJeux()
     13        $('table.grille tr td input').bind('keypress', clavierPourJeux);
    1414        // définition du bouton droit de la souris pour changer le sens de déplacement dans la grille
    1515        if ((jQuery.browser.safari) | (jQuery.browser.Konqueror))
    16                 $('form.grille').bind('contextmenu', changeDir);
     16                $('form.grille').bind('contextmenu', changeDeDirection);
    1717        else
    18                 $('table.grille tr td input').bind('contextmenu', changeDir);   
     18                $('table.grille tr td input').bind('contextmenu', changeDeDirection);   
    1919 }
    2020});
    2121
    22 function changeDir(e) {
     22function changeDeDirection(e) {
    2323       
    2424        if(sens_grille=='h') {
     
    3333}
    3434
    35 function mykey(e) {
     35function clavierPourJeux(e) {
    3636        //var key = e.keyCode ? e.keyCode : (e.which ? e.which: 0);
    37         var m = this.name.match(/col(\d+)lig(\d+)/);
     37        var m = this.name.match(/GR(\d+)x(\d+)/);
    3838        var x=m[1];
    3939        var y=m[2];
     
    5757        }
    5858
    59         var newcell = '#col'+String(x)+'lig'+String(y);
     59        var newcell = '#GR'+String(x)+'x'+String(y);
    6060        $(newcell).each(function(){ this.focus(); });
    6161       
  • _plugins_/_stable_/jeux/jeux_pipelines.php

    r7659 r7660  
    7373                $texte = jeux_mots_croises($texte);
    7474        }
    75         if (strpos($chaine, _JEUX_QCM)!=false) {
     75        if (strpos($texte, _JEUX_QCM)!=false) {
    7676                include_spip('inc/qcm');
    77                 $texte = jeux_qcm($chaine);
     77                $texte = jeux_qcm($texte);
    7878        }
    79         if (strpos($chaine, _JEUX_SUDOKU)!=false) {
     79        if (strpos($texte, _JEUX_SUDOKU)!=false) {
    8080                include_spip('inc/sudoku');
    81                 $texte = jeux_sudoku($chaine);
     81                $texte = jeux_sudoku($texte);
    8282        }
    8383
     
    125125
    126126function jeux_post_propre($texte) {
    127         // a supprimer dans le futur...
     127        // a supprimer dans le futur... 
    128128        return preg_replace(',<!(QCM-(DEBUT|FIN)(-#[0-9]+)?)>,UimsS', '<!-- \\1 -->', $texte);
    129129}       
Note: See TracChangeset for help on using the changeset viewer.