Salut, je travaille sur mon patfinthing depuis un moment est sa veut toujours pas marcher svp i need your help ^^'
voici mon code (c'est un a*)
et la class node
Help me T_T en analisant jai remarquer que la liste ouverte etait vide ce qui provoquait la fin de l'éxécutions
voici mon code (c'est un a*)
Code:
Public Class pathfinding
#Region "Declarations"
Dim NODE_DISTANCE_VALUE As Integer = 10
Dim m_openList As New List(Of Node)
Dim m_closeList As New List(Of Node)
#End Region
#Region "Metode"
Public Function findPath(ByVal param_graphe(,) As Node, ByVal param_start As Node, ByVal param_end As Node) As List(Of Node)
Dim finalPath As New List(Of Node)
addToOpenList(param_start)
Dim currentNode As Node = Nothing
While (m_openList.Count > 0) ' stopper la boucle si la liste ouverte est vide
' a. Récupération du node avec le plus petit F contenu dans la liste ouverte. On le nommera CURRENT.
currentNode = getCurrentNode(param_end)
' stopper la boucle si n ajoute le noeud d'arrivée à la liste fermée
If currentNode.col = param_end.col And currentNode.line = param_end.line Then
Exit While
End If
' b. Basculer CURRENT dans la liste fermée.
addToCloseList(currentNode)
Dim neighbours As List(Of Node) = getNeighbours(currentNode, param_graphe)
For i As Integer = 0 To neighbours.Count - 1
Dim node As Node = neighbours(i)
'Si le node est un obstacle ou est dans la liste fermée ignorez-le et passer à l'analyse d'un autre node.
If node.walkable = False Then
Continue For
End If
If isOnCloseList(node) Then
Continue For
End If
Dim newG As Integer = node.parent.G + NODE_DISTANCE_VALUE
Dim newH As Integer = (Math.Abs(param_end.line - node.line) + Math.Abs(param_end.col - node.col)) * NODE_DISTANCE_VALUE
Dim newF As Integer = newH + newG
If (isOnOpenList(node)) Then
If (newG < node.G) Then
node.parent = currentNode
node.G = newG
node.H = newH
node.F = newF
Else
addToOpenList(node)
node.parent = currentNode
node.G = newG
node.H = newH
node.F = newF
End If
End If
Next
End While
' on est sorti de la liste, on a deux solutions, soit la liste ouverte est vide dans ces cas là il
' n'y a pas de solutions et on retoure directement finalPath
If m_openList.Count = 0 Then
Return finalPath
End If
' Soit on maintenant on construit le chemin à rebours
Dim lastNode As Node = param_end
While lastNode IsNot param_start
finalPath.Add(lastNode)
lastNode = lastNode.parent
End While
' on retourne le chemin final
Return finalPath
End Function
Sub removeFromCloseList(ByVal param_node As Node)
m_closeList.Remove(param_node)
End Sub
Sub removeFromOpenLisC:\Users\asyai\Desktop\SlimeBot\Pathfindtinh\WindowsApplication1\pathfinding.vbt(ByVal param_node As Node)
m_openList.Remove(param_node)
End Sub
Sub addToCloseList(ByVal param_node As Node)
removeFromOpenList(param_node)
m_closeList.Add(param_node)
End Sub
Sub addToOpenList(ByVal param_node As Node)
removeFromCloseList(param_node)
m_openList.Add(param_node)
End Sub
Function getCurrentNode(paramend As Node) As Node
Dim tmpList As New List(Of Node)
Dim minF As Integer = 1000000
Dim curNode As Node = Nothing
For i As Integer = 0 To m_openList.Count - 1
Dim node As Node = m_openList(i)
If (node.F < minF) Then
minF = node.F
curNode = node
End If
Next
Return curNode
End Function
Function getNeighbours(ByVal param_node As Node, ByVal param_graphe(,) As Node) As List(Of Node)
Dim neighbours As New List(Of Node)
Dim maxcol As Integer = 10
Dim maxline As Integer = 10
' on calcule l'indice de la ligne au dessus de la ligne du node
Dim indiceUp As Integer = param_node.line - 1
' on calcule l'indice de la ligne au dessus de la ligne du node
Dim indiceBottom As Integer = param_node.line + 1
' on calcule l'indice de la colonne à gauche de la colonne du node
Dim indiceLeft As Integer = param_node.col - 1
' on calcule l'indice de la colonne à droite de la colonne du node
Dim indiceRight As Integer = param_node.col + 1
' si la ligne du dessus existe alors le node du dessus existe on ajoute alors le node du dessus
If indiceUp > -1 Then
neighbours.Add(param_graphe(indiceUp, param_node.col))
End If
' si la ligne du dessous existe alors le node du dessous existe on ajoute alors le node du dessous
If indiceBottom < maxline Then
neighbours.Add(param_graphe(indiceBottom, param_node.col))
End If
' si la colonne de gauche existe alors le node de gauche existe on ajoute alors le node de gauche
If indiceLeft > -1 Then
neighbours.Add(param_graphe(param_node.line, indiceLeft))
End If
' si la colonne de droite existe alors le node de droite existe on ajoute alors le node de droite
If indiceRight < maxcol Then
neighbours.Add(param_graphe(param_node.line, indiceRight))
End If
Return neighbours
End Function
Function isOnOpenList(param_node As Node) As Boolean
Dim ret As Boolean = False
For i As Integer = 0 To m_openList.Count - 1
If m_openList(i) = param_node Then
ret = True
End If
Next
Return ret
End Function
Function isOnCloseList(param_node As Node) As Boolean
For i As Integer = 0 To m_closeList.Count - 1
If m_closeList(i) = param_node Then
Return True
End If
Next
Return False
End Function
#End Region
#Region "Proprieter"
#End Region
End Class
Code:
Public Class Node
#Region "Declaration"
Dim m_parent As Node
Dim m_G, m_H, m_F As Integer
Dim m_col As Integer
Dim m_line As Integer
Dim m_walkable As Boolean
#End Region
#Region "Metode"
Sub New()
m_walkable = False
m_parent = Me
m_G = m_H = m_F = 0
End Sub
Sub New(ByVal col As Integer, ByVal line As Integer)
m_walkable = False
m_parent = Me
m_G = m_H = m_F = 0
m_col = col
m_line = line
End Sub
Public Function CalculeH(ByVal param_end As Node)
m_H = (Math.Abs(param_end.line - Me.line) + Math.Abs(param_end.col - Me.col)) * 10
Return m_H
End Function
Public Function CalculeG()
m_G = Me.parent.G + 10
Return m_G
End Function
Public Function CalculeF()
m_F = m_G + m_H
Return m_F
End Function
Public Sub Calcule(ByVal param_end As Node)
CalculeH(param_end)
CalculeG()
CalculeF()
End Sub
Shared Operator <>(ByVal valeur1 As Node, ByVal valeur2 As Node)
Dim ret As Boolean = False
If valeur1.col = valeur2.col And valeur2.line = valeur1.line Then
ret = True
End If
Return ret
End Operator
Shared Operator =(ByVal valeur1 As Node, ByVal valeur2 As Node)
Dim ret As Boolean = False
If valeur1.col = valeur2.col And valeur2.line = valeur1.line Then
ret = True
End If
Return ret
End Operator
#End Region
#Region "Proprieter"
Property parent As Node
Get
Return m_parent
End Get
Set(value As Node)
m_parent = value
End Set
End Property
Property G As Integer
Get
Return m_G
End Get
Set(value As Integer)
m_G = value
End Set
End Property
Property H As Integer
Get
Return m_H
End Get
Set(value As Integer)
m_H = value
End Set
End Property
Property F As Integer
Get
Return m_F
End Get
Set(value As Integer)
m_F = value
End Set
End Property
Property col As Integer
Get
col = m_col
End Get
Set(value As Integer)
m_col = value
End Set
End Property
Property line As Integer
Get
line = m_line
End Get
Set(value As Integer)
m_line = value
End Set
End Property
Property walkable
Get
walkable = m_walkable
End Get
Set(value)
m_walkable = value
End Set
End Property
#End Region
End Class