Pathfinding
Prikazujem rezultate 1 do 4 od 4

Tema: Pathfinding

  1. #1
    Ističe se AleX (avatar)
    Učlanjen
    21.07.2008.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    2.472
    Tekstova u blogu
    6
    Reputaciona moć
    60

    Podrazumevano Pathfinding

    Pravim jedan program. (već duže vreme)

    Želim da bude nešto slično, pa recimo isto programu za koji ću vam dati link.

    http://www.policyalmanac.org/games/AStar.zip (unutra su urađeni u c++ i blitz basic-u)

    Nemojte misliti da sam video program i da želim da prepišem kod, već sam odavno imao ideju i teškom mukom našao. Pre 3 meseca sam krenuo da tražim soluciju, ali nisam uspeo, kako ni na našim, tako ni na stranim forumima.

    Odlučih ja juče da postavim to opet, ali na stranom forumu...
    Neko od njih me je preusmerio i sada znam tačno o čemu se radi.

    Ja sam ustvari tražio pathfinding.

    Osnovao sam forum i jedan projekat je trebalo da bude na osnovu toga, ali nismo uspeli...
    Našao sam tutorijal. To je neko objašnjenje kako napraviti to što treba, ali ne znam kako to da pretočim u kod jer nisu se bavili toliko jednim jezikom, već sa opšte programskog gledišta... Sa tog sajta sam našao, dakle, program u c++-u (valjda) i u blitz basic-u (nikad ranije čuo).

    Tutorijal http://www.policyalmanac.org/games/aStarTutorial.htm

    Molim vas da skinete sa neta onaj program da biste videli o čemu se radi.
    Moj program bi radio skoro isto, s tim što ne bi pokazivao F, G i H (onaj koji bude pročitao tutorijal, zna o čemu se radi) i grafika bi bila totalno drugačija.

    Potrebno mi je da neko od vas napravi takav program jer ja stvarno ne znam niti odakle da počnem, ni po kom principu da radim, niti ostalo.

    Pomoglo bi mi i da napišete korake, ali što detaljniji budu, to će mi biti lakše da sam pravim (ako već nećete da ga pravite).

    Kao što već rekoh, ima i neki primer u blitz basic-u. Da biste videli kod, možete ih otvoriti i pomoću notepada. Ako ste imali iskustva sa basic-om, snaći ćete se.

    Da napomenem da mi je ovo potrebno u Visual Basic 2008.

    Nadam se da ne tražim mnogo i da ne izgleda da dajem prohteve i čekam na gotovo, ali stvarno sam uložio dosta sebe u ovo, pa želim da vidim rezultat.

    P.S. Hvala na čitanju ovog podugačkog texta/molbe.

    Let me hear your thoughts.



  2. #2
    Ističe se AleX (avatar)
    Učlanjen
    21.07.2008.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    2.472
    Tekstova u blogu
    6
    Reputaciona moć
    60

    Podrazumevano Re: Pathfinding

    Izgleda da ću ovog puta sam sebi da dam reputaciju

    Našao sam to što mi je potrebno.

    Posle ću izvaditi kod i predati ga ovde.


    http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=923&lngWId=10

    To je u VB 2008.
    Poslednji put ažurirao/la AleX : 10.11.2009. u 23:44
    Let me hear your thoughts.

  3. #3
    Ističe se AleX (avatar)
    Učlanjen
    21.07.2008.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    2.472
    Tekstova u blogu
    6
    Reputaciona moć
    60

    Podrazumevano Re: Pathfinding

    Srž nađena.

    Kod je dug, pa sam ga stavio pod spoiler.

    Kod:
     Private Sub FindPath()
            Dim xCnt, yCnt As Int16
    
            'Make sure the starting point and ending point are not the same
            If (StartX = EndX) And (StartY = EndY) Then Exit Sub
    
            'Make sure the starting point is not a wall
            If Map(StartX, StartY).Wall Then Exit Sub
            If Map(EndX, EndY).Wall Then Exit Sub
    
            'Set the flags
            PathFound = False
            PathHunt = True
    
            'Put the starting point on the open list
            Map(StartX, StartY).OCList = inOpened
            Heap.Add(0, StartX, StartY)
    
            'Find the children
            While PathHunt
                If Heap.Count <> 0 Then
                    'Get the parent node
                    ParentX = Heap.GetX
                    ParentY = Heap.GetY
    
                    'Remove the root
                    Map(ParentX, ParentY).OCList = inClosed
                    Heap.RemoveRoot()
    
                    'Find the available children to add to the open list
                    For yCnt = (ParentY - 1) To (ParentY + 1)
                        For xCnt = (ParentX - 1) To (ParentX + 1)
    
                            'Make sure we are not out of bounds
                            If xCnt <> -1 And xCnt <> 25 And yCnt <> -1 And yCnt < 25 Then
    
                                'Make sure it's not on the closed list
                                If Map(xCnt, yCnt).OCList <> inClosed Then
    
                                    'Make sure no wall
                                    If Map(xCnt, yCnt).Wall = False Then
    
                                        'Don't cut across corners
                                        Dim CanWalk As Boolean = True
                                        If xCnt = ParentX - 1 Then
                                            If yCnt = ParentY - 1 Then
                                                If Map(ParentX - 1, ParentY).Wall = True Or Map(ParentX, ParentY - 1).Wall = True Then CanWalk = False
                                            ElseIf yCnt = ParentY + 1 Then
                                                If Map(ParentX, ParentY + 1).Wall = True Or Map(ParentX - 1, ParentY).Wall = True Then CanWalk = False
                                            End If
                                        ElseIf xCnt = ParentX + 1 Then
                                            If yCnt = ParentY - 1 Then
                                                If Map(ParentX, ParentY - 1).Wall = True Or Map(ParentX + 1, ParentY).Wall = True Then CanWalk = False
                                            ElseIf yCnt = ParentY + 1 Then
                                                If Map(ParentX + 1, ParentY).Wall = True Or Map(ParentX, ParentY + 1).Wall = True Then CanWalk = False
                                            End If
                                        End If
    
                                        'If we can move this way
                                        If CanWalk = True Then
                                            If Map(xCnt, yCnt).OCList <> inOpened Then
    
                                                'Calculate the GCost
                                                If Math.Abs(xCnt - ParentX) = 1 And Math.Abs(yCnt - ParentY) = 1 Then
                                                    Map(xCnt, yCnt).GCost = Map(ParentX, ParentY).GCost + 14
                                                Else
                                                    Map(xCnt, yCnt).GCost = Map(ParentX, ParentY).GCost + 10
                                                End If
    
                                                'Calculate the HCost
                                                Map(xCnt, yCnt).HCost = 10 * (Math.Abs(xCnt - EndX) + Math.Abs(yCnt - EndY))
                                                Map(xCnt, yCnt).FCost = (Map(xCnt, yCnt).GCost + Map(xCnt, yCnt).HCost)
    
                                                'Add the parent value
                                                Map(xCnt, yCnt).ParentX = ParentX
                                                Map(xCnt, yCnt).ParentY = ParentY
    
                                                'Add the item to the heap
                                                Heap.Add(Map(xCnt, yCnt).FCost, xCnt, yCnt)
    
                                                'Add the item to the open list
                                                Map(xCnt, yCnt).OCList = inOpened
    
                                            Else
                                                'We will check for better value
                                                Dim AddedGCost As Int16
                                                If Math.Abs(xCnt - ParentX) = 1 And Math.Abs(yCnt - ParentY) = 1 Then
                                                    AddedGCost = 14
                                                Else
                                                    AddedGCost = 10
                                                End If
                                                Dim tempCost As Int16 = Map(ParentX, ParentY).GCost + AddedGCost
    
                                                If tempCost < Map(xCnt, yCnt).GCost Then
                                                    Map(xCnt, yCnt).GCost = tempCost
                                                    Map(xCnt, yCnt).ParentX = ParentX
                                                    Map(xCnt, yCnt).ParentY = ParentY
                                                    If Map(xCnt, yCnt).OCList = inOpened Then
                                                        Dim NewCost As Int16 = Map(xCnt, yCnt).HCost + Map(xCnt, yCnt).GCost
                                                        Heap.Add(NewCost, xCnt, yCnt)
                                                    End If
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        Next
                    Next
                Else
                    PathFound = False
                    PathHunt = False
                    Exit Sub
                End If
    
                'If we find a path
                If Map(EndX, EndY).OCList = inOpened Then
                    PathFound = True
                    PathHunt = False
                End If
    
            End While
    
            If PathFound Then
                Dim tX As Int16 = EndX
                Dim tY As Int16 = EndY
                Map(tX, tY).DrawPath = True
                While True
                    Dim sX As Int16 = Map(tX, tY).ParentX
                    Dim sY As Int16 = Map(tX, tY).ParentY
                    Map(sX, sY).DrawPath = True
                    tX = sX
                    tY = sY
                    If tX = StartX And tY = StartY Then Exit While
                End While
    
                Render()
    
            End If
    
        End Sub
    Let me hear your thoughts.

  4. #4
    Ističe se AleX (avatar)
    Učlanjen
    21.07.2008.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    2.472
    Tekstova u blogu
    6
    Reputaciona moć
    60

    Podrazumevano Re: Pathfinding

    Molim sve da komentarišu one delove koda koji su im poznati.

    Da se ne bi vadilo odatle, citirajte pod spoiler tagovima.
    Let me hear your thoughts.

Pravila za slanje poruka

  • Ne možete kreirati novu temu
  • Ne možete poslati odgovor
  • Ne možete dodati priloge
  • Ne možete prepraviti svoju poruku
  •