ketluts
Messages postés2Date d'inscriptionmardi 7 octobre 2008StatutMembreDernière intervention 6 avril 2009
-
6 avril 2009 à 23:04
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 2012
-
7 avril 2009 à 05:51
Bonjour à tous, voilà je me suis amusé à créer un générateur de labyrinthe et ayant vu qu'un défi avait eu lieu justement sur ce forum il y a maintenant plusieurs mois je me suis dit qu'on pourrait peut-être m'aider0
Le probleme est le suivant, le code genere bien des labyrinthe et rapidement cependant au delà d'une taille de 60*60 environ (quelque fois même à partir de 58*58) mon serveur Apache redemarre. Dans le fichier Apache error log j'ai les messages suivants:
[Mon Apr 06 19:38:05 2009] [notice] Parent: child process exited with status 3221225725 -- Restarting.
[Mon Apr 06 19:38:10 2009] [notice] Apache/2.2.11 (Win32) PHP/5.2.8 configured -- resuming normal operations
[Mon Apr 06 19:38:10 2009] [notice] Server built: Dec 10 2008 00:10:06
[Mon Apr 06 19:38:10 2009] [notice] Parent: Created child process 3244
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Child process is running
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Acquired the start mutex.
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Starting 64 worker threads.
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Starting thread to listen on port 80.
Il me semble que c'est un probleme de récursivité dans mon programme (comme si le serveur considérais que mes boucles etaient infinies et donc plante et redemarre) enfin c'est juste une supposition.
Voila le code en question :
<?php
//phpinfo();
function getTime() {
static $timer = false, $start;
if ($timer === false) {
$start = array_sum(explode(' ',microtime()));
$timer = true;
return NULL;
} else {
$timer = false;
$end = array_sum(explode(' ',microtime()));
return round(($end - $start) * 1000, 3);
}
}
getTime();
if(!isset($_POST['largeur']) OR !isset($_POST['hauteur'])){
echo"<form method="" action=""?>
<label for="\"largeur\"">Largeur : </label>
<label for="\"hauteur\"">Hauteur : </label>
";
exit;}else{
$largeur=$_POST['largeur'];
$hauteur=$_POST['hauteur'];
echo"<form method="\"post\"" action="\"generation.php\"">
<label for="\"largeur\"">Largeur : </label>
<label for="\"hauteur\"">Hauteur : </label>
</form>";}
$nbpi=$largeur*$hauteur;
$liste=NULL;
$coord=NULL;
//PREPARATION DES BORDS DU PLAN : DEBUT
for($i=0;$i <= $nbpi-1;$i++)
{
$check_pi[$i][0]=$i+1;
$check_pi[$i][1]=0;
$piece[$i][0]=$i+1;
$piece[$i][1]=1;
$piece[$i][2]=1;
$piece[$i][3]=1;
$piece[$i][4]=1;
$liste[$i]=$piece[$i];
}
for($i=0;$i <= $largeur-1;$i++)
{
$liste[$i][2]=2;
$j=$nbpi-$i-1;
$liste[$j][1]=2;
}
for($i=0;$i <= $hauteur-1;$i++)
{
$k=$largeur*$i;
$liste[$k][4]=2;
$j=$largeur-1+$largeur*$i;
$liste[$j][3]=2;
}
//PREPARATION DES BORDS DU PLAN : FIN
//FONCTION POUR MELANGER UNE LISTE : DEBUT
function rand_liste($liste,$newliste){
$n=count($liste);
$m=count($newliste);
if($n>0){
$alea=rand(0,$n-1);
$newliste[$m]=$liste[$alea];
$az=0;
for($d=0;$d <= $n-1;$d++)
{
if($d==$alea){}
else{$liste2[$az]=$liste[$d]; $az=$az+1;}
}
if(isset($liste2)){
$newliste=rand_liste($liste2,$newliste);
}
else{$liste2=NULL; $newliste=rand_liste($liste2,$newliste);}
}
else{return $newliste;}
return $newliste;
}
//FONCTION POUR MELANGER UNE LISTE : FIN
//FONCTION DE GENERATION DU LABYRINTHE : DEBUT
function generation($pi){
global $check_pi, $largeur;
global $liste;
$check_pi[$pi-1][1]=1;
if($pi!="k")
{
//CREER LA LISTE DES PIECES POSSIBLES
$coord[0][1]=$pi+$largeur;
$coord[0][2]="a";
$coord[1][1]=$pi-$largeur;
$coord[1][2]="b";
$coord[2][1]=$pi+1;
$coord[2][2]="d";
$coord[3][1]=$pi-1;
$coord[3][2]="g";
$g=0;
for($i=0;$i <= 3;$i++)
{
$ok1=0;
$ok2=0;
if($liste[$pi-1][$i+1]==1){$ok2=1;
if($check_pi[$coord[$i][1]-1][1]!=1){$ok1=1;}
else{}
}
else{}
if($ok1==1 AND $ok2==1){
if($i==0){
$liste_coord[$g][1]=$pi+$largeur;
$liste_coord[$g][2]="a";
}
elseif($i==1){
$liste_coord[$g][1]=$pi-$largeur;
$liste_coord[$g][2]="b";
}
elseif($i==2){
$liste_coord[$g][1]=$pi+1;
$liste_coord[$g][2]="d";
}
elseif($i==3){
$liste_coord[$g][1]=$pi-1;
$liste_coord[$g][2]="g";
}
$g=$g+1;
}
else{}
}
unset($ok1,$ok2,$coord,$g);
if(isset($liste_coord)){}
else{$liste_coord=NULL; $check_pi[$pi-1][1]=1;}
if($liste_coord!=NULL){
$liste_coord=rand_liste($liste_coord,NULL);
$nn=count($liste_coord);}
else{}
if(!isset($nn)){$check_pi[$pi-1][1]=1; return;}
else{
for($k=0;$k <= $nn-1;$k++)
{
if($check_pi[$liste_coord[$k][1]-1][1]!=1){
if($liste_coord[$k][2]=="a"){$liste[$pi-1][1]=3; $liste[$liste_coord[$k][1]-1][2]=3;}
elseif($liste_coord[$k][2]=="b"){$liste[$pi-1][2]=3; $liste[$liste_coord[$k][1]-1][1]=3;}
elseif($liste_coord[$k][2]=="d"){$liste[$pi-1][3]=3; $liste[$liste_coord[$k][1]-1][4]=3;}
elseif($liste_coord[$k][2]=="g"){$liste[$pi-1][4]=3; $liste[$liste_coord[$k][1]-1][3]=3;}
else{$liste_coord[$k][1]="k"; $check_pi[$pi-1][1]=1;}
generation($liste_coord[$k][1]);
}else{}
}
}
}
else{return;}
return;
}
//FONCTION DE GENERATION DU LABYRINTHE : FIN
$pi=rand(1,$nbpi); // ON CHOISIT UNE PIECE AU HAZARD POUR DEBUTER LA GENERATION
generation($pi); // ON GENERE LE LABYRINTHE
//AFFICHAGE DU LABYRINTHE : DEBUT
echo"Labyrinthe de $nbpi pièces :
\";
$i=1;
$j=1;
for($c=1; $c<=$nbpi; $c++){
$case=$nbpi-($i*$largeur)+$j;
$mot=$liste[$case-1];
$m0=$mot[0];
$m1=$mot[1];
$m2=$mot[2];
$m3=$mot[3];
$m4=$mot[4];
if($case==1){$m4=3;}else{}
if($case==$nbpi){$m3=3;}else{}
if($m1!=3){$m1=\"1px solid black;\";}else{$m1=\"none\";}
if($m2!=3){$m2=\"1px solid black;\";}else{$m2=\"none\";}
if($m3!=3){$m3=\"1px solid black;\";}else{$m3=\"none\";}
if($m4!=3){$m4=\"1px solid black;\";}else{$m4=\"none\";}
echo\" , \";
if($c%$largeur==0){echo\"----
\"; $i=$i+1; $j=1;}else{ $j=$j+1;}
}
echo"
";
echo "Génération en ".getTime()/1000,' s';
//AFFICHAGE DU LABYRINTHE : FIN
?>