AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Überprüfen ob n-eck geschlossen ist
Thema durchsuchen
Ansicht
Themen-Optionen

Überprüfen ob n-eck geschlossen ist

Ein Thema von Timi-loader · begonnen am 14. Okt 2005 · letzter Beitrag vom 14. Okt 2005
Antwort Antwort
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
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Überprüfen ob n-eck geschlossen ist

  Alt 14. Okt 2005, 15:58
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.
Jan
  Mit Zitat antworten Zitat
Timi-loader

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

Re: Überprüfen ob n-eck geschlossen ist

  Alt 14. Okt 2005, 16:08
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
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Überprüfen ob n-eck geschlossen ist

  Alt 14. Okt 2005, 17:29
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz