Skocz do zawartości

[Delphi] Szukanie drogi


Toster

Polecane posty

Mialem napisac artsa o szukaniu drogi ale stwierdzilem ze juz ktos to zrobil :) W komentarzach ktos inny prosil o kod, wiec postanowilem wkleic gotowca. Oparta na algorytmie A* + Manhattan (o ile mnie pamiec nie myli). Wersja mocno zoptymalizowana, moze sie komus przyda:
[code=Delphi]
unit Engine;

interface
uses Types, Classes, forms, Sys][X]BBBŃYSP[HBUQNB3&w&6RwĆŚW6ĆĆ62ćFrWG6F7Ś24(9
4(=ŃizeWay mozna pominac jesli nie zalezy nam na najmniejszej liYCBX[HXXX]Z[K[Y7ŚFFVv6266WŚś32ćRćŚWWv2EvćFRć7&Ńą4(ŃŹ niepotrzebne obiekty byly trzymane w liscie a ich
paZYXYH[X[K[ZXXHYHYHZYXXHĆ7GWGĆVŚR6ćFF'7W7ŚGŚĆćRąŃ4(UŃźĄŃ5ĄŃŃĄecnie w uzyciu) oraz odleglosc
euklidesowa, nie widacYZXXYH[]]CBCBBCB^SFR6Ć70&VCEvćFS&V@67CŃźźŃźŃ4(ą integer; //wspolrzedne na mapie
uid: integer MHXHXYY[HCBćWCGvćFSVćCEv'&'&łtQA4)4(Ń4 OList, cList, fList: TWayNode;
frm: TForm;

functio[^JK^^N[Y]^P^JN[YW#ŚgVć7FFŚUvf\"'&Ev'&ś67B6óŚFVvWŃ4)Ń1Ń1ŃĄąQ]9Ń

implementation
function ListLength(const list:TWayNode)[YBB^SNBY[BH^B&W7VBŁ&WVCć2&W7VBBŁ4(Ń4(4)4(4)
Ń1
var
t: integer;
tt: TWayNode;
begin
//tyle nodZ[XHHHX^CBH^SKX]NBGBŁdĆ7Cf\"BŁF4g&VTćFT6VBF&VvŃQ]9
Ń4(ŃŃ4(
end;

procedure DestroyFreeList;
var
t,t2: TWayNodeBN[YBY[BH^BHHB&WVCC\"ŁBććWCBg&VSBŁC#(%Ą4(Ń4(Ą9
, IntToStr(i));
fList.free;
fList := nil;
end;

pYHX[
^SJNBB^SFSŚ&Vv'ŚW'V6ćGĆ7BfwCg&VTĆ7@ąŃĄ4(ą4(
t2 := t.next;

t.next := fList.next;
f^HBBH B[[[[BWBŁćŚVćCŚgVć7FĆ7B67BĆ7CEvćFS6Ń
ą4)4(Q]94)4(list;
repeat
if t.uid = i then begin result := trYN^][BH^B[[
H[
NBVBŁf6SŚVćC&6VGW&RćŚU6F67BćFQ]9ąą`ądŃ4)4(ŃQ]yNode;
cx, cy, t: integer;
begin
cx := node.fx+dx;
HHKJNBY

H
H
H
fwCł\& quot;7fwCłFVWCbś7Ć7fCfwCłĄ4(4(źŃ
źŃejs z list ?
t := (cx shl 16) or cy;
// <>false jest szybsH^]YCBY

Ó
I[JH
4Ć7BBfCfwCf6RFVWCFVŁEvćF
ŃĄ4(ź1Ń4 temp := fList;
fList := fList.next;
temp.fx := cxB[HHNB[ZYHB[[HFSFV27ĆVćEb7fCF
V7Ł7Ąąd4(ąŃĄ4(Ń
:= (cx+cy) shl 4; //heuristic

//poziome i pionowe rXHXZHLBHXZHMBY

L
HćBGfCfwCł\"GfCfwCłćBGÓFVĄŃ
4(ą4(%ĄŃ
4(4(Ń.next := OList.next;
OList.next := temp;
end;


func[[^JK^^N[Y]^P^JN[FVvW#f 7FVvW#FVBC\"GCEvćFSŚ&V4(
ąUĄ=14(
ąUĄ14(źrwszy element do listy
// temp :=TWayNode.Create(sx, sy);B[HBH^B[HFVćgŁ7FVVBŁ7
6b\"7Ń4(4(1Ń4(4( //bierzemy pierwszy z gory
if olist.next = nil then XZBHHLBHÓ^BBŁĆ7CC\"ŁGC&WV@bB6ąŃĄ4(
4(temp := t;
t2 := tt;
end;
tHBH^B[[[[B ćWBŁFVććWCFVććWBŁ4Ć7BććWC4ĆŃ4(ź
ąąŃąglych
AnalyzePosition(temp,-1,-1,ex,ey);
AnalyT][[LK^^JNB[[^T][[ KÓĆWĆWćŚU6FFVĆWĆWąAŃĄŃąą4(
ąAŃĄŃ, 0, 1,ex,ey);
AnalyzePosition(temp,-1, 1,ex,ey);
[[^T][[LK^^JNBB[[
[YćBFVćgW7VśćRBGĆ67ŁmtAĄŃŃ
4(4(Ą);
temp := temp.parent;
assert(temp <> n[
NBWHH[
[[JNB[[
ćg7ćBFVćg7&W7VBŁ7ŚVćCŚgVć7F=Ń]ĄQ]źŃŃ
var
t, y, dx, dy, ldx, ldy: integer;
ar2: TWayArrayBY[BHHVNBHHNBHLNBGŁ'&E'&BłGŁ'&E'&Źt4(źŃźź4(ą
ldy := dy;
dx := arra[t].x - arra[t+1].x;
HHVKHHV
WKNBY
\"GfCfwCśĆGFV&Vv#%Ł'&Bł4(%Ą4(4(4(mtl];
arra := ar2;
Result := y;
end;

initializationBX]QYSBÓH^SKX]NBÓŁEvćFR7&VFSŚfćĆŚF6ĆVWĆ7BĆ7B4(
ąUĄ114(Ń14)d.
[/code]

Dodatkowo kod dla formy jesli chcialby ktos sobie przetestowac to to, oczywicie trzeba podpiac odpowiednie eventy tu i tam, ale mysle ze dacie sobie z tym rade ;)

[delphi]cH-->