pathfinding: ziel kann nicht erreicht werden
Übersicht

![]() |
BaschdiBetreff: pathfinding: ziel kann nicht erreicht werden |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Wenn man einen Zielort hat, der nicht erreichbar ist, wie bringe ich nun die unit dazu ohne FPS Abfall (bei mir von 60 auf 40 wenn ich wie ich es programmiert habe der Unit befehle stehen zu bleiben.) einfach stehen zu bleiben oder, dass die unit versucht so nahe an den Ort hinzulaufen wie es nur geht. danke im vorraus Code: [AUSKLAPPEN] ;Konstante Const Width=800 Const Height=Width*0.75 Const tile=32 ;Grafische Auflösung AppTitle"* RTS 1 *" Graphics width,height,0,2 SetBuffer BackBuffer() ;Allgemein Global xback,yback Global gfx$="gfx\",sfx$="sfx\" ;Hintergrund Global mapX=64,mapY=64,feld=1 Global tileset=LoadAnimImage(gfx$+"tileset.bmp",tile,tile,0,2) : MidHandle tileset Dim stat(mapX,mapY) Dim map(mapX,mapY) map(5,1)=1:map(6,1)=1:map(7,1)=1 map(5,2)=1:map(6,2)=0:map(7,2)=1 map(5,3)=1:map(6,3)=0:map(7,3)=0 map(5,4)=1:map(6,4)=1:map(7,4)=1 ;Pathfinding Global PfadBank=CreateBank(2),Bsize Global mapwidth=mapX,mapheight=mapY,fightstep,schalter Dim MapData$(50),Fighter(72) Dim sqrmap(mapX,mapY),nodemap(0,0),dirx(7),diry(7),dirz(7) For i=0 To 7:Read dirx(i):Read diry(i):Read dirz(i):Next Type node Field parent.node,cost,x,y End Type Type open Field node.node End Type Type path Field node.node End Type Data 0,-1,0, -1,0,0, 1,0,0, 0,1,0 Data -1,-1,1, 1,-1,1, -1,1,1, 1,1,1 ;Maus Global mx,my,pmx,pmy,m2 Global maus=LoadImage(gfx$+"maus.bmp") Global Imaus=LoadImage(gfx$+"Imaus.bmp") ;Rand Global Bhigh=150 Global border=LoadImage(gfx$+"border.bmp") ;Einheiten Global unitMax=1 Global unit=LoadAnimImage(gfx$+"unit.bmp",tile,tile,0,4) : MidHandle unit Dim IMAunit(7) For i=0 To 7 : IMAunit(i)=CopyImage(unit) : RotateImage IMAunit(i),i*45 : Next Type unit Field x,y,xx,yy,xZ,yZ,xEnd,yEnd,AZx,AZy,px,py Field winkel,AttX,AttY,buuf,FolX,FolY,verfolgen,verfolger Field sel,team,typ,action,fightstep,uPfad Field leben,sicht,angriff,dauer,gesch,reich End Type ;Schuss Global treffer=LoadAnimImage(gfx$+"treffer.bmp", 12, 12, 0, 10) : MidHandle treffer Type treffer Field x,y,st End Type ;###### Hauptschleife ######; NewUnit(3*tile,6*tile,1,2) NewUnit(3*tile,7*tile,1,2) ;NewUnit(3*tile,8*tile,1,2) ;NewUnit(3*tile,9*tile,1,2) ;NewUnit(3*tile,10*tile,1,2) ;NewUnit(3*tile,11*tile,1,2) ;NewUnit(3*tile,12*tile,1,2) ;NewUnit(3*tile,13*tile,1,2) ;NewUnit(3*tile,14*tile,1,2) ;NewUnit(3*tile,15*tile,1,2) ;NewUnit(3*tile,16*tile,1,2) ;NewUnit(3*tile,17*tile,1,2) ;NewUnit(3*tile,18*tile,1,2) ;NewUnit(3*tile,19*tile,1,2) ;NewUnit(3*tile,20*tile,1,2) ;NewUnit(3*tile,21*tile,1,2) NewUnit(6*tile,6*tile,1,1) NewUnit(6*tile,7*tile,1,1) ;NewUnit(6*tile,8*tile,1,1) ;NewUnit(6*tile,9*tile,1,1) ;NewUnit(6*tile,10*tile,1,1) ;NewUnit(6*tile,11*tile,1,1) ;NewUnit(6*tile,12*tile,1,1) ;NewUnit(6*tile,13*tile,1,1) ;NewUnit(6*tile,14*tile,1,1) ;NewUnit(6*tile,15*tile,1,1) ;NewUnit(6*tile,16*tile,1,1) ;NewUnit(6*tile,17*tile,1,1) ;NewUnit(6*tile,18*tile,1,1) ;NewUnit(6*tile,19*tile,1,1) ;NewUnit(6*tile,20*tile,1,1) ;NewUnit(6*tile,21*tile,1,1) Repeat Cls ;Hintergrund malen For x=0 To mapX For y=0 To mapY DrawImage tileset,x*tile-xback,y*tile-yback,map(x,y) If map(x,y)>=feld Then: stat(x,y)=1 ElseIf map(x,y)<feld Then: stat(x,y)=0 EndIf For u.unit=Each unit stat(u\xx/tile,u\yy/tile)=u\team Next ;Text x*tile,y*tile,map(x,y) ;00 = frei ;01 = team 1 ;02 = team 2 ;03 = team 3 ;04 = team 4 ;09 = hinderniss ;10 = Wasser Next Next ;Units UpdateUnit() ;Treffer UpdateTreffer() ;Border DrawImage border,0,height-Bhigh ;Maus & Scrollen UpdateMaus() ms=MilliSecs():Text 0,0,fps If ms>mt mt=ms+502:fps=frame:frame=0 Else frame=frame+2 Flip Until KeyHit(1) End ;###### Funktionen ######; Function UpdateMaus() ;Maus malen mx=MouseX() my=MouseY() pmx=(mx+xback+tile/2)/tile pmy=(my+yback+tile/2)/tile DrawImage maus,mx,my DrawImage Imaus,mx,my ;Scrollen If KeyDown(200) And MouseDown(1)=0 And yback>0 Then: yback=yback-4 EndIf If KeyDown(208) And MouseDown(1)=0 And yback<mapY*tile-height+Bhigh Then: yback=yback+4 EndIf If KeyDown(205) And MouseDown(1)=0 And xback<mapX*tile-weight Then: xback=xback+4 EndIf If KeyDown(203) And MouseDown(1)=0 And xback>0 Then: xback=xback-4 EndIf End Function Function NewUnit(x,y,typ,team) u.unit=New unit u\xx=x u\yy=y u\xZ=u\xx u\yZ=u\yy u\xEnd=u\xx u\yEnd=u\yy u\px=u\xx/tile u\py=u\yy/tile u\AttX=-5 u\AttY=-5 u\FolX=u\xx u\FolY=u\yy u\team=team u\typ=typ u\dauer=400 u\leben=45 u\angriff=6 u\reich=3 u\gesch=4 u\sicht=4 u\uPfad=CreateBank(2) End Function Function UpdateUnit() For u.unit=Each unit ;Bild malen u\x=u\xx-xback u\y=u\yy-yback u\px=(u\xx)/tile u\py=(u\yy)/tile If u\sel=1 Then Color 0,255,0 : Rect u\x-tile/2,u\y-tile/2,tile,tile,0 DrawImage IMAunit(u\winkel),u\x,u\y,u\typ ;map stat(u\xx/tile,u\yy/tile)=u\team ;Selektieren If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit(u\winkel),u\x,u\y,0)=1 Then u\sel=1 If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit(u\winkel),u\x,u\y,0)=0 Then u\sel=0 ;Zielsuche If MouseDown(2) And m2=0 And u\sel=1 And stat(pmx,pmy)=0 Then: m2=1 u\action=1 u\xEnd=Pmx*tile u\yEnd=Pmy*tile pathfinding(u\xx/tile,u\yy/tile,u\xEnd/tile,u\yEnd/tile):u\FightStep=PfadSpliner() Bsize=BankSize(PfadBank) ResizeBank(u\uPfad,Bsize) CopyBank PfadBank, 0, u\uPfad, 0, Bsize EndIf If MouseDown(2)=0 Then m2=0 ;Aktion If u\xx=u\xEnd And u\yy=u\yEnd Then u\action=3 ;Pathfinding If u\fightstep<0 Then u\fightstep=0 If u\fightstep<1 And u\xEnd<=u\xx+tile And u\xEnd>=u\xx-tile And u\yEnd<=u\yy+tile And u\yEnd>=u\yy-tile Then: u\xZ=u\xEnd:u\yZ=u\yEnd : u\FolX=u\xZ:u\FolY=u\yZ ;If u\fightstep<1 Then: u\xZ=u\xEnd:u\yZ=u\yEnd : u\FolX=u\xZ:u\FolY=u\yZ ElseIf u\fightstep>0 Then: u\xZ=(PeekShort(u\uPfad,u\FightStep)) u\yZ=(PeekShort(u\uPfad,u\FightStep+2)) u\FolX=u\xZ u\FolY=u\yZ EndIf If u\xx=u\xZ And u\yy=u\yZ And u\fightstep>0 Then u\fightstep=u\fightstep-44 ;Aktionen If u\action=0 Then: ;stehen bleiben u\xEnd=u\xZ:u\yEnd=u\yZ ElseIf u\action=1 Then: ;bewegen nach ort ;Oben -Rechts laufen If u\xZ > u\xx And u\yZ < u\yy Then: u\winkel=1 : u\xx=u\xx+u\gesch : u\yy=u\yy-u\gesch ;Unten-Rechts laufen ElseIf u\xZ > u\xx And u\yZ > u\yy Then: u\winkel=3 : u\xx=u\xx+u\gesch : u\yy=u\yy+u\gesch ;Unten-Links laufen ElseIf u\xZ < u\xx And u\yZ > u\yy Then: u\winkel=5 : u\xx=u\xx-u\gesch : u\yy=u\yy+u\gesch ;Oben -Links laufen ElseIf u\xZ < u\xx And u\yZ < u\yy Then: u\winkel=7 : u\xx=u\xx-u\gesch : u\yy=u\yy-u\gesch ;Oben laufen ElseIf u\yZ < u\yy Then: u\winkel=0 : u\yy=u\yy-u\gesch ;Unten laufen ElseIf u\yZ > u\yy Then: u\winkel=4 : u\yy=u\yy+u\gesch ;Rechts laufen ElseIf u\xZ > u\xx Then: u\winkel=2 : u\xx=u\xx+u\gesch ;Links laufen ElseIf u\xZ < u\xx Then: u\winkel=6 : u\xx=u\xx-u\gesch EndIf ElseIf u\action=2 Then: ;angreifen ohne folgen ;...Nexte Schleife ElseIf u\action=3 Then: ;angreifen mit folgen For a.unit=Each unit For o.unit=Each unit If a\action=3 Then: If a\FolX=a\xx And a\FolY=a\yy And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: a\FolX=o\xx:a\FolY=o\yy ;: a\buuf=Rnd(1,50) ElseIf a\FolX<>a\xx And a\FolY<>a\yy And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: a\FolX=a\FolX:a\FolY=a\FolY ;: a\buuf=Rnd(1,50) : Text 0,0,"1122112121212" Else: a\FolX=a\xx:a\FolY=a\yy EndIf Text a\x,a\y,"("+a\FolX+"/"+a\FolY+")" ; If a\FolX<>o\xx And a\FolY<>o\yy And o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then: ; ; a\FolX=o\xx ; a\FolY=o\yy ; ;o\verfolgen=1 And a\verfolger=1 And ; If a\FolX=o\xx And a\FolY=o\yy Then: ; If o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: ; Text u\x,u\y,"angreifen "+u\FolX+"/"+u\FolY ; Else: ; Text u\x,u\y,"verfolgen "+u\FolX+"/"+u\FolY ; a\xEnd=a\FolX ; a\yEnd=a\FolY ; pathfinding(a\xx/tile,a\yy/tile,a\xEnd/tile,a\yEnd/tile):a\FightStep=PfadSpliner() ; Bsize=BankSize(PfadBank) ; ResizeBank(a\uPfad,Bsize) ; CopyBank PfadBank, 0, a\uPfad, 0, Bsize ; ; ; ;Oben -Rechts laufen ; If a\xZ > a\xx And a\yZ < a\yy Then: a\winkel=1 : a\xx=a\xx+a\gesch : a\yy=a\yy-a\gesch ; ;Unten-Rechts laufen ; ElseIf a\xZ > a\xx And a\yZ > a\yy Then: a\winkel=3 : a\xx=a\xx+a\gesch : a\yy=a\yy+a\gesch ; ;Unten-Links laufen ; ElseIf a\xZ < a\xx And a\yZ > a\yy Then: a\winkel=5 : a\xx=a\xx-a\gesch : a\yy=a\yy+a\gesch ; ;Oben -Links laufen ; ElseIf a\xZ < a\xx And a\yZ < a\yy Then: a\winkel=7 : a\xx=a\xx-a\gesch : a\yy=a\yy-a\gesch ; ;Oben laufen ; ElseIf a\yZ < a\yy Then: a\winkel=0 : a\yy=a\yy-a\gesch ; ;Unten laufen ; ElseIf a\yZ > a\yy Then: a\winkel=4 : a\yy=a\yy+a\gesch ; ;Rechts laufen ; ElseIf a\xZ > a\xx Then: a\winkel=2 : a\xx=a\xx+a\gesch ;Links laufen ; ElseIf a\xZ < a\xx Then: a\winkel=6 : a\xx=a\xx-a\gesch ; EndIf ; ; a\FolX=a\xx:a\FolY=a\yy ; ; EndIf ; EndIf ; ; EndIf ; If o\verfolgen=0 And a\verfolger=0 And o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then: ; o\verfolgen=1:a\verfolger=1 ; EndIf ; If o\verfolgen=1 Then: ; If o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: ; ;att ; a\verfolger=0 ; o\verfolgen=0 ; Else: ; a\action=1 ; a\xEnd=o\xx ; a\yEnd=o\yy ; pathfinding(a\xx/tile,a\yy/tile,a\xEnd/tile,a\yEnd/tile):a\FightStep=PfadSpliner() ; Bsize=BankSize(PfadBank) ; ResizeBank(a\uPfad,Bsize) ; CopyBank PfadBank, 0, a\uPfad, 0, Bsize ; EndIf ; EndIf ; If a\xx=(a\xx/tile)*tile And a\yy=(a\yy/tile)*tile ; If o\xx<a\xx+a\sicht*tile And o\xx>a\xx-a\sicht*tile And o\yy<a\yy+a\sicht*tile And o\yy>a\yy-a\sicht*tile And a\team<>o\team Then: ; a\FolX=o\xx:a\FolY=o\yy ; ElseIf a\FolX<>a\xx And a\FolY<>a\yy Then: ; a\FolX=a\FolX:a\FolY=a\FolY ; a\action=1 ; a\xEnd=a\FolX ; a\yEnd=a\FolY ; pathfinding(u\xx/tile,u\yy/tile,u\xEnd/tile,u\yEnd/tile):u\FightStep=PfadSpliner() ; Bsize=BankSize(PfadBank) ; ResizeBank(u\uPfad,Bsize) ; CopyBank PfadBank, 0, u\uPfad, 0, Bsize ; Else: ; If a\FolX<a\xx+a\reich*tile And a\FolX>a\xx-a\reich*tile And a\FolY<a\yy+a\reich*tile And a\FolY>a\yy-a\reich*tile And a\team<>o\team Then: ; Text 0,100,"sssssssssssssssssssssssssssss" ; Else: ; a\FolX=a\xx:a\FolY=a\yy ; EndIf ; EndIf ; EndIf ; ; Text u\x,u\y,u\FolX+"/"+u\FolY+" - "+u\xx+"/"+u\yy ;Oben -Rechts laufen ; If a\FolX > a\xx And a\FolY < a\yy Then: a\winkel=1 : a\xx=a\xx+a\gesch : a\yy=a\yy-a\gesch ; ;Unten-Rechts laufen ; ElseIf a\FolX > a\xx And a\FolY > a\yy Then: a\winkel=3 : a\xx=a\xx+a\gesch : a\yy=a\yy+a\gesch ; ;Unten-Links laufen ; ElseIf a\FolX < a\xx And a\FolY > a\yy Then: a\winkel=5 : a\xx=a\xx-a\gesch : a\yy=a\yy+a\gesch ; ;Oben -Links laufen ; ElseIf a\FolX < a\xx And a\FolY < a\yy Then: a\winkel=7 : a\xx=a\xx-a\gesch : a\yy=a\yy-a\gesch ; ;Oben laufen ; ElseIf a\FolY < a\yy Then: a\winkel=0 : a\yy=a\yy-a\gesch ; ;Unten laufen ; ElseIf a\FolY > a\yy Then: a\winkel=4 : a\yy=a\yy+a\gesch ; ;Rechts laufen ; ElseIf a\FolX > a\xx Then: a\winkel=2 : a\xx=a\xx+a\gesch ; ;Links laufen ; ElseIf a\FolX < a\xx Then: a\winkel=6 : a\xx=a\xx-a\gesch ; EndIf ;EndIf EndIf Next Next EndIf ;Sterben If u\leben<1 Then: Delete u EndIf Next For a.unit=Each unit For o.unit=Each unit If a\action=2 Then: If a\AttX=-5 And a\AttY=-5 And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: a\AttX=o\xx:a\AttY=o\yy ;: a\buuf=Rnd(1,50) ElseIf a\AttX>-5 And a\AttY>-5 And o\xx<a\xx+a\reich*tile And o\xx>a\xx-a\reich*tile And o\yy<a\yy+a\reich*tile And o\yy>a\yy-a\reich*tile And a\team<>o\team Then: a\AttX=a\AttX:a\AttY=a\AttY ;: a\buuf=Rnd(1,50) Else: a\AttX=-5:a\AttY=-5 EndIf If o\xx=a\AttX And o\yy=a\AttY And a\team<>o\team Then: a\buuf=a\buuf+1 : Color 255,255,0 If a\buuf=1 Then a\buuf=Rand(2,((2*a\dauer)/3)-2) If a\buuf>((5*a\dauer)/6) And a\buuf<a\dauer Then: Line a\x,a\y,o\x,o\y ElseIf a\buuf>a\dauer Then: a\buuf=0 : o\leben=o\leben-Rand(a\angriff-2,a\angriff+1) : a\AttX=o\xx : a\AttY=o\yy tr.treffer=New treffer tr\x=o\xx+Rand(-5,5) tr\y=o\yy+Rand(-5,5) EndIf If o\leben=0 Then a\AttX=-5 : a\AttY=-5 EndIf ;kein ziel If a\AttX<0 And a\AttY<0 Then: a\winkel=a\winkel ;Oben -Rechts angreifen ElseIf a\AttX > a\xx And a\Atty < a\yy Then: a\winkel=1 ;Unten-Rechts angreifen ElseIf a\AttX > a\xx And a\Atty > a\yy Then: a\winkel=3 ;Unten-Links angreifen ElseIf a\AttX < a\xx And a\Atty > a\yy Then: a\winkel=5 ;Oben -Links angreifen ElseIf a\AttX < a\xx And a\Atty < a\yy Then: a\winkel=7 ;Oben angreifen ElseIf a\Atty < a\yy Then: a\winkel=0 ;Unten angreifen ElseIf a\Atty > a\yy Then: a\winkel=4 ;Rechts angreifen ElseIf a\AttX > a\xx Then: a\winkel=2 ;Links angreifen ElseIf a\AttX < a\xx Then: a\winkel=6 EndIf EndIf Next Next End Function Function pathfinding(startx,starty,endx,endy) Delete Each node Delete Each open Delete Each path Dim nodemap(mapwidth,mapheight) If startx=endx And starty=endy Then Return node.node=New node node\x=startx node\y=starty open.open=New open open\node=node nodemap(startx,starty)=1 .again2 node=Null cost=2147483647 For open=Each open delta=sqrmap(Abs(open\node\x-endx),Abs(open\node\y-endy)) If open\node\cost+delta<cost Then cost=open\node\cost+delta node=open\node tempopen.open=open EndIf Next If node=Null Then Return Delete tempopen For i=0 To 7 x=node\x+dirx(i) y=node\y+diry(i) If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then If stat(x,y)=0 And nodemap(x,y)=0 Then If dirz(i)=1 Then If stat(x,node\y)<>0 And stat(node\x,y)<>0 Then Goto jump2 EndIf tempnode.node=New node tempnode\parent=node tempnode\cost=node\cost+1+dirz(i) tempnode\x=x tempnode\y=y open.open=New open open\node=tempnode nodemap(x,y)=1 If x=endx And y=endy Then finish=1:Exit .jump2 EndIf EndIf Next If finish=0 Then Goto again2 While tempnode\parent<>Null path.path=New path path\node=tempnode tempnode=tempnode\parent Wend path.path=New path path\node=tempnode End Function Function PfadSpliner() FreeBank(PfadBank):PfadBank=CreateBank(4) Color 200,0,0 For path.path=Each path If path=Last path Then Exit tmp.path=Before path If tmp=Null Then x0=path\node\x y0=path\node\y Else x0=tmp\node\x y0=tmp\node\y EndIf x1=path\node\x y1=path\node\y tmp.path=After path x2=tmp\node\x y2=tmp\node\y tmp.path=After tmp If tmp=Null Then x3=x2 y3=y2 Else x3=tmp\node\x y3=tmp\node\y EndIf spline(X0,Y0,X1,Y1,X2,Y2,X3,Y3) Next Return BankSize(PfadBank)-4 End Function Function spline(x1,y1,x2,y2,x3,y3,x4,y4) Ras=32 x1=x1*Ras:y1=y1*Ras x2=x2*Ras:y2=y2*Ras x3=x3*Ras:y3=y3*Ras x4=x4*Ras:y4=y4*Ras For u#=0 To 1.1 Step .1 u2#=u#*u# u3#=u#*u#*u# f1#=-0.5*u3#+1.0*u2#-0.5*u# f2#= 1.5*u3#-2.5*u2#+1.0 f3#=-1.5*u3#+2.0*u2#+0.5*u# f4#= 0.5*u3#-0.5*u2# x=x1*f1#+x2*f2#+x3*f3#+x4*f4# y=y1*f1#+y2*f2#+y3*f3#+y4*f4# If ax<>x Or ay<>y Then Pos=BankSize(PfadBank):ResizeBank(PfadBank,Pos+4) PokeShort(PfadBank,Pos,x) PokeShort(PfadBank,Pos+2,y) EndIf ax=x:ay=y Next End Function Function UpdateTreffer() For tr.treffer=Each treffer f=tr\st/3 If f=9 Delete tr Else DrawImage treffer,tr\x-xback,tr\y-yback,f tr\st=tr\st+1 EndIf Next End Function |
||
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Fall das ein Ort nicht erreichbar ist ist der Worst Case für ein Pathfinding wie A*, denn hier muss der Algo erst mal alle Felder Ablaufen bevor er feststellt dass es kein Ziel gibt. Aufgrund der Arbeitsweise solcher lgos kannst Du das nicht verhindern. Was Du jedoch tun kannst - falls dein Spiel das zulässt, hier kommt es auf die Mechanik an, waäre die einzelnen, voneinander getrennten Bereiche in einem Layer deiner Map auch als getrennt zu kennzeichnen. Wenn dann eine Wegfindeanfrage kommt die in unterschiedlichen Zonen liegt kennt der Algo schon vorher das Ergebnis. So lassen sich auch Türen realisieren, indem Du eine liste anlegst die für jede Zonennummer die Türkoordinaten zu anderen Zonen enthält, kommt dann eine Suchanfrage wird der Zielpunkt auf die Tür gesetzt.
Was das laufen zum nächsten Punkt angeht ist das so dass Du in der Liste der bearbeiteten Knoten den mit der Geringsten Wegkostenschätzung nehmen kannst. Bessere Alternativen gibt es da nicht. Ich habe für BMax einen a* geschrieben, schau mal dort ins Codearchiv. Vielleicht bringt er dir was. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Baschdi |
![]() Antworten mit Zitat ![]() |
---|---|---|
thx ich habe zwar B3d aber ich schau ihn mir mal an. Das mit den türen klingt nach viel Arbeit für wenig Leistung, ich werde eine Alternative suchen...
danke für deine ideen |
||
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da es dir den worst case (kein Weg gefunden) im vorneherein erspart wird es unter Umständen massig Leistung bringen. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group