Advertisement
Guest User

A*

a guest
Oct 4th, 2012
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.   Private Structure Node
  2.  
  3.         Dim NodeX, NodeY As Integer 'the location of this node
  4.        Dim ParentX, ParentY As Integer 'the location of this nodes parent
  5.        Dim F, G, H As Integer
  6.  
  7.         Sub Clear()
  8.             NodeX = 0
  9.             NodeY = 0
  10.             ParentX = 0
  11.             ParentY = 0
  12.             F = 0
  13.             G = 0
  14.             H = 0
  15.         End Sub
  16.  
  17.         Sub GetScores(TargetX As Integer, TargetY As Integer)
  18.  
  19.             Dim dx, dy As Integer
  20.  
  21.             dx = NodeX - ParentX
  22.             dy = NodeY - ParentY
  23.  
  24.             If dx = 1 And dy <> NodeY Then
  25.                 G = 14
  26.             ElseIf dx = -1 And dy <> NodeY Then
  27.                 G = 14
  28.             Else
  29.                 G = 10
  30.             End If
  31.  
  32.             dx = Math.Abs(TargetX - NodeX)
  33.             dy = Math.Abs(TargetY - NodeY)
  34.  
  35.             H = (dx + dy) * 10
  36.  
  37.             F = G + H
  38.  
  39.         End Sub
  40.  
  41.  
  42.     End Structure
  43.  
  44.     Private OpenList(0 To 10) As Node
  45.     Private ClosedList(0 To 50) As Node
  46.  
  47.     Public Sub Path(StartX As Integer, StartY As Integer, _
  48.                     EndX As Integer, EndY As Integer)
  49.  
  50.         Dim CurrentX, CurrentY As Integer
  51.         Dim TempNode As New Node
  52.  
  53.         CurrentX = StartX
  54.         CurrentY = StartY
  55.  
  56.         With TempNode
  57.             .NodeX = StartX
  58.             .NodeY = StartY
  59.             .ParentX = StartX
  60.             .ParentY = StartY
  61.             .GetScores(EndX, EndY)
  62.         End With
  63.  
  64.         ClosedList(0) = TempNode
  65.  
  66.  
  67.         Do While True
  68.  
  69.             If CurrentX = EndX And CurrentY = EndY Then
  70.  
  71.         'debugging : write the values of all nodes in ClosedList
  72.                For intz = 0 To 50
  73.                     If Not IsNothing(ClosedList(intz)) Then
  74.  
  75.                         Write((intz + 2) * 2, 2, ClosedList(intz).NodeX, ConsoleColor.Green)
  76.                         Write((intz + 3) * 2, 2, ClosedList(intz).NodeY, ConsoleColor.Green)
  77.  
  78.                         Write((intz + 5) * 2, 2, ClosedList(intz).ParentX, ConsoleColor.Green)
  79.                         Write((intz + 6) * 2, 2, ClosedList(intz).ParentY, ConsoleColor.Green)
  80.  
  81.                         Write((intz + 8) * 2, 2, ClosedList(intz).F, ConsoleColor.Green)
  82.  
  83.                     End If
  84.                 Next
  85.  
  86.             Else
  87.  
  88.                 AddNeighbors(CurrentX, CurrentY, EndX, EndY)
  89.  
  90.                 'find the last cell added to the closed list
  91.                For intz = 0 To 50
  92.                     If Not IsNothing(ClosedList(intz)) Then
  93.                         CurrentX = ClosedList(intz).NodeX
  94.                         CurrentY = ClosedList(intz).NodeY
  95.                     End If
  96.                 Next
  97.  
  98.             End If
  99.  
  100.         Loop
  101.  
  102.  
  103.     End Sub
  104.  
  105.     'this actually does all the work
  106.    Public Sub AddNeighbors(X As Integer, y As Integer, TargetX As Integer, TargetY As Integer)
  107.  
  108.         Dim TempNode As New Node
  109.         Dim LowNode As New Node
  110.  
  111.  
  112.         For intx = -1 To 1
  113.             For inty = -1 To 1
  114.  
  115.                 If Not (X + intx) < 0 Then
  116.                     If Not (y + inty) < 0 Then
  117.  
  118.                         'set stats
  119.                        TempNode.NodeX = X + intx
  120.                         TempNode.NodeY = y + inty
  121.                         TempNode.ParentX = X
  122.                         TempNode.ParentY = y
  123.  
  124.                         TempNode.GetScores(TargetX, TargetY)
  125.  
  126.                         'add to the next open spot
  127.                        For intz = 0 To 10
  128.                             If IsNothing(OpenList(intz)) Then
  129.                                 OpenList(intz) = TempNode
  130.                                 Console.Title = intz
  131.                             End If
  132.                         Next
  133.  
  134.                         LowNode.F = 9999
  135.                         LowNode.G = 9999
  136.                         LowNode.H = 9999
  137.  
  138.                         'find the lowest
  139.                        For intz = 0 To UBound(OpenList)
  140.                             If OpenList(intz).F < LowNode.F Then
  141.                                 LowNode = OpenList(intz)
  142.                             End If
  143.                         Next
  144.  
  145.                         'add to the closed list
  146.                        For intz = 0 To UBound(ClosedList)
  147.                             If IsNothing(ClosedList(intz)) Then
  148.                                 ClosedList(intz) = LowNode
  149.                             End If
  150.                         Next
  151.  
  152.                         For intz = 0 To UBound(OpenList)
  153.                             If IsNothing(OpenList(intz)) Then
  154.                                 OpenList(intz).Clear()
  155.                             End If
  156.                         Next
  157.  
  158.                     End If
  159.                 End If
  160.  
  161.             Next
  162.         Next
  163.  
  164.  
  165.     End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement