I'm near done with my first A* test. But this dang bug won't leave me alone! After much testing, I have found that the potentialnodes (surrounding 8 nodes to be checked) are not being created. Any ideas? (sorry about those long spots in the code screwing up the window)
Graphics3D 1280, 1024, 32, 1
Const gridscale = 1
Global goalx, goaly, startx, starty
Global currentx, currenty
Global lf = 10000000000
startx = 2
starty = 2
currentx = startx
currenty = starty
goalx = 5
goaly = 6
Type goodnode
Field x
Field y
Field open = False
End Type
Type badnode
Field x
Field y
End Type
Type potentialnode
Field x
Field y
Field g
Field h
Field lf
End Type
setupgrid()
While Not KeyHit(1)
Cls()
RenderWorld()
drawgrid()
If KeyDown(29) Then
Stop
EndIf
If KeyHit(57) Then updatepath()
Flip()
Wend
End
Function setupgrid()
For w = 0 To GraphicsWidth()-(gridscale*100) Step gridscale*100
For h = 0 To GraphicsHeight()-(gridscale*100) Step gridscale*100
node.goodnode = New goodnode
node\x = w
node\y = h
Next
Next
End Function
Function drawgrid()
Color 0, 0, 200
For node.goodnode = Each goodnode
Rect node\x, node\y, gridscale*100, gridscale*100, 0
Next
Color 255, 255, 255
End Function
;g = 10 if vertical or horizontal
;g = 14 if diagonal
;h = 10*(abs(currentx - goalx) + abs(currenty - goaly))
Function updatepath()
Repeat
If KeyHit(29) Then Stop
Text 0, 0, currentx + ", " + currenty + ", " + Rnd(0, 100)
;find the surrounding 8 nodes and replace them with potentialnodes (closing the normal ones)
For node.goodnode = Each goodnode
If ((node\x = currentx - 1) And (node\y = currenty)) Or ((node\x = currentx) + 1 And (node\y = currenty)) Or ((node\y = currenty - 1) And (node\x = currentx)) Or ((node\y = currenty + 1) And (node\x = currentx)) Then
pnode.potentialnode = New potentialnode
pnode\x = node\x
pnode\y = node\y
pnode\g = 10
node\open = False
EndIf
If ((node\x = currentx + 1) And (node\y = currenty + 1)) Or ((node\x = currentx + 1) And (node\y = currenty - 1)) Or ((node\x = currentx - 1) And (node\y = currenty + 1)) Or ((node\x = currentx - 1) And (node\y = currenty - 1)) Then
pnode.potentialnode = New potentialnode
pnode\x = node\x
pnode\y = node\y
pnode\g = 14
node\open = False
EndIf
Next
;determine h, f (g was found above), and lf(lowest f)
For pnode.potentialnode = Each potentialnode
pnode\h = 10 * (Abs(currentx - goalx) + Abs(currenty - goaly))
If pnode\h + pnode\g < lf Then
lf = pnode\h + pnode\g
pnode\lf = True
EndIf
n = n + 1
Next
Text 0, 20, n
n=0
;delete all potentialnodes, open up the closed nodes, and set currentx and y to the location of the lowest f
For node.goodnode = Each goodnode
If ((node\x = currentx - 1) And (node\y = currenty)) Or ((node\x = currentx) + 1 And (node\y = currenty)) Or ((node\y = currenty - 1) And (node\x = currentx)) Or ((node\y = currenty + 1) And (node\x = currentx)) Then node\open = True
Next
For pnode.potentialnode = Each potentialnode
If pnode\lf = True Then
currentx = pnode\x
currenty = pnode\y
Stop
EndIf
Delete pnode
Next
Flip()
Until currentx = goalx And currenty = goaly Or KeyHit(1)
End Function
any help is greatly appreciated, I'll be debugging while i wait for a response to tell me that it was a typo. Thanks for helping me get to sleep! (I'll have trouble sleeping until this works)
|