[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]


  • Страница 1 из 1
  • 1
Модератор форума: Spidy, blitz3d  
Форум мира Blitz3D » Язык Blitz3D » 2D программирование » Алгоритм поиска пути Astar
Алгоритм поиска пути Astar
Feder@lДата: Воскресенье, 05.06.2011, 16:20 | Сообщение # 1
ламер
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
Code

Astar()
While Not KeyDown(1)
   
  Flip
Wend

Function Astar()
  zakrito(xob,yob)=2
  While Not Target=1
   For i=-1 To 1
    For e=-1 To 1
     If zakrito(xob,yob)=2  And zakrito(xob+i,yob+e)<>1 And zakrito(xob+i,yob+e)<>2  
      zakrito(xob+i,yob+e)=2  
      v=v+1
      OpenX(v)=xob+i
      OpenY(v)=yob+e
      If i<>0 And e<>0 Then
       k#=1.2
      Else
       k#=1
      EndIf
      shagi#(xob+i,yob+e)=shagi(xob,yob)+k#
      Dist=Sqr((xob+i-xcel)^2+(yob+e-ycel) ^2)
      distancia(xob+i,yob+e)=dist+shagi(xob+i,yob+e)
      dorogaX(xob+i,yob+e)=xob
      dorogaY(xob+i,yob+e)=yob
      If Dist<2 Then  
       Target=1
       xob=xob+i
       yob=yob+i
       Goto Astarstop
      EndIf
     EndIf
    Next
   Next
   zakrito(xob,yob)=1
   min = 90000
   fuck=v
   For r=1 To fuck
    d=OpenX(r)
    f=OpenY(r)
    If distancia(d,f)=<min Then
     min=distancia(d,f)
     vmin=r
     xob=d
     yob=f
    EndIf
   Next
   OpenX(vmin)=OpenX(v)
   OpenY(vmin)=OpenY(v)
   v=v-1
   I f min=90000 Then Goto netputi
  Wend
  .Astarstop
  celx=xob
  cely=yob
  While Not Star=1
   setka$=celx+":"+cely+"|"+setka$
   faktorx= dorogaX(celx,cely)
   faktory= dorogaY(celx,cely)
   celx=faktorx
   cely=faktory
   If celx=xstart And cely=ystart Then  
    Star=1
   EndIf
  Wend
  .netputi
End Function

В некоторых случаях что то несклеивается и программа зависает
 
SpidyДата: Понедельник, 06.06.2011, 11:11 | Сообщение # 2
Полковник
Группа: Модераторы
Сообщений: 339
Награды: 6
Репутация: 13
Статус: Offline
Я навоял небольшой циклик на базе предложенного куска кода

Code
Dim zakrito(100,100)
Global xob=5,yob=5

Astar()
While Not KeyDown(1)
     
   Flip
Wend

Function Astar()
   zakrito(xob,yob)=2
   While Not Target=1
    For i=-1 To 1
     For e=-1 To 1

  vx=vx+1
  vy=vy+1
  If vx>300 Then vx=1
  If vy>250 Then vy=1

  Color vx,vx,vy
  Text vx,vy,"sssssssssss"
   
     If zakrito(xob,yob)=2  And zakrito(xob+i,yob+e)<>1 And zakrito(xob+i,yob+e)<>2   
       zakrito(xob+i,yob+e)=2   
       v=v+1

       If i<>0 And e<>0 Then
        k#=1.2
       Else
        k#=1
       EndIf

       Dist=Sqr((xob+i-xcel)^2+(yob+e-ycel) ^2)

       If Dist<2 Then   
        Target=1
        xob=xob+i
        yob=yob+i
        Goto Astarstop
       EndIf
      EndIf
     Next
    Next
    zakrito(xob,yob)=1
    min = 90000
    fuck=v
    v=v-1
   Wend
   .Astarstop
   celx=xob
   cely=yob
   While Not Star=1
    setka$=celx+":"+cely+"|"+setka$
    celx=faktorx
    cely=faktory
    If celx=xstart And cely=ystart Then   
     Star=1
    EndIf
   Wend
   .netputi
End Function


Запускал несколько раз - ни разу не зависло.
Возможно, проблема с переменными, они могут выскакивать из допустимого диапазона.

Желательно выложи весь код и попробуй вывести на экран все переменные, чтобы проверить значения если все зависнет


Компьютерная мышь ночью собирает крошки у тебя со стола и прячет их в клавиатуру, делает запасы на зиму
 
Форум мира Blitz3D » Язык Blitz3D » 2D программирование » Алгоритм поиска пути Astar
  • Страница 1 из 1
  • 1
Поиск: