Hallo,
mal wieder eine C#-Frage von mir.
Ich habe mir nach Anleitung von
http://www.policyalmanac.org/games/a...torial_de.html aus einer A*-Klasse, die leider nicht funktionierte, selber was zusammengeschwartet... das allerdings nix findet, sprich endlos loopt.
Code:
FStartNode = AStartNode;
FGoalNode = AGoalNode;
FOpenList.Add(FStartNode); //FOpenList ist alway-sorted
while (FOpenList.Count > 0)
{
// Move best node to closed list
AStarNode NodeCurrent = (AStarNode)FOpenList.Pop();
FClosedList.Add(NodeCurrent);
// investigate Successors
ArrayList ASuccessors = new ArrayList(4);
NodeCurrent.GetSuccessors(ASuccessors);
foreach (AStarNode NodeSuccessor in ASuccessors)
{
//If Node is Goal, write path and leave
if (NodeSuccessor.IsSameState(FGoalNode))
{
FSolution.Clear();
AStarNode Node = NodeSuccessor;
while (Node != null)
{
FSolution.Insert(0, Node);
Node = Node.Parent;
}
FOpenList.Clear(); // to exit main loop
break;
}
//If Node in Closed List, we skip it
bool SkipNode = false;
foreach (AStarNode NodeClosed in FClosedList)
{
if (NodeClosed.IsSameState(NodeSuccessor)) //IsSameState überprüft, ob die Nodes den gleichen Ort haben
{
SkipNode = true;
break;
}
}
if (SkipNode)
continue;
//If Node in Open List and cost higher, change it, else skip it
AStarNode NodeOpen = null;
foreach (AStarNode N in FOpenList)
{
if (N.IsSameState(NodeSuccessor))
NodeOpen = N;
}
if (NodeOpen != null && NodeOpen.Cost > NodeSuccessor.Cost)
NodeOpen = NodeSuccessor;
else if (NodeOpen == null)
{
FOpenList.Add(NodeSuccessor);
}
}
}
}
Wäre vielleicht jemand so nett, das mal anzusehen und mir zu sagen, ob ich da Fehler drin hab?
EDIT: hach, das funzt ja sogar
kaum lässt mans mal 10 Minuten laufen....
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1