Einzelnen Beitrag anzeigen

Timi-loader

Registriert seit: 10. Okt 2005
Ort: Berlin
97 Beiträge
 
Delphi 7 Personal
 
#1

Überprüfen ob n-eck geschlossen ist

  Alt 14. Okt 2005, 15:48
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
  Mit Zitat antworten Zitat