Toster Napisano Wrzesień 9, 2006 Zgłoś Share Napisano Wrzesień 9, 2006 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-->
Polecane posty