C# AStar

Started by
1 comment, last by nickem 11 years, 9 months ago
[source lang="csharp"]while(openlist.Count > 0)
{
current_square = LowestF(openlist);
openlist.Remove(current_square);

closedlist.Add(current_square);

List<Node> path = new List<Node>();

if(current_square.x == end.x && current_square.y == end.y)
{

path.Clear();

do
{
if(current_square.tile != 100)
{
//current_square.tile = 199;
path.Add(current_square);
current_square = current_square.parent;
}

}while(current_square.x != start.x && current_square.y != start.y);

return path;
}

List<Node> sucessors = GetSucessors(current_square);

foreach(Node successor in sucessors)
{
if(closedlist.Contains(successor))
{
continue;
}

if(successor.tile == 100)
{
continue;
}

bool cornerwalkable = true;

if(cornerwalkable == true)
{
if(!openlist.Contains(successor))
{
if(successor.tile == 100)
continue;

successor.h = H(end.x, end.y,successor.x, successor.y);

int addedG = 0;

if(Math.Abs(successor.x - current_square.x) == 1 && Math.Abs(successor.y - current_square.y) == 1)
addedG = 14;
else
addedG = 10;

successor.g = current_square.g + addedG;
successor.f = successor.g + successor.h;
successor.parent = current_square;

openlist.Add(successor);
}
else
{
if(successor.tile == 100)
continue;

int addedG = 0;

if(Math.Abs(successor.x - current_square.x) == 1 && Math.Abs(successor.y - current_square.y) == 1)
addedG = 14;
else
addedG = 10;

int tempG = current_square.g + addedG;

if(tempG < successor.g)
{
successor.parent = current_square;
successor.g = tempG;
}
}

}[/source]

For some reason it's not returning the path everytime. It only happens when there's a wall in between the player and the destination node. The path is only the start node and end node which makes the player walk right through the wall. But most of the time it works. Ha! Cannot figure it out!
Advertisement
Assuming you're doing this for learning purposes, and not reusing an existing piece of code... My best advice is to write some unit tests incrementally and check all your assumptions. I've found that unit tests provide amazing support for learning new algorithms, languages, and writing new code in general :-)

I realize you wanted someone to debug your program but well... ;-)

Join us in Vienna for the nucl.ai Conference 2015, on July 20-22... Don't miss it!

No no no. I didn't want any one o debug it for me, being this is just learning... just maybe thought someone could see something I couldn't after staring at the darn thing for awhile. But I did figure it out:

Changed:
[source lang="csharp"]do
{
if(current_square.tile != 100)
{
//current_square.tile = 199;
path.Add(current_square);
current_square = current_square.parent;
}

}while(current_square.x != start.x && current_square.y != start.y);[/source]

To:
while(true)
{

if(current_square.x == start.x)
{
if(current_square.y == start.y)
return path;
}

path.Add(current_square);
current_square = current_square.parent;


}
[source lang="csharp"][/source]

And everything is working as it should! Thanks!

This topic is closed to new replies.

Advertisement