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.
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; Y := MY; TMP := 'ROUTE '; while true do begin while X <> ZX do 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 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 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.