Autor Beitrag
Timi-loader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58

Win XP
Delphi 7 Personal
BeitragVerfasst: Fr 14.10.05 11:40 
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..
Wenn nötig, würde ich auch meinen Quelltextversuch hier posten, aber da der doch bissl lang ist, dachte ich, verzichte ich erst einmal drauf..

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

M.f.G.
Timi-loader


Zuletzt bearbeitet von Timi-loader am Fr 14.10.05 12:20, insgesamt 1-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 14.10.05 11:59 
Will ja nicht pingelig sein, aber an deiner Erklärung wird der tiefe Sinn hinter orthographischen Regeln (Kommas und Rechtschreibung) sehr schnell klar: Es liest sich dann einfach besser.

Hast du ein Spielbrett? Welche Regeln gibt es da? Gibt es sozusagen Hindernisse? Oder wie?

_________________
Na denn, dann. Bis dann, denn.
Timi-loader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58

Win XP
Delphi 7 Personal
BeitragVerfasst: Fr 14.10.05 12:23 
Ja, ein Spielbrett hab ich und es gibt auch gewisse Regeln, aber die haben jetzt nichts mit der eigendlichen Fragestellung zu tun.

Und extra für dich ;) ..und andere hab ich nochmal versucht meinen Beitrag oben othografisch besser zu gestalten.

M.f.G.
Timi-loader
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 14.10.05 12:27 
Du verstehst sicherlich, dass ich bei dieser Schreibweise nicht alle deine Ausführungen gelesen habe, das ist ja fast so schlimm, wie wenn einer mit ner Sauklaue handschriftlich was schreibt. :evil:

Na ja, zur grundsätzlichen Vorgehensweise:
Hier solltest du am besten rekursiv vorgehen. Dazu brauchst du natürlich etwas, wo deine Wege gespeichert sind. Dann fängst du beim Ausgangspunkt an, und rufst für jeden wegführenden Weg eine Funktion auf, die diesen überprüft.
Im Rückgabewert muss dann der Erfolg angegeben werden und zudem muss irgendwo der Weg gespeichert werden.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
var
  Playground: array of array of array[0..7of Boolean;

procedure TesteWeg(uPosition: TPoint; uRichtung: Integer; var uWeg: TWeg): Boolean;

  function GetNewPosition: TPoint;
  begin
    case uRichtung of
      017: Result.Y := uPosition.Y - 1;
      345: Result.Y := uPosition.Y + 1;
    end;
    case uRichtung of
      123: Result.X := uPosition.X + 1;
      567: Result.X := uPosition.X - 1;
    end;
  end;

var
  i: Integer;
  tmpWeg: TWeg;
begin
  tmpWeg := uWeg;

  //In tmpWeg den aktuellen hinzufügen

  uPosition := GetNewPosition;
  for i := 0 to 7 do
    if Playground[uPosition.X, uPosition.Y, i] and TesteWeg(uPosition, i, uWeg) then
    begin
      uWeg := tmpWeg;
      Break;
    end;
end;

//In deiner Startmethode:
for i := 0 to 7 do
  if Playground[32, i] and TesteWeg(Point(32), i, myWay) then
    Break;

Das ist ein ganz simples Vorgehen, fertig ist das natürlich noch lange nicht, aber die Idee hilft ja vielleicht.
In einem Array wird gespeichert, in welche der (bei einem quardatischen F>eld mit diagonalen Zügen) 8 nrichtungen man vom aktuellen Feld aus kommt (Richtung[i], Ja odser Nein).
Dann muss man nur vom Anfangspunkt aus alle möglichen R<ichtungen jeweils überprüfen.

//EDIT: Wow, jetzt kann man ja die Fragestellung richtig lesen...
Timi-loader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58

Win XP
Delphi 7 Personal
BeitragVerfasst: Fr 14.10.05 13:24 
hmm ja ansich versteh ich die herangehensweise nur das ich meine methode nur mit 4 richtungen gemacht hab was allerdings eh irgendwann hätten 8 werden müssen...
..jedenfalls zeig ich jezt einfach mal was ich versucht hab.. vll. findet ihr ja nen fehler:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
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; .

..und mit case of hab ich bei dir schon verstandn ..komme nur net klar wo jetzt der weg überprüft wird..
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 14.10.05 14:08 
user profile iconTimi-loader hat folgendes geschrieben:
hmm ja ansich versteh ich die herangehensweise nur das ich meine methode nur mit 4 richtungen gemacht hab was allerdings eh irgendwann hätten 8 werden müssen...
..und mit case of hab ich bei dir schon verstandn ..komme nur net klar wo jetzt der weg überprüft wird..

Nun ja, das hab ich auch nicht eingebaut, ich wollte ja schließlich nur zeigen, wie das rekursiv funktioniert! In TesteWeg musst du natürlich den Rückgabewert, also Result, dementsprechend setzen. Dazu musst du halt prüfen, ob die Position, die man in TesteWeg übergeben bekommen hat, die gesuchte ist, und, falls das der Fall ist, True zurückgeben und aus der Methode rausgehen. (Die Schleife zum weiteren Testen, darf dann natürlich nicht mehr ausgeführt werden!!!)

Sicher hätte ich auch das on the fly hinbekommen und posten können, (on the fly, weil Delphi hab ich im Moment nicht hier), aber ich wollte ja nur die Idee zeigen und nicht das Programm fertig schreiben...
Timi-loader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58

Win XP
Delphi 7 Personal
BeitragVerfasst: Fr 14.10.05 14:25 
ich versteh schon, dass du nciht das programm fertig schreiben sollst.. aber genau der teil den du weggelassen hast ist der, der mir fehlt.. und den ich nicht hinbekomme.. und das man das mit den richtungen noch bissl vereinfachen kann ist mir klar.. nur ebend net mit dem "gedachten ablaufen" ..wäre evtl auch nett wenn du dir mal den quelltext von mir anguggst und daran verbesserungen durchführen könntest, da ich nicht unbedingt lust habe noch eine andere methode zu benutzen es sei denn es geht so garnicht wie ich mir das dachte..
mfg
Timi-loader