Citation:
<?php
header("Content-type:image/png");
error_reporting(E_ALL ^ E_NOTICE);
$urlphoto = $_POST['urlphoto'];
$LargeurImage = $_POST['LargeurImage'];
$XL = $_POST['XL'];
$YL = $_POST['YL'];
// *******************************************************************
// Test des valeurs entrées par l'utilisateur
// *******************************************************************
$LargeurImage=floor($LargeurImage);
$XL=floor($XL);
$YL=floor($YL);
if(!$LargeurImage or !$XL or !$YL) {
if(!$LargeurImage) print("Vous avez oublié de saisir la largeur de l'image.<br>");
if(!$XL) print("Vous avez oublié de saisir le nombre de cases horizontales du labyrinthe.<br>");
if(!$YL) print("Vous avez oublié de saisir le nombre de cases verticales du labyrinthe.<br>");
print("<a href=\"/maze_maker_1.php\">Retour</a>");
exit;
}
// *******************************************************************
// Définition des dimensions de la grille
// *******************************************************************
$Marge=20; // Largeur de la marge de l'image exprimée en pixels
$Unite=floor(($LargeurImage-(2*$Marge))/$XL); // Dimensions (largeur et hauteur) des cases, exprimées en pixels
// *******************************************************************
// Initialisation des fonctions décrivant l'état de la grille
// *******************************************************************
for($xc=1;$xc<=$XL;$xc++) {
$Hor[$xc][0]=1;
}
for($yc=1;$yc<=$YL;$yc++) {
$Ver[0][$yc]=1;
}
for($xc=1;$xc<=$XL;$xc++) {
for($yc=1;$yc<=$YL;$yc++) {
$Hor[$xc][$yc]=1;
$Ver[$xc][$yc]=1;
$Pos[$xc][$yc]=0;
}
}
$compteurCasesVis=0; // Compteur du nombre de cases visitées
// *******************************************************************
// Définition de la fonction TirN($n), retournant un tableau à n
// éléments, avec les valeurs 1 à n classées dans un ordre aléatoire.
// Cette fonction sera utilisée dans l'algorythme de création du
// labyrinthe.
// *******************************************************************
// Initialisation du générateur de nombres aléatoires
$t=time();
$p=getmypid();
mt_srand($t+$p);
function TirN($n) {
// Initialisation du tableau $tabVal (qui prend les valeurs 1 à n croissantes)
for($c=0;$c<=($n-1);$c++) {
$tabVal[$c]=$c+1;
}
// Création du tableau $tabRes (qui prend les valeurs 1 à n dans un ordre aléatoire)
for($d=($n-1);$d>=1;$d--) {
$al=mt_rand(0,$d);
$tabRes[$d]=$tabVal[$al];
$tabVal[$al]=$n+1;
sort($tabVal);
}
$tabRes[0]=$tabVal[0];
return($tabRes);
// Note : le tableau contient $n éléments. L'index du tableau débute à 0
}
// *******************************************************************
// Algorithme de création du labyrinthe (ajustement des valeurs $Hor,
// $Ver, $Pos)
// *******************************************************************
// -------------------------------------------------------------------
// Définition de la fonction galerie($x,$y)
// Cette fonction creuse une galerie à partir du point ($x,$y)
// en suivant les règles suivantes :
// - Le point ($x,$y) est marqué comme étant visité
// - Le compteur de cases visitées augmente d'une unité
// - Choix d'une direction H(1), D(2), B(3), G(4)
// - Si la case déterminée par cette direction existe, et n'a pas
// encore été visitée, on ajuste la valeur de la variable Hor ou Ver
// correspondante, et on ré-applique à nouveau la fonction galerie()
// -------------------------------------------------------------------
function galerie($x,$y) {
global $XL,$YL,$Hor,$Ver,$Pos,$compteurCasesVis,$comptt;
$comptt++;
if($Pos[$x][$y]==0) $compteurCasesVis++;
$Pos[$x][$y]=1;
$directionTab=TirN(4); // choix d'une direction H, D, B, G
for($c=0;$c<=3;$c++) {
$direction=$directionTab[$c];
if(($direction==1) and (($y>1) and ($Pos[$x][$y-1]==0))) {
$Hor[$x][$y-1]=0;
galerie($x,$y-1);
break;
}
if(($direction==2) and(($x<$XL) and ($Pos[$x+1][$y]==0))) {
$Ver[$x][$y]=0;
galerie($x+1,$y);
break;
}
if(($direction==3) and (($y<$YL) and ($Pos[$x][$y+1]==0))) {
$Hor[$x][$y]=0;
galerie($x,$y+1);
break;
}
if(($direction==4) and (($x>1) and ($Pos[$x-1][$y]==0))) {
$Ver[$x-1][$y]=0;
galerie($x-1,$y);
break;
}
}
}
// -----------------------------------------------------------------
// Lancement effectif du creusement des galeries
// -----------------------------------------------------------------
// Choix au hasard d'une première case pour le creusement de la première galerie
$x0=mt_rand(1,$XL);
$y0=mt_rand(1,$YL);
galerie($x0,$y0);
// définition de la fonction pointDep($x,$y), destinée à vérifier si oui
// ou non une case de coordonnées ($x,$y) peut être utilisée comme point
// de départ pour le creusement d'une nouvelle galerie
// (retourne 'vrai' si la case peut être utilisée comme point de départ)
function pointDep($x,$y) {
global $XL, $YL, $Pos;
$resTestCondition=($Pos[$x][$y]==1) and((($x>1) and ($Pos[$x-1][$y]==0)) or (($Pos[$x+1][$y]==0) and ($x<$XL)) or (($Pos[$x][$y-1]==0) and ($y>1)) or (($Pos[$x][$y+1]==0) and ($y<$YL)));
return $resTestCondition;
}
// Creusement du reste du labyrinthe :
// On répète le creusement de nouvelles galeries tant qu'il existe
// des cases non encore visitées
while($compteurCasesVis<$XL*$YL) {
$tabTirX=TirN($XL);
$tabTirY=TirN($YL);
for($xa=0;$xa<$XL;$xa++) {
$x=$tabTirX[$xa];
for($ya=0;$ya<$YL;$ya++) {
$y=$tabTirY[$ya];
if(pointDep($x,$y)) break;
}
if (pointDep($x,$y)) break;
}
galerie($x,$y);
}
// --------------------------------------------------------
// Touche finale : ouverture de deux portes sur l'extérieur
// --------------------------------------------------------
$Ver[0][1]=0; // En haut à gauche
$Ver[$XL][$YL]=0; // en bas à droite
// *******************************************************************
// Création de l'image au format png
// *******************************************************************
$idImage=imagecreate(($XL*$Unite)+(2*$Marge),($YL*$Unite)+(2*$Marge));
$couleur0=imagecolorallocate($idImage,255,255,255);
$couleur1=imagecolorallocate($idImage,0,0,0);
for($xc=1;$xc<=$XL;$xc++) {
if($Hor[$xc][0]==1) {
imageline($idImage,$Marge+(($xc-1)*$Unite),$Marge,$Marge+($xc*$Unite),$Marge,$couleur1);
}
}
for($yc=1;$yc<=$YL;$yc++) {
if($Ver[0][$yc]==1) {
imageline($idImage,$Marge,$Marge+(($yc-1)*$Unite),$Marge,$Marge+($yc*$Unite),$couleur1);
}
}
for($xc=1;$xc<=$XL;$xc++) {
for($yc=1;$yc<=$YL;$yc++) {
if($Hor[$xc][$yc]==1) {
imageline($idImage,$Marge+(($xc-1)*$Unite),$Marge+($yc*$Unite),$Marge+($xc*$Unite),$Marge+($yc*$Unite),$couleur1);
}
if($Ver[$xc][$yc]==1) {
imageline($idImage,$Marge+($xc*$Unite),$Marge+(($yc-1)*$Unite),$Marge+($xc*$Unite),$Marge+($yc*$Unite),$couleur1);
}
}
}
imagepng($idImage, 'temp/maze.png');
?>