Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überprüfen ob n-eck geschlossen ist (https://www.delphipraxis.net/54986-ueberpruefen-ob-n-eck-geschlossen-ist.html)

Timi-loader 14. Okt 2005 15:48


Überprüfen ob n-eck geschlossen ist
 
Hallo.
Ich will in meinem Programm überprüfen lassen, ob sozusagen der Weg von einem Eckstartpunkt über beliebige Kurven zum Ausgangspunkt hin ankommt. Dazu habe ich mir auch eigendlich simpel überlegt, prüft er, ob er ein Feld vor gehen kann und solange dies der Fall ist, tut er das und wenn es nichtmehr der Fall ist, d.h. eine Ecke existiert, probiert er in die 2 anderen Richtungen aus (da insgesammt 4 Richtungen und selben Weg zurück soll er ja nicht gehen). D.h. er probiert's dann genauso: Solange Schritt in eine andere Richtung möglich ist, gehe weiter. Wenn nichtmehr möglich, dann ist's 'ne Ecke und probiere die 2 anderen Richtungen aus. U.s.w bis er schließlich am Startpunkt ankommt.
Dann soll er später noch alle Felder, die in diesem Viereck liegen, ermitteln und "füllen" aber das kommt ja danach. Und wenn ebend das Viereck oder Mehreck nicht geschlossen ist, passiert garnichts, sondern er geht aus dieser "Kurvenüberprüf-Prozedur" raus und der Spieler kann normal weiterspielen und seine Felder setzen.

Ich hoffe das war nicht zuviel/zu kompliziert erklärt..
Hier nunmal der Quelltext den ich mich zusammengebastelt habe, der aber iregdnwie nicht funzt:
Delphi-Quellcode:
procedure TForm1.vierecksp;
begin
rx:=x1; // + 1;  // wobei x1,y1 die aktuelle position des typ1 ist
lx:=x1; // - 1;
oy:=y1; // - 1;
uy:=y1; // + 1;
probenm:=1;
pruntenm:=1;
prlinksm:=1;
prrechtsm:=1;
testvorbei:=0; //bisher unverwendet
prrechts;            // fängt einfach mal beliebig mit rechts an zu testen..
if ((rx=x1) and (oy=y1)) or ((rx=x1) and (uy=y1)) or ((lx=x1) and (oy=y1)) or ((lx=x1) and (uy=y1)) then close;
end;

procedure TForm1.prrechts;
begin
if prrechtsm=1 then
begin  while belegt[rx,uy]=4 do
        begin
         rx:=rx+1;
         if ((rx=x1) and (oy=y1)) or ((rx=x1) and (uy=y1)) then close;
        end;
        if belegt[rx,uy]<>4 then
             begin
              prrechtsm:=0;
              if probenm=1 then proben;
              if pruntenm=1 then prunten;
             end;
end;

end;

procedure TForm1.proben;
begin
if probenm=1 then
begin while belegt[rx,oy]=4 do
      begin
       oy:=oy-1;
       if ((rx=x1) and (oy=y1)) or ((lx=x1) and (oy=y1)) then close;
      end;
      if belegt[rx,oy]<>4 then
           begin
            probenm:=0;
            if prlinksm=1 then prlinks;
            if prrechtsm=1 then prrechts;
           end;
end;

end;

procedure TForm1.prlinks;
begin
if prlinksm=1 then
begin while belegt[lx,oy]=4 do
      begin
       lx:=lx-1;
       if ((lx=x1) and (oy=y1)) or ((lx=x1) and (uy=y1)) then close;
      end;
      if belegt[lx,oy]<>4 then
           begin
            prlinksm:=0;
            if pruntenm=1 then prunten;
            if probenm=1 then proben;
           end;
end;

end;

procedure TForm1.prunten;
begin
if pruntenm=1 then
begin while belegt[lx,uy]=4 do
      begin
       uy:=uy+1;
       if ((rx=x1) and (uy=y1)) or ((lx=x1) and (uy=y1)) then close;
      end;
      if belegt[lx,uy]<>4 then
           begin
            pruntenm:=0;
            if prrechtsm=1 then prrechts;
            if prlinksm=1 then prlinks;
           end;
end;

end;
Zur Erklärung:
Den Wert 4 bekommt das Feld dann durch den Spieler gesetzt, da es noch 3 Vorstufen gibt, die aber nicht überprüft werden sollen.
Und die Variablen mit dem Schema [prozedur]m da steht m für möglich, weil ich dachte, dass man nicht mehrfach selbe Richtungen überprüfen sollte, was sonst zu einer Endlosschleife führt... aber irgendwie ists so wies jetzt ist auch zu früh
Und in dem Testfall soll das Programm wenn das Viereck komplett ist geschlossen werden durch close; .


Würd' mich über Lösungsvorschläge sehr freuen, da ich schon ziemlich lang an diesem Problem sitze..

M.f.G.
Timi-loader

Eichhoernchen 14. Okt 2005 15:58

Re: Überprüfen ob n-eck geschlossen ist
 
Ich würd dir ja schon gern helfen, nur leider verstehe ich nicht so richtig was du genau willst.

Etwas undurchsichtig, es scheint sich ja um ein Spiel zu handeln, du solltest die Regeln erklären und dann genau dein Problem.

Das was ich jetzt da so denke was du suchst, ist ein Backtrackingalgorithmus, nur leider kann ich dir bei dem nicht wirklich weiterhelfen weil ich nicht genau verstanden habe was das Ziel ist!


Falls du was über Backtracking wissen willst, such mal nach N-Damenproblem, Springerproblem oder nach dem Weg aus dem Labyrinth.

Timi-loader 14. Okt 2005 16:08

Re: Überprüfen ob n-eck geschlossen ist
 
also bei dem spiel läuft man über ein feld und belegt somit ein array: belegt[x1,y1]=1 ..wenn man nochmal drüber läuft wird es zu ner 2 schließlich bis zur 4 und dieses feld ist dann gesichert.. wenn man nun eine art umrandung gebaut hat dann soll es sich in ihr füllen .. aber das füllen kommt später.. was ich versuche ist herauszufinden ob diese umrandung ebend vollständig existiert

Nikolas 14. Okt 2005 17:29

Re: Überprüfen ob n-eck geschlossen ist
 
Dann speicher in deinem Array doch lieber die Kanten, als die Felder. Wenn eine Kante passiert wird, wird ihr Status verändert. Dann dürfte es recht einfach sein, zu überprüfen, ob ein Quadrat eingefasst ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz