Sudoku avec php et mysql

Eléphant du PHP | 259 Messages

19 avr. 2006, 17:25

Bonjour

vu que je ne comprend pas trop les scripts sudoku que j'ai précédement vu,

je cherche un script qui génère des grilles sudoku mais ce que j'aimerais trouver c'est un script qui enregistre les nombres et leur position dans une table mysql

est ce que quelqun pourrais m'aider svp

merci d'avance

yuuzhantar

ViPHP
ViPHP | 3607 Messages

19 avr. 2006, 17:50

Ben tout fait comme ça je voit pas, faudrait que tu te mette à la programmation php ....
tu pourrait te servir de la fonction rand(), pour avoir des nombres aléatoires, après faudrait faire des tests par rapport aux valeures précédemments stocké, si c'est tjrs en adéquation par rapport aux contraintes de la règle.
Je pense qu'il faut distingué deux choses, la génération de la grille, et ensuite son stockage ds la bdd:
donc tu travails sur un tableau à deux dimmensions, puis à la fin, quand t'a finit ta grille hop tu fait un insert dans ta table...

Eléphant du PHP | 259 Messages

19 avr. 2006, 17:51

j'ai trouvé plusieurs scripts de sudoku dont un qui est pas mal

peut on le modifier pour avoir par exemple

(
A : ligne 1
B : ligne 2 ...

1 : colonne 1
2 colonne 2 ...

et A1 : ligne 1 colonne 1
C9 ...
)

$a1 = ...
$a2 = ...
$a3 = ...

mais vu qu'il y a des cases qui sont vides ( avec le niveau de difficulté )

$ta1 = (1 pour pleine et 0 pour vide)
...

après, je peut me débrouiller tout seul, j'aime bien le mysql

Eléphant du PHP | 259 Messages

19 avr. 2006, 17:55

voila le script que j'ai trouvé
( un peut long )
test.php
affiche les grilles
<html>
<head>
<title>Untitled Document</title>
</head>

<body>

<? if(!$niveau = @$_COOKIE["niveau"]) $niveau = 5;
   if($tmp = @$_GET["niveau"]) {
      $niveau = max(2,min(8,$niveau+$tmp));
      setcookie("niveau",$niveau);
   }
?>
<html><body>
   <div align=center>

<? // Chargement
$tmp = @file("sudoku.txt");
if($tmp) {
   $nb = sizeof($tmp);
   $n = @$_GET["n"]; if(!@$tmp[$n]) $n=$nb-1;

   // Choix de la grille
   $ligne = trim($tmp[$n]);
   $sudoku=unserialize($ligne); $sudoku2=$sudoku;

   // Application du masque
   if(!@$_GET["soluce"]) {
      $liste = range(0,8);
      for($i=0;$i<9;$i++) { // pour chaque grille 3x3
         $niv = rand($niveau-1,$niveau+1);
         shuffle($liste);
         for($j=0;$j<$niv;$j++) 
            $sudoku[$i][$liste[$j]] = "";
      }
   }

   // Affichage ?>
   <style>
      td.s { font:normal 18pt verdana }
      A { text-decoration:none }
      A.hover { text-decoration:underline }
      .f7 { font:normal 7pt Verdana }
   </style>

   <script language="JavaScript">
      sauve=""; sauve3 = new Array();

      function drawcase() {
         tmp = sauve.id.split("-");
         mem = sauve3[tmp[0]*9+tmp[1]]+""; if(mem=="undefined") mem="";
         if(mem=="") tmp2 = "&nbsp;";
         else {
            if(mem.length==1) tmp2 = "<font color=red>"+mem+"</font>";
            else {
               tmp2 = "<table cellspacing=0 cellpadding=0 border=0>";
               for(i=0;i<2;i++) {
                  tmp2+="<tr>";
                  for(j=0;j<4;j++) {
                     t = i*4+j;
                     tmp2+="<td class=f7>"+String.fromCharCode(mem.charCodeAt(t))+"</td>";
                  }
                  tmp2+="</tr>";
               }
               tmp2 += "</table>";
            }
         }
         sauve.innerHTML = tmp2;
      }

      function drawgrid() {
         tmp = sauve.id.split("-");
         mem = sauve3[tmp[0]*9+tmp[1]]+""; if(mem=="undefined") mem="";
         for(i=1;i<10;i++) {
            ch = String.fromCharCode(i+48);
            if(mem.indexOf(ch)>=0) document.getElementById("j"+i).style.background="yellow";
            else document.getElementById("j"+i).style.background="";
         }
      }

      function soluce() {
         tmp = sauve.id.split("-");
         sauve3[tmp[0]*9+tmp[1]]=sauve.s;
         drawcase(); drawgrid();
      }

      function joue(lacase) {
         if(sauve!="") sauve.style.background="";
         sauve=lacase;
         lacase.style.background="yellow";
         lejeu = document.getElementById("jeu");
         tmp = sauve.id.split("-");
         mem = sauve3[tmp[0]*9+tmp[1]]+""; if(mem=="undefined") mem="";
         drawgrid();
         lejeu.style.visibility="visible";
      }

      function store(n) {
         tmp = sauve.id.split("-");
         ch = String.fromCharCode(n+48);
         mem = sauve3[tmp[0]*9+tmp[1]]+""; if(mem=="undefined") mem="";
         t = mem.indexOf(ch)
         if(t>=0) { t2 = mem.split(""); t2[t]=""; mem = t2.join(""); }
         else mem+=ch;
         sauve3[tmp[0]*9+tmp[1]]=mem;
         drawcase(); drawgrid();
      }
   </script>

   <h1>Sudoku</h1>
<table><tr><td width=50 nowrap>
   <div id="jeu" style="visibility:hidden">
      <table style="cursor:help" width=45><tr>
         <th id=j1 onclick=store(1)>1</th>
         <th id=j2 onclick=store(2)>2</th>
         <th id=j3 onclick=store(3)>3</th>
      </tr><tr>
         <th id=j4 onclick=store(4)>4</th>
         <th id=j5 onclick=store(5)>5</th>
         <th id=j6 onclick=store(6)>6</th>
      </tr><tr>
         <th id=j7 onclick=store(7)>7</th>
         <th id=j8 onclick=store(8)>8</th>
         <th id=j9 onclick=store(9)>9</th>
      </tr><tr>
         <th colspan=3 ><A href="javascript:;" onClick="soluce()">Soluce</A></th>
      </tr></table>
      &nbsp;
   </div>
</td><td align=center>
   <table border=0>
   <? for($i=0;$i<3;$i++) { ?>
      <tr>
      <? for($j=0;$j<3;$j++) { ?>
         <td><table align=center border=1 cellspacing=0 width=100%>
         <? for($k=0;$k<3;$k++) { ?>
            <tr>
            <? for($l=0;$l<3;$l++) { ?>
               <td class=s align=center width=30 nowrap <?
                  $id = ($i*3+$j)."-".($k*3+$l);
                  echo "id='".$id."' ";
                  $tmp=@$sudoku[$i*3+$j][$k*3+$l];
                  if(!$tmp) {
                     echo "style='cursor:help' ";
                     echo "title='Cliquer pour jouer' ";
                     echo "onclick=joue(this) ";
                     echo "s='".@$sudoku2[$i*3+$j][$k*3+$l]."'";
                  }
               ?>><b><?               
                  echo ($tmp)?$tmp:"&nbsp;";
               ?></b></td>
            <? } ?>
            </tr>
         <? } ?>
         </table></td>
      <? } ?>
      </tr>
   <? } ?>
   </table>
   <table width=300><tr>
      <td>
         <A href="?n=<?=$n?>&niveau=-1">-</A>
         <A href="?n=<?=$n?>">Niveau <?=$niveau?></A>
         <A href="?n=<?=$n?>&niveau=1">+</A>
      </td><td align=right>
         <?if($n>1) { ?><A href="?n=0">|<</A>&nbsp;<? } ?>
         <?if($n) { ?><A href="?n=<?=$n-1?>"><</A>&nbsp;<? } ?>
         <i>Grille n° <?=($n+1)?></i>
         <?if($n<$nb-1) { ?>&nbsp;<A href="?n=<?=$n+1?>">></A>&nbsp;<? } ?>
         <?if($n<$nb-2) { ?><A href="?n=<?=$nb-1?>">>|</A>&nbsp;<? } ?>
      </td>
   </tr></table>
   <button onClick="window.print();">Imprimer</button>&nbsp;&nbsp;
   <button onClick="location.replace('?n=<?=$n?>&soluce=1')">Solution</button>
</td></tr></table>

<? } else {
   $search = 1;?>
   Création d'une grille en cours...
<? } ?>

<br />
<iframe src="sudoku.php?search=<?=@$search?>" frameborder=no />
</div>
</body></html>

</body>
</html>
sudoku.php
génère les grilles
<html>
<head>
<title>Untitled Document</title>
</head>

<body>

<?
$TempsMax = 5; // 5 secondes semblent suffire
$Temps = time();

// Propose un carré pour compléter la ligne
function complete_h($c1,$c2) {
   $t = range(1,9);
   $r1 = array($c1[0],$c1[1],$c1[2],$c2[0],$c2[1],$c2[2]);
   $r2 = array($c1[3],$c1[4],$c1[5],$c2[3],$c2[4],$c2[5]);
   $r3 = array($c1[6],$c1[7],$c1[8],$c2[6],$c2[7],$c2[8]);
   $v1 = array_diff($t,$r1); shuffle($v1);
   $v2 = array_diff($t,$r2); shuffle($v2);
   $v3 = array_diff($t,$r3); shuffle($v3);
   return array_merge($v1,$v2,$v3);
}

// Propose un carré pour compléter la colonne
function complete_v($c1,$c2) {
   $t = range(1,9);
   $r1 = array($c1[0],$c1[3],$c1[6],$c2[0],$c2[3],$c2[6]);
   $r2 = array($c1[1],$c1[4],$c1[7],$c2[1],$c2[4],$c2[7]);
   $r3 = array($c1[2],$c1[5],$c1[8],$c2[2],$c2[5],$c2[8]);
   $v1 = array_diff($t,$r1); shuffle($v1);
   $v2 = array_diff($t,$r2); shuffle($v2);
   $v3 = array_diff($t,$r3); shuffle($v3);
   return array($v1[0],$v2[0],$v3[0],$v1[1],$v2[1],$v3[1],$v1[2],$v2[2],$v3[2]);
}

// Détermine le n° du carré et le rang de la case d'après les coordonnées 
function ij2nr($i,$j) { // coords i-j => coords carré
   $n = 3*floor($i/3)+floor($j/3);
   $r = 3*($i%3)+$j%3;
   return array($n,$r);
}

// Teste si la ligne ou la colonne est conforme
function test(&$c,$colflag) {
   $s = sizeof($c); // nombre de carrés
   // limite le nombre de lignes/colonnes à tester
   if($colflag) { // Test sur les colonnes
      $nc=3; if($s==2) $nc=6; elseif($s>2) $nc = 9;
   } else // Test sur les lignes
      $nc = (floor(($s-1)/3)+1)*3;
   // On teste
   for($i=0;$i<$nc;$i++) {
      for($j=0;$j<9;$j++) {
         $t = ($colflag) ? ij2nr($j,$i) : ij2nr($i,$j);
         if($t[0]>=$s) continue;
         $row[$i][] = $c[$t[0]][$t[1]];
      }
      if(array_unique($row[$i])!=$row[$i]) return false;
   }
   return true;
}

// Tente de générer une grille dans le temps imparti
function genere() { global $Temps,$TempsMax;
   // Liste des 9 valeurs possibles
   $liste = range(1,9);
   // carré haut-gauche
   shuffle($liste); // Mélange la liste
   $carre[0] = $liste; $result = $carre; $nbcarre = 1;
   // Pour les autres carrés
   while($nbcarre<9) {
      // Soit c'est une fin de ligne => on complète
      if(($nbcarre==2)||($nbcarre==5)||($nbcarre==8))
         $l = complete_h($carre[$nbcarre-2],$carre[$nbcarre-1]);
      // Soit c'est une fin de colonne => on complète
      elseif(($nbcarre==6)||($nbcarre==7))
         $l = complete_v($carre[$nbcarre-6],$carre[$nbcarre-3]);
      // Sinon => tirage random
      else {
         shuffle($liste); $l = $liste;
      }
      // On teste
      $carre[$nbcarre] = $l;
      if($test = (test($carre,0)&&test($carre,1)) ) {
         // OK, mémorise et passe au carré suivant
         $result[$nbcarre] = $l; $nbcarre++;
         // echo (time()-$Temps)." - ";
      }
      // Le temps de recherche est dépassé ?
      if(time()-$Temps>$TempsMax) break;
   }
   return $result;
}

if($search=@$_GET["search"]) {
   echo "Recherche".str_repeat(".",@$_GET["n"]+1);
   if(@$_GET["n"]) $sudoku = genere();
}

$tmp = @file("sudoku.txt"); $s=0; if($tmp) $s = sizeof($tmp);

// On a trouvé une nouvelle grille => on la sauve
if($search&&@$sudoku[8]) {
   $search = 0; // Fin de la recherche
   $t = serialize($sudoku)."\n";
   if($tmp) {
      if(!in_array($t,$tmp)) {
         $f=fopen("sudoku.txt","a");
         fputs($f,$t);
         fclose($f);
         $s++;
      } else $search=1; // déjà trouvée...
   } else {
      $f=fopen("sudoku.txt","w");
      fputs($f,$t);
      fclose($f);
      $s++;
   }
   if(!$search) { ?>
      <script language="JavaScript">
         t=top.location.href.split("?");
         top.location.replace(t[0]+"?n=last");
      </script>
   <? }
}

?>

<center>
   <?if($search) { ?>
      <script>document.location.replace("sudoku.php?n=<?=@$_GET["n"]+1?>&search=1");</script>
   <? } else { ?>
      <b><?=$s?> grille<?=($s>1)?"s":""?> disponible<?=($s>1)?"s":""?></b><br />
         <A href="?search=1">Créer une nouvelle grille</A>
   <? } ?>
</center>

</body>
</html>

voila

je voudrais trouvé la dedans les variables que je vous ai décrites tout à l'heure

merci d'avance

Eléphant du PHP | 259 Messages

19 avr. 2006, 17:56

je connais un peu le php mais la c trop compliqué pour moi !

je pense que ce qu'il faut chercher c'est dans sudoku.php

Eléphant du PHP | 259 Messages

21 avr. 2006, 17:57

je voudrais extraire les chiffres mais je ne vois pas ou prendre les array

pouvez vous m'aider svp

merci

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

21 avr. 2006, 17:59

Tu veux enregistrer une grille dans la base de données ?
Et tu cherches à retrouver quelles sont les variables contenant l'énoncé du sudoku ?

C'est ça ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 259 Messages

29 avr. 2006, 19:03

oui

je viens d'apprendre comment se servir des array avec une chaine de caractères,

le script génère tous les chiffres du sudoku à la suite par ligne
ex $sudoku = 06842164138751 ...

et après j'insère ceci dans une base de données ( je sais faire sa )

c'est celà