Nun dann..
Ich habe mit dem oben geposteten Code ein Labyrinth im StringGrid erstellt. Nun fehlt mir jedoch der Code, den ich gebrauchen kann, damit sich das Labyrinth verändert. ich erstelle das labyrinth im laufenden Betrieb, indem ich den Button "neu"anklicke. Ein vorgegebenes Labyrinth wird dann im StringGrid erstellt. Dies reicht mir nicht und ich hätte gerne, dass ein variables Labyrinth erzeugt wird, welches immer anders ist als das vorherige Labyrinth. Sprich: Lab. soll bei jedem Aufruf anders sein, trotzdem soll der Weg immer gefunden werden.
Ich hab kaum Ahnung von Delphi und bin schon froh, dass das Programm überhaupt soweit läuft.
Ich hoffe, ihr könnt mir nun besser helfen Tut mir leid, dass ich es nicht sonderlich genau ausdrücken kann!
Danke.
Beiträge von Trasher52
-
-
Hi, ich bin neu hier und suche dringend Hilfe von erfahrenen Programmierern!
Mir geht es um das folgende Problem. Ich erstellte in Delpi7 Standard ein labyrinth mit Stringgrid und brachte das programm dazu, einen Weg von Start zu Ziel zu finden. Ich würde aber gerne die Möglichkeit besitzen, dass das labyrinth immer anders ist, sobald man auf den Button "neu"klickt.
Hierzu nun der Quellcode:
unit m_lab;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, interakt, ExtCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
bt_create: TButton;
bt_search: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Timer1: TTimer;
BtStop: TButton;
Btgoon: TButton;
procedure bt_createClick(Sender: TObject);
procedure bt_searchClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BtStopClick(Sender: TObject);
procedure BtgoonClick(Sender: TObject);
private
feld: array[0..19,0..18] of char;
zielerreicht: boolean;
procedure labyrinth(sp,zl: integer);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_createClick(Sender: TObject);
var x, i, j: integer;
begin
zielerreicht:= false;
for i:= 0 to 19 do begin
for j:= 0 to 18 do begin
feld[i,j]:=' ';
StringGrid1.Cells[i,j]:= feld[i,j];
end;
end;
x:=0;
while x < 19 do
begin
for i:= 0 to 19 do
begin
feld[i,x]:='M';
StringGrid1.Cells[i,x]:= feld[i,x];
end;
x:=x+2;
end;
for i:=0 to 18 do begin
feld[0,i]:='M';
StringGrid1.Cells[0,i]:= feld[0,i];
end;
for i:=0 to 18 do begin
feld[19,i]:='M';
StringGrid1.Cells[19,i]:= feld[19,i];
end;
feld[2,2]:=' ';
StringGrid1.Cells[2,2]:= feld[2,2];
feld[7,4]:=' ';
StringGrid1.Cells[7,4]:= feld[7,4];
feld[13,6]:=' ';
StringGrid1.Cells[13,6]:= feld[13,6];
feld[1,8]:=' ';
StringGrid1.Cells[1,8]:= feld[1,8];
feld[14,10]:=' ';
StringGrid1.Cells[14,10]:= feld[14,10];
feld[7,12]:=' ';
StringGrid1.Cells[7,12]:= feld[7,12];
feld[11,13]:='M';
StringGrid1.Cells[11,13]:= feld[11,13];
feld[1,14]:=' ';
StringGrid1.Cells[1,14]:= feld[1,14];
feld[16,16]:=' ';
StringGrid1.Cells[16,16]:= feld[16,16];
feld[1,17]:='Z';
StringGrid1.Cells[1,17]:= feld[1,17];
feld[1,1]:= 'S';
stringgrid1.cells[1,1] := feld[1,1];
end;
procedure TForm1.labyrinth(sp,zl: integer);
var
zlz, spz : integer;
begin
if not zielerreicht then
begin
if (feld[sp,zl]<>'M') and (feld[sp,zl]<>'.') then
begin
if feld[sp,zl]='Z' then
begin
zielerreicht:=true;
feld[sp,zl]:= 'E';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
StringGrid1.Cells[1,1]:= feld[1,1];
label1.visible := true;
warte;
end
else
feld[sp,zl]:='.';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
warte;
spz:=1;
zlz:=17;
if (sp < 19) and (sp > 0) and (zl< 18) and (zl > 0) then
begin
if (sp>spz)then
begin
if (zl>zlz) then
begin
if abs(sp-spz)>abs(zl-zlz)
then
begin
labyrinth(sp-1,zl);
labyrinth(sp,zl-1);
end
else
begin
labyrinth(sp,zl-1);
labyrinth(sp-1,zl);
end;
labyrinth(sp+1,zl);
labyrinth(sp,zl+1);
if not zielerreicht then
begin
feld[sp,zl]:='X';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
end;
end
else
begin
labyrinth(sp-1,zl);
labyrinth(sp,zl+1);
labyrinth(sp+1,zl);
labyrinth(sp,zl-1);
if not zielerreicht then
begin
feld[sp,zl]:='X';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
end;
end
end
else
if (zl>zlz)then
begin
labyrinth(sp+1,zl);
labyrinth(sp,zl-1);
labyrinth(sp-1,zl);
labyrinth(sp,zl+1);
if not zielerreicht then
begin
feld[sp,zl]:='X';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
end;
end
else
begin
labyrinth(sp+1,zl);
labyrinth(sp,zl+1);
labyrinth(sp-1,zl);
labyrinth(sp,zl-1);
if not zielerreicht then
begin
feld[sp,zl]:='X';
StringGrid1.Cells[sp,zl]:= feld[sp,zl];
end;
end;
end;
end;
end;
end;
procedure TForm1.bt_searchClick(Sender: TObject);
begin
labyrinth(1,1);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
mach_weiter;
end;
procedure TForm1.BtStopClick(Sender: TObject);
begin
timer1.Enabled := false;
BtStop.Visible := false;
Btgoon.Visible := true;
end;
procedure TForm1.BtgoonClick(Sender: TObject);
begin
timer1.Enabled := true;
Btgoon.visible := false;
Btstop.Visible := true;
end;
end.
Und die zweite Unit:unit interakt;
interface
uses forms;
procedure init_Interaktion;
procedure warte;
procedure mach_weiter;
procedure hoer_auf;
procedure fang_wieder_an;
implementation
var interaktion_erfolgt_,
schluss_gesetzt_: Boolean;
procedure init_Interaktion;
begin
interaktion_erfolgt_ := False;
schluss_gesetzt_ := False;
end;
procedure warte;
begin
repeat
Application.ProcessMessages
until interaktion_erfolgt_ or schluss_gesetzt_;
interaktion_erfolgt_ := False
end;
procedure mach_weiter;
begin
interaktion_erfolgt_:= True
end;
procedure hoer_auf;
begin
schluss_gesetzt_:= True
end;
procedure fang_wieder_an;
begin
schluss_gesetzt_:= false;
end;
Initialization
init_Interaktion;
end.
Bitte helft mir! ich brauche lediglich den Quellcode fertig eingebaut in meinen, damit sich das Laby. bei jedem Klick auf "neu"verändert..