BWAPI
|
#include <PathFinder.h>
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) |
Definition at line 79 of file PathFinder.h.
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); }
PositionPath PathFinderClass::CreateCheapWalkPath | ( | Position | start, |
Position | target | ||
) |
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; }
RegionPath PathFinderClass::CreateRegionPath | ( | Region | start, |
Region | target | ||
) |
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; }
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; }
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; }