Autor Beitrag
SchwiegerSohn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mo 12.06.06 15:43 
hi,
Ich habe ein Koordinaten-System, mit dem WertigkeitsBereich auf der X achse von 0..600
und auf der Y achse von -300 nach 300.

Das ganze Dient einer Weg-Berechnung. Ohne aber über geblockte dinge zu fahren.

Jetzt suche ich einen AlgoRhytmus, mit dem ich von einem beliebigen StartPunkt, zu einem beliebigen End-Punkt komme,
ohne dabei geblockte koordinaten zu überfahren.

Die Geblockten Koordinaten, liegen in einem Boolean Array [0..600,-300..300]
True heisst geblockt, false ist ungeblockt.

Es geht dabei um ein Schiff spiel, wo mitten auf der Karte inseln sind, die umfahren werden sollen.

Als Beispiel :
StartPunkt ist X = 0, Y = -120
EndPunkt ist X = 300, Y = 0

Hier mal eine Routine, die von mir ist, aber noch nicht richtig Funktioniert. ( Weil sie immer noch geblockte Koordinaten überfährt)
nur um das Problem näher zu bringen.
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:
Procedure TSea.Navigate(MX,MY,ZX,ZY:Integer);
var TMP : String;
    I   : Integer;
    X,Y : Integer;
    DIR : Integer;
    Step : BOOLEAN;
label j1;
Begin
    X  := MX; //START PUNKT
    Y  := MY; //START PUNKT
    
//ZX,ZY = Ziel Punkt.
    TMP := 'ROUTE '; //Routen Schritte

    while true do
    begin
      while X <> ZX do //Erst auf der X Achse bewegen.
      begin
        if zx < x then
          b := -1
        else
          B := 1;
        if Not Blocked[X+B][Y] then
        begin
          X := X + B;
          Tmp := TMP + format('%d %d ',[X,Y]);
        end
        else
        begin  //X in richtung Ziel ist geblockt.. dann solange auf der Y bewegen, bis X wieder frei ist.
          if ZY < Y then
            A := -1
          else
            A := 1;
          if Blocked[X][Y+A] then
            A := A * -1;
          While Blocked[X+B][Y] do
          begin
            Y := Y + A;
            Tmp := TMP + format('%d %d ',[X,Y]);
          end;
        end;
      end;


      while Y <> ZY do  //das gleiche für die Y-Achse.
      begin
        if zY < y then
          b := -1
        else
          B := 1;
        if Not Blocked[X][Y+B] then
        begin
          Y := Y + B;
          Tmp := TMP + format('%d %d ',[X,Y]);
        end
        else
        begin
          if ZX < X then
            A := -1
          else
            A := 1;
          if Blocked[X+A][Y] then
            A := A * -1;
          While Blocked[X][Y+B] do
          begin
            X := X + A;
            Tmp := TMP + format('%d %d ',[X,Y]);
          end;
        end;
      end;
      if (X=ZX) and (Y=ZY) then Break;
    end;
end;


Ich hoffe, man versteht die Problematik.

Grusse Benny.

_________________
Wer rechtschreibfehler findet darf sie behalten!
SchwiegerSohn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mi 14.06.06 15:04 
soo... habs gelöst ;)

_________________
Wer rechtschreibfehler findet darf sie behalten!