BWAPI
Public Member Functions
PathFinderClass Class Reference

#include <PathFinder.h>

List of all members.

Public Member Functions

BuildTilePath CreateTilePath (TilePosition start, TilePosition target, std::tr1::function< bool(TilePosition)> tileTest=DefaultTileTest(), std::tr1::function< int(TilePosition, TilePosition, int)> gFunction=DefaultGValue(), std::tr1::function< int(TilePosition, TilePosition)> hFunction=DefaultHValue(), int maxGValue=0, bool diaganol=false)
BuildTilePath CreateAdvancedFleePath (TilePosition start, const UnitGroup &enemies, bool stickToRegion=false)
RegionPath CreateRegionPath (Region start, Region target)
PositionPath CreateCheapWalkPath (Position start, Position target)
WalkPositionPath CreateWalkPath (WalkPosition start, WalkPosition target, std::tr1::function< bool(WalkPosition)> tileTest=DefaultWalkTest(), std::tr1::function< int(WalkPosition, WalkPosition, int)> gFunction=DefaultWalkGValue(), std::tr1::function< int(WalkPosition, WalkPosition)> hFunction=DefaultWalkHValue(), int maxGValue=0, bool diaganol=false)

Detailed Description

Definition at line 79 of file PathFinder.h.


Member Function Documentation

BuildTilePath PathFinderClass::CreateAdvancedFleePath ( TilePosition  start,
const UnitGroup enemies,
bool  stickToRegion = false 
)

Definition at line 138 of file PathFinder.cpp.

References CreateTilePath(), and BWAPI::TilePositions::None.

{
        return CreateTilePath(start, BWAPI::TilePositions::None, FleeTileTest(stickToRegion, start), FleeGValue(), FleeHValue(enemies), 20, false);
}

Here is the call graph for this function:

Definition at line 200 of file PathFinder.cpp.

References PositionPath::addNode(), BWAPI::Broodwar, CreateRegionPath(), RegionPath::drawPath(), Singleton< T >::Instance(), PositionPath::isComplete, RegionPath::isComplete, and PositionPath::path.

{
        if(!BWAPI::Broodwar->hasPath(start, target))
                return PositionPath();

        Region startRegion = TerrainAnaysis::Instance().getRegion(TilePosition(start));
        Region endRegion = TerrainAnaysis::Instance().getRegion(TilePosition(target));

        PositionPath path;

        if(startRegion == endRegion)
        {
                path.addNode(target);
                path.addNode(start);
                path.isComplete = true;

                return path;
        }

        RegionPath regionPath = CreateRegionPath(startRegion, endRegion);

        if(!regionPath.isComplete)
                return path;

        regionPath.drawPath();

        path.path.push_back(start);

        Region previousRegion;
        for each(Region region in regionPath.path)
        {
                if(previousRegion)
                {
                        for each(Chokepoint choke in region->getChokepoints())
                        {
                                if(choke->getRegions().first == previousRegion || choke->getRegions().second == previousRegion)
                                {
                                        path.path.push_back(choke->getCenter());
                                        break;
                                }
                        }
                }

                previousRegion = region;
        }

        path.path.push_back(target);
        path.isComplete = true;

        return path;
}

Here is the call graph for this function:

Definition at line 143 of file PathFinder.cpp.

References RegionPath::addNode(), Heap< Key, Val >::empty(), RegionPath::isComplete, Heap< Key, Val >::pop(), Heap< Key, Val >::push(), Heap< Key, Val >::set(), and Heap< Key, Val >::top().

Referenced by CreateCheapWalkPath().

{
        RegionPath path;

        Heap<Region, int> openRegions(true);
        std::map<Region, int> gmap;
        std::map<Region, Region> parent;
        std::set<Region> closedRegions;

        openRegions.push(std::make_pair(start, 0));
        gmap[start] = 0;
        parent[start] = start;

        while(!openRegions.empty())
        {
                Region region = openRegions.top().first;

                if(region == target)
                {
                        while(region != parent[region])
                        {
                                path.addNode(region);
                                region = parent[region];
                        }
                        path.addNode(start);
                        path.isComplete = true;
                        return path;
                }

                int gvalue = gmap[region];
                int fvalue = openRegions.top().second;

                openRegions.pop();
                closedRegions.insert(region);

                for each(Chokepoint choke in region->getChokepoints())
                {
                        Region other = choke->getRegions().first;
                        if(other == region)
                                other = choke->getRegions().second;

                        int g = gvalue + region->getCenter().getApproxDistance(other->getCenter());
                        int h = other->getCenter().getApproxDistance(target->getCenter());

                        int f = g + h;
                        if(gmap.count(other) == 0 || g < gmap.find(other)->second)
                        {
                                gmap[other] = g;
                                openRegions.set(other, f);
                                parent[other] = region;
                        }
                }
        }

        return path;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BuildTilePath PathFinderClass::CreateTilePath ( TilePosition  start,
TilePosition  target,
std::tr1::function< bool(TilePosition)>  tileTest = DefaultTileTest(),
std::tr1::function< int(TilePosition, TilePosition, int)>  gFunction = DefaultGValue(),
std::tr1::function< int(TilePosition, TilePosition)>  hFunction = DefaultHValue(),
int  maxGValue = 0,
bool  diaganol = false 
)

Definition at line 8 of file PathFinder.cpp.

References BuildTilePath::addNode(), BWAPI::Broodwar, Heap< Key, Val >::empty(), BuildTilePath::isComplete, BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), Heap< Key, Val >::pop(), Heap< Key, Val >::push(), Heap< Key, Val >::set(), Heap< Key, Val >::top(), BWAPI::TilePosition::x(), and BWAPI::TilePosition::y().

Referenced by CreateAdvancedFleePath().

{
        BuildTilePath path;

        Heap<TilePosition, int> openTiles(true);
        std::map<TilePosition, int> gmap;
        std::map<TilePosition, TilePosition> parent;
        std::set<TilePosition> closedTiles;

        openTiles.push(std::make_pair(start, 0));
        gmap[start] = 0;
        parent[start] = start;

        while(!openTiles.empty())
        {
                TilePosition p = openTiles.top().first;
                int gvalue = gmap[p];

                if(p == target || (maxGValue != 0 && gvalue >= maxGValue))
                        break;

                int fvalue = openTiles.top().second;
                
                openTiles.pop();
                closedTiles.insert(p);

                int minx = std::max(p.x() - 1, 0);
                int maxx = std::min(p.x() + 1, BWAPI::Broodwar->mapWidth());
                int miny = std::max(p.y() - 1, 0);
                int maxy = std::min(p.y() + 1, BWAPI::Broodwar->mapHeight());

                for(int x = minx; x <= maxx; x++)
                {
                        for(int y = miny; y <= maxy; y++)
                        {
                                if (x != p.x() && y != p.y() && !diaganol)
                                        continue;

                                TilePosition t(x, y);

                                if (closedTiles.find(t) != closedTiles.end())
                                        continue;

                                if(!tileTest(t))
                                        continue;

                                int g = gFunction(t, p, gvalue);

                                int f = g + hFunction(t, target);
                                if (gmap.find(t) == gmap.end() || g < gmap.find(t)->second)
                                {
                                        gmap[t] = g;
                                        openTiles.set(t, f);
                                        parent[t] = p;
                                }
                        }
                }
        }

        if(!openTiles.empty())
        {
                TilePosition p = openTiles.top().first;
                while(p != parent[p])
                {
                        path.addNode(p);
                        p = parent[p];
                }
                path.addNode(start);
                path.isComplete = true;
        }

        return path;
}

Here is the call graph for this function:

Here is the caller graph for this function:

WalkPositionPath PathFinderClass::CreateWalkPath ( WalkPosition  start,
WalkPosition  target,
std::tr1::function< bool(WalkPosition)>  tileTest = DefaultWalkTest(),
std::tr1::function< int(WalkPosition, WalkPosition, int)>  gFunction = DefaultWalkGValue(),
std::tr1::function< int(WalkPosition, WalkPosition)>  hFunction = DefaultWalkHValue(),
int  maxGValue = 0,
bool  diaganol = false 
)

Definition at line 252 of file PathFinder.cpp.

References BWAPI::Broodwar, Heap< Key, Val >::empty(), BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), Heap< Key, Val >::pop(), Heap< Key, Val >::push(), Heap< Key, Val >::set(), Heap< Key, Val >::top(), WalkPosition::x, and WalkPosition::y.

{
        WalkPositionPath path;

        Heap<WalkPosition, int> openTiles(false);
        std::map<WalkPosition, int> gmap;
        std::map<WalkPosition, WalkPosition> parent;
        std::set<WalkPosition> closedTiles;

        int mapWidth = BWAPI::Broodwar->mapWidth() * 4;
        int mapHeight = BWAPI::Broodwar->mapHeight() * 4;

        openTiles.push(std::make_pair(start, 0));
        gmap[start] = 0;
        parent[start] = start;

        while(!openTiles.empty())
        {
                WalkPosition p = openTiles.top().first;
                int gvalue = gmap[p];

                if(p == target || (maxGValue != 0 && gvalue >= maxGValue))
                        break;

                int fvalue = openTiles.top().second;

                openTiles.pop();
                closedTiles.insert(p);

                int minx = std::max(p.x - 1, 0);
                int maxx = std::min(p.x + 1, mapWidth);
                int miny = std::max(p.y - 1, 0);
                int maxy = std::min(p.y + 1, mapHeight);

                for(int x = minx; x <= maxx; x++)
                {
                        for(int y = miny; y <= maxy; y++)
                        {
                                if (x != p.x && y != p.y && !diaganol)
                                        continue;

                                WalkPosition t(x, y);

                                if(closedTiles.find(t) != closedTiles.end())
                                        continue;

                                if(!tileTest(t))
                                        continue;

                                int g = gFunction(t, p, gvalue);

                                int f = g + hFunction(t, target);
                                if (gmap.find(t) == gmap.end() || g < gmap.find(t)->second)
                                {
                                        gmap[t] = g;
                                        openTiles.set(t, f);
                                        parent[t] = p;
                                }
                        }
                }
        }

        for each(std::pair<WalkPosition, int> pos in gmap)
        {
//              DrawBuffer::Instance().drawBufferedLine(BWAPI::CoordinateType::Map, pos.first.x*8, pos.first.y*8, parent[pos.first].x*8, parent[pos.first].y*8, 999999);
//              String_Builder string;
//              string << pos.second;
//              DrawBuffer::Instance().drawBufferedText(BWAPI::CoordinateType::Map, pos.first.x * 8, pos.first.y * 8, string, 999999);
        }

        if(!openTiles.empty())
        {
                WalkPosition p = openTiles.top().first;
                while(p != parent[p])
                {
                        path.addNode(p);
                        p = parent[p];
                }
                path.addNode(start);
                path.isComplete = true;
        }

        return path;
}

Here is the call graph for this function:


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines