• Advertisement
Sign in to follow this  

C# AStar

This topic is 2032 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

[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!

Share this post


Link to post
Share on other sites
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... ;-)

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement