Delphi-Problem! DRINGEND!

NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
  • 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..

  • Wenn du GEZIELTE Fragen stelltst, versuchen die meisten Mitglieder dir zu helfen, aber wie kommst du auf die Idee dass sich jemand die Arbeit antut 5 Bildschirmseiten Code zu lesen, um sie dann nach deinen Vorstellungen zu verändern?
    Wir helfen gerne, wenns geht, aber wir arbeiten nicht gratis.

    keep da fire burnin'

  • 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.

  • Zitat von Trasher52

    Ich hoffe, ihr könnt mir nun besser helfen :( Tut mir leid, dass ich es nicht sonderlich genau ausdrücken kann!


    Ich habe nicht gemeint dass du dich schlecht ausdrückst, sondern dass das Froum kein "Code-Generator" ist, der deine Arbeit übernimmt. Die Aussage:

    Zitat von Trasher52

    Ich brauche lediglich den Quellcode fertig eingebaut

    lässt darauf schließen dass es sich um eine Hausübung, o.ä. handelt die du natürlich selbst lösen solltest.

    Nun denn...

    Zitat von Trasher52

    ich hätte gerne, dass ein variables Labyrinth erzeugt wird, welches immer anders ist als das vorherige Labyrinth


    Die einfache Variante wäre, dass du dein Labyrinth etwas größer baust, und mit mehreren wegen zum Ziel, wobei du randomisiert einen dieser Wege wählst.
    Die aufwendigere (auch was die Rechenzeit betrifft) Variante: du fügst in einer Schleife randomisiert Teile hinzu, bzw. nimmst sie weg(entweder beim bestehenden, oder in einem 'leeren' Labyrinth), und schaust dann (entweder nach allen paar Operationen, oder am Ende), ob du einen (gültigen) Weg von Anfang bis Ende finden kannst.

    good luck.

    keep da fire burnin'

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!