Новичок
Профиль
Группа: Участник
Сообщений: 22
Регистрация: 24.4.2011
Репутация: нет Всего: нет
|
Доброго времени суток, нашел в интернете алгоритм на Паскале: Код | Program generateur ; type t_gen = array[0..100,0..100] of integer; type t_gen_final = array[1..201,1..201] of char; Procedure NettoieCellules(var lab:t_gen; x2, y2, dim_x, dim_y, v1, v2:integer); Begin lab[x2,y2] := v1; If (x2 > 0) And (lab[x2 - 1,y2] = v2) Then NettoieCellules(lab, x2 - 1, y2, dim_x, dim_y, v1, v2); If (x2 < dim_x-1) And (lab[x2 + 1,y2] = v2) Then NettoieCellules(lab, x2 + 1, y2, dim_x, dim_y, v1, v2); If (y2 > 0) And (lab[x2,y2 - 1] = v2) Then NettoieCellules(lab, x2, y2 - 1, dim_X, dim_y, v1, v2); If (y2 < dim_y-1) And (lab[x2,y2 + 1] = v2) Then NettoieCellules(lab, x2, y2 + 1, dim_x, dim_y, v1, v2); End; procedure generer_lab(outpout:string;dim:integer); var lab : t_gen; dim_x,dim_y,dim_Finale:integer; continue,rand,x1,x2,y1,y2,i,j:integer; v1,v2,NbMurs:integer; MH : t_gen; MV : t_gen; rendu : t_gen_final; fichier:text; begin dim_x := dim; dim_y := dim; dim_Finale := 2*dim+1; randomize; NbMurs := 0; For i := 0 To dim_x-1 do For j := 0 To dim_y-1 do lab[i,j] := i * dim_y + j; For i := 0 To dim_x-1 do For j := 0 To dim_y-2 do MH[i,j] := 1; For i := 0 To dim_x-2 do For j := 0 To dim_y-1 do MV[i,j] := 1; While NbMurs <> ((dim_x*dim_y)-1) do Begin continue := 0; rand := random(2)+1; Case rand of 1:begin//Murs Horizontaux x1 := random(dim_x); y1 := random(dim_y-1); If (MH[x1,y1] = 1) Then begin continue := 1; x2 := x1; y2 := y1 + 1 ; end; end; 2:begin//Murs Verticaux x1 := random(dim_x-1); y1 := random(dim_y); If MV[x1,y1] = 1 Then begin continue := 1; x2 := x1+1; y2 := y1; end; end; End; If continue = 1 Then Begin v1:=lab[x1,y1]; v2:=lab[x2,y2]; If v1 <> v2 Then Begin // On enlève le mur Case rand of 1: MH[x1][y1] := 0; 2: MV[x1][y1] := 0; End; // On met la même valeur dans les cases de la chaîne NettoieCellules(lab, x2, y2, dim_x, dim_y, v1, v2); NbMurs := NbMurs+1; End; End; End; For i := 1 To dim_Finale do For j := 1 To dim_Finale do rendu[i,j]:=' '; For i := 1 to dim_Finale do rendu[1,i]:= 'M'; For i := 1 to dim_Finale do rendu[dim_Finale,i]:= 'M'; For i := 1 to dim_Finale do begin rendu[i,1]:= 'M'; rendu[i,dim_Finale]:= 'M'; end; For i := 0 To dim_x-2 do Begin For j := 0 To dim_y-1 do If (MV[i,j] = 1) Then Begin rendu[2*(i+1)+1,j*2+1]:= 'M'; rendu[2*(i+1)+1,j*2+2]:= 'M'; rendu[2*(i+1)+1,j*2+3]:= 'M'; End; End; For i := 0 To dim_x-1 do Begin For j := 0 To dim_y-2 do If (MH[i,j] = 1) Then Begin rendu[i*2+1,(j+1)*2+1]:= 'M'; rendu[i*2+2,(j+1)*2+1]:= 'M'; rendu[i*2+3,(j+1)*2+1]:= 'M'; End; End; rendu[(random(dim_Finale div 2)+1)*2,1]:='E'; rendu[(random(dim_Finale div 2)+1)*2,dim_Finale]:='S'; assign (fichier,outpout); rewrite(fichier); For i := 1 To dim_Finale do Begin For j := 1 To dim_Finale do Write(fichier,rendu[i,j]); Writeln(fichier,''); End; close(fichier); End; var car:char; i:integer; fil:string; BEGIN fil := Concat('labyrinthe','10','.txt'); generer_lab(fil,4); END.
|
Мне нужно переписать его на PHP - вот что вышло: Код |
function NettoieCellules($x2, $y2, $dim_x, $dim_y, $v1, $v2) { global $lab; $lab[$x2][$y2] = $v1; if(($x2 > 0) && ($lab[$x2 - 1][$y2] == $v2)) NettoieCellules($x2 - 1, $y2, $dim_x, $dim_y, $v1, $v2); if(($x2 < ($dim_x - 1)) && ($lab[$x2 + 1][$y2] == $v2)) NettoieCellules($x2 + 1, $y2, $dim_x, $dim_y, $v1, $v2); if(($y2 > 0) && ($lab[$x2][$y2 - 1] == $v2)) NettoieCellules($x2, $y2 - 1, $dim_X, $dim_y, $v1, $v2); if(($y2 < ($dim_y - 1)) && ($lab[$x2][$y2 + 1] == $v2)) NettoieCellules($x2, $y2 + 1, $dim_x, $dim_y, $v1, $v2); }
function generate_lab3($dim) { global $lab,$dim_Finale,$rendu; $dim_x = $dim_y = $dim; $dim_Finale = 2 * $dim + 1; $NbMurs = 0; for($i = 0; $i < $dim_x; $i++) for($j = 0; $j < $dim_y; $j++) $lab[$i][$j] = $i * $dim_y + $j; for($i = 0; $i < $dim_x; $i++) for($j = 0; $j < $dim_y - 1; $j++) $MH[$i][$j] = 1; for($i = 0; $i < $dim_x - 1; $i++) for($j = 0; $j < $dim_y; $j++) $MV[$i][$j] = 1;
while ($NbMurs <> (($dim_x * $dim_y) - 1)) { $continue = 0; $rnd = rand(1, 2); switch($rnd) { case 1: $x1 = rand(0, $dim_x - 1); $y1 = rand(0, $dim_y - 2); echo $y1."<br>"; if ($MH[$x1][$y1] == 1) { $continue = 1; $x2 = $x1; $y2 = $y1 + 1; } break; case 2: $x1 = rand(0, $dim_x - 2); $y1 = rand(0, $dim_y - 1); if ($MV[$x1][$y1] == 1) { $continue = 1; $x2 = $x1 + 1; $y2 = $y1; } break; } if ($continue == 1) { $v1 = $lab[$x1][$y1]; $v2 = $lab[$x2][$y2]; if($v1 <> $v2) { switch($rnd) { case 1: $MH[$x1][$y1] = 0; break; case 2: $MV[$x1][$y1] = 0; break; } NettoieCellules($x2, $y2, $dim_x, $dim_y, $v1, $v2); $NbMurs++; } } }
for ($i = 1; $i <= $dim_Finale; $i++) for ($j = 1; $j <= $dim_Finale; $j++) $rendu[$i][$j] = '-';
for ($i = 1; $i <= $dim_Finale; $i++) { $rendu[1][$i] = 'M'; $rendu[$i][1] = 'M'; $rendu[$i][$dim_Finale] = 'M'; $rendu[$dim_Finale][$i] = 'M'; }
// On met les murs la ou ils doivent etre en sachant que la dimension finale va etre multipliйe par 2 puis additionйe а 1. for($i = 0; $i < $dim_x-1; $i++) for($j = 0; $j < $dim_y; $j++) if ($MV[$i][$j] == 1) { $rendu[2*($i+1)+1][$j*2+1] = 'V'; $rendu[2*($i+1)+1][$j*2+2] = 'V'; $rendu[2*($i+1)+1][$j*2+3] = 'V'; }
for($i = 0; $i < $dim_x-1; $i++) for($j = 0; $j < $dim_y; $j++) if ($MH[$i][$j] == 1) { $rendu[$i*2+1][($j+1)*2+1] = 'H'; $rendu[$i*2+2][($j+1)*2+1] = 'H'; $rendu[$i*2+3][($j+1)*2+1] = 'H'; } for ($i = 1; $i < $dim_Finale + 1; $i++) { print "<tr>"; for ($j = 1; $j < $dim_Finale + 1; $j++) echo "<td>".$rendu[$i][$j]."</td>"; print "</tr>"; }
// $rendu[rand($dim_Finale % 2)*2][1] = 'E'; // $rendu[rand($dim_Finale % 2)*2][$dim_Finale] = 'S';
}
generate_lab3(4);
|
Но результат на PHP совсем не такой какой должен был быть( Подскажите пожалуйста в чем ошибка
|