Aller au contenu

Sujets conseillés

Posté

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

Posté

Dans le script suivant :

Sudoku en PHP

il te suffit de remplacer la sauvegarde d'une grille dans un fichier texte par une insertion dans ta base de données.

Posté

ce script est trés intéressant mais le problème est que les différents niveau sont généré en enlevant plus ou oins de chiffre. Or cette methode n'est pas valable. Une grille qui a plus de chiffre qu'une autre peux être beaucoup plus compliquée à résoudre ...

Posté

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

Posté
ce script est trés intéressant mais le problème est que les différents niveau sont généré en enlevant plus ou oins de chiffre. Or cette methode n'est pas valable. Une grille qui a plus de chiffre qu'une autre peux être beaucoup plus compliquée à résoudre ...

<{POST_SNAPBACK}>

Tu soulèves 2 problèmes :

- ca doit être un script automatique, donc il tient sur un algorithme, qui va simuler la complexité de la grille. Mais la complexité ne tient que par l'algorithme.

- Ce qui est compliqué pour les uns peut se révéler facile pour les autres, et inversement.

L'auteur du programme a décidé d'une méthode pour complexifier ses grilles, il est lui aussi dépendant du nombre de méthodes restreintes pour complexifier ce genre de programmes.

A mon avis, le seul critère qui pourrait être valable pour décider si une grille est complexe ou non serait de calculer sur un échantillon de personnes, le taux de réussite de telle ou telle grille. C'est autrement plus simple, autrement plus 'complexe' à mettre en oeuvre (il faut trouver des membres, noter le taux de réussite, etc..), mais ca correspondrait exactement au classement nécessaire.

Pour faire des sudoku de temps en temps, ben... Y'a des faciles qui sont difficiles, et des difficiles qui sont faciles. C'est comme ca ;)

Posté

Bonjour,

Quelle aide attends-tu de nous ? Qu'on aille télécharger le script, analyser les sources et faire la modif uniquement pour tes beaux yeux sans que tu ais pris la peine de faire la même chose ?

:nono:

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

<{POST_SNAPBACK}>

Bonne idée ;)

En revanche, si tu rencontre un obstacle (précis), n'hésite pas à revenir poser la question.

Posté
euhhhhhhhhh

sa m'aide pas vraiment ce que tu raconte

<{POST_SNAPBACK}>

Ce que je veux dire, c'est que le créateur du programme a choisi une méthode, qui en vaut une autre. Il n'y a pas à mon avis, de méthode optimale pour calculer la difficulté d'une grille, dans la mesure où la difficulté n'est qu'une valeur relative.

Ce qui te parait difficile à toi ne le sera pas forcément pour d'autres ;)

Posté

Salut,

Je pense quand même qu'on peut déterminer un niveau de complexité d'une grille en comptant le nombre minimal de tests pour déterminer l'ensemble de la grille (mais je ne sais pas s'il y a une méthode pour déterminer ça).

Posté

en fait,

voila le code

test.php

affiche les grilles


PHP:
<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 = _AT_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 = " ";
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+4;
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+4;
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</th>
<th id=j9 onclick=store(9)>9</th>
</tr><tr>
<th colspan=3 ><A href="java script:;" onClick="soluce()">Soluce</A></th>
</tr></table>
 
</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:" ";
?></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> <? } ?>
<?if($n) { ?><A href="?n=<?=$n-1?>"><</A> <? } ?>
<i>Grille n° <?=($n+1)?></i>
<?if($n<$nb-1) { ?> <A href="?n=<?=$n+1?>">></A> <? } ?>
<?if($n<$nb-2) { ?><A href="?n=<?=$nb-1?>">>|</A> <? } ?>
</td>
</tr></table>
<button onClick="window.print();">Imprimer</button>  
<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 = _AT_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>

et en fait je voudrais trouver en modifiant un des deux scripts un moyen pour avoir les chiffres du sudoku tous à la suite par ligne dans une variable ( array )

et pour plusieurs niveaux les chiffres qui sont masqués de la grille de sudoku dans une variable par ligne ( 1 pour affiché et 0 pôur masquer )

c'est sa que je voudrais

après pour exploiter tout sa je peut faire moi même mais je voudrais trouver ces chiffres mais je ne sais pas où ! j'ai testé des trucs mais c'est trop compliqué pour moi ce script et je n'ai pas réussi à avoir les chiifres

ensuite, je peut me débrouiller pour afficher sa dans des grilles à partir de base mysql ...

si vous m'avez pas compris ...

sudoku.gif

voici une grille de sudoku

je voudrais modifier le script pour avoir une variable par exemple $nombres

avec ( imaginons qu'il y ai tous les chiffres )

$nombres = X7X6X148XXX9XXXXX63 ...

on voit que c'est les chiffres du sudoku tous à la suite par ligne

sa il faut modifier sudoku.php ( la seconde boite de code )

$niveau1 chiffres masqués du niveau 1

( modifier la première boite de code  test.php )

pareil pour la suite des nombres mais avec ceci :  1 pour affiché et 0 pour masquer

le script de test.php a 7 niveaux, a chaque niveau supplémentaire il y a de plus en plus de chiffres masqués( c'est logique )

avec par exemple pour la grille affichée,

$niveau1 = 01010111000010000011  ...

mais avec plusieurs niveaux

voila

je précise au cas ou que il y en a qui ne s'en seraient pas douté, que le script viens d'ici :

http://www.asp-php.net/scripts/asp-php/sudoku.php

il faut juste que j'arrive à trouver dans le script prééxistant l'endroit ou avoir ces nombres, le modifier un peu pour n'avoir que l'essentiel et que je rajoute une requete sql pour enregistrer ca dans une base et pas un fichier

pour un expert sa devrait pas etre très dur mais moi je suis perdu dans ce script

voila, merci d'avance !

yann

  • 2 semaines plus tard...

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...