Also für die Entfernung hätte ich auch noch eine Idee:
Delphi-Quellcode:
function Convert(a: TPoint): TPoint;
begin // Konvertiert die Punkte in ein schiefes, gerade Koordinatensystem
Result.X := a.X - 1;
Result.Y := a.Y - 1 - (a.X - 1) div 2;
end;
function GetH(APlayer, ATarget: TPoint): Integer;
var
Player2, Target2, diff: TPoint;
begin
Player2 := Convert(APlayer);
Target2 := Convert(ATarget);
diff.X := Player2.X - Target2.X;
diff.Y := Player2.Y - Target2.Y;
Result := Min(Abs(diff.X) + Abs(diff.Y), Abs(diff.X+diff.Y) + Min(Abs(diff.X), ABS(diff.Y)))
if (diff.X <> 0) and (diff.Y <> 0) and (diff.X + diff.Y <> 0) then
Result := Result +1; // Drehung kostet einen Schritt
// Wenn es kein gradliniger Weg ist, kommt mindestens eine Drehung vor
end;
Aber ob das besser/schneller ist, musst du schon selber wissen
(Ich hab einfach mal die Koordinaten in "mein" Koordinatensystem konvertiert und "meine" Norm angewendet ...)
Was den A* angeht, sollte der nicht allzuschwer zu implementieren sein. Ich glaube fast, es ist schwieriger einen bestehenden anzupassen als selber kurz einen neu zu programmieren