1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| {Procedures de Generation du Labyrinthe Aleatoire}
Procedure CLabyrinthe.NettoieCellules(var alab:t_gen; ax2, ay2, adim_x, adim_y, av1, av2:integer);
Begin
alab[ax2,ay2] := av1;
If (ax2 > 0) And (alab[ax2 - 1,ay2] = av2) Then
NettoieCellules(alab, ax2 - 1, ay2, adim_x, adim_y, av1, av2);
If (ax2 < adim_x-1) And (alab[ax2 + 1,ay2] = av2) Then
NettoieCellules(alab, ax2 + 1, ay2, adim_x, adim_y, av1, av2);
If (ay2 > 0) And (alab[ax2,ay2 - 1] = av2) Then
NettoieCellules(alab, ax2, ay2 - 1, adim_X, adim_y, av1, av2);
If (ay2 < adim_y-1) And (alab[ax2,ay2 + 1] = av2) Then
NettoieCellules(alab, ax2, ay2 + 1, adim_x, adim_y, av1, av2);
End;
procedure CLabyrinthe.GenererLab(aoutpout:string;adimx,adimy:integer);
var lab : t_gen;
dim_x,dim_y,dim_Finale_x,dim_Finale_y:integer;
continue,rand,x1,x2,y1,y2,x,y:integer;
v1,v2,NbMurs:integer;
MH : t_gen;
MV : t_gen;
rendu : t_gen_final;
fichier:text;
begin
dim_x := adimx;
dim_y := adimy;
dim_Finale_X := 2*dim_x+1;
dim_Finale_Y := 2*dim_y+1;
randomize;
NbMurs := 0;
//Initialisation des tableaux de murs
For x := 0 To dim_x-1 do
For y := 0 To dim_y-1 do
lab[x,y] := x * dim_y + y;
For x := 0 To dim_x-1 do
For y := 0 To dim_y-2 do
MH[x,y] := 1;
For x := 0 To dim_x-2 do
For y := 0 To dim_y-1 do
MV[x,y] := 1;
//On va maintenant enlever nos murs 1 par 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 // (= Si un mur a été trouvé)
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;
{s := '';
For i := 0 to dim_y-2 do
s := s+FloatToStr(MH[dim_x-1][i])+'//';
Showmessage(s); }
//Maintenant, on a 2 tableaux avec des murs horizontaux et verticaux, tres facile a utiliser.
//On met des trous de partout
For x := 0 To dim_Finale_X -1 do
For y := 0 To dim_Finale_Y -1 do
rendu[x,y]:=' ';
//On met des M sur la premiere et derniere ligne
For x := 0 to dim_Finale_X - 1 do begin
rendu[x,0]:= 'M';
rendu[x,dim_Finale_Y-1]:= 'M';
End;
//On met des M sur la premiere colonne et derniere colonne.
For y := 0 to dim_Finale_Y-1 do
begin
rendu[0,y]:= 'M';
rendu[dim_Finale_X-1,y]:= 'M';
end;
// 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 x := 0 To dim_x-2 do
Begin
For y := 0 To dim_y-1 do
If (MV[x,y] = 1) Then
Begin
rendu[2*(x+1),y*2+0]:= 'M';
rendu[2*(x+1),y*2+1]:= 'M';
rendu[2*(x+1),y*2+2]:= 'M';
//ShowMessage(FloatToStr(i)+'//'+FloatToStr(j)+'//'+rendu[2*(i+1)+1,j*2+1]+'//'+rendu[2*(i+1)+1,j*2+2]+'//'+rendu[2*(i+1)+1,j*2+3]+'//')
End;
End;
For x := 0 To dim_x-1 do
Begin
For y := 0 To dim_y-2 do
If (MH[x,y] = 1) Then
Begin
rendu[x*2 ,(y+1)*2]:= 'M';
rendu[x*2+1,(y+1)*2]:= 'M';
rendu[x*2+2,(y+1)*2]:= 'M';
//ShowMessage(FloatToStr(i*2+1)+'//'+FloatToStr((j+1)*2+1)+'//'+FloatToStr(i)+'//')
End;
End;
//On met l'entrée et la sortie sur les cotés du labyrinthe
rendu[0,(random(dim_Finale_Y div 2)+1)*2-1]:='E';
rendu[dim_Finale_X-1,(random(dim_Finale_Y div 2)+1)*2-1]:='S';
//On ecrit le fichier
assign (fichier,aoutpout);
rewrite(fichier);
For y := 0 To dim_Finale_Y-1 do
Begin
For x := 0 To dim_Finale_X-1 do
Write(fichier,rendu[x,y]);
Writeln(fichier,'');
End;
close(fichier);
End; |
Partager