![]() |
Ü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:
Zur Erklärung:
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; 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 |
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. |
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
|
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