Exemplo n.º 1
0
    //Unfinished - commented out so it compiles

    public List <TerrainNode> AStar(int x0, int z0, int x1, int z1)
    {
        List <TerrainNode> closedset = new List <TerrainNode>();
        List <TerrainNode> openset   = new List <TerrainNode>();
        List <TerrainNode> camefrom  = new List <TerrainNode>();

        TerrainNode start = grid[x0, z0];
        TerrainNode goal  = grid[x1, z1];

        openset.Add(start);

        start.setGScore(0);
        start.setFScore(start.getGScore() + heuristic_cost_estimate(start, goal));

        //While not empty
        while (openset.Count != 0)
        {
            TerrainNode current = null;

            for (int i = 0; i < openset.Count; i++)
            {
                TerrainNode tn = openset[i];
                if (current == null || tn.getFScore() < current.getFScore())
                {
                    current = tn;
                }
            }

            if (current == goal)
            {
                return(reconstruct_path(camefrom, goal));
            }
            openset.Remove(current);
            closedset.Add(current);

            List <TerrainNode> neighbours = getNeighbours(current.getX(), current.getZ());

            for (int i = 0; i < neighbours.Count; i++)
            {
                if (closedset.Contains(neighbours[i]))
                {
                    continue;
                }

                int tenative_g_score = current.getGScore() + 1;

                if (!openset.Contains(neighbours[i]) || tenative_g_score < neighbours[i].getGScore())
                {
                    if (!closedset.Contains(neighbours[i]))
                    {
                        openset.Add(neighbours[i]);
                    }

                    neighbours[i].setCameFrom(current);
                    neighbours[i].setGScore(tenative_g_score);
                    neighbours[i].setFScore(neighbours[i].getGScore() + heuristic_cost_estimate(neighbours[i], goal));
                }
            }
        }
        return(null);
    }