BWAPI
|
00001 #pragma once 00002 00003 #include "Interface.h" 00004 00005 #include "Singleton.h" 00006 #include "BuildTilePath.h" 00007 #include "PositionPath.h" 00008 #include "RegionPath.h" 00009 #include "WalkPositionPath.h" 00010 #include "UnitGroup.h" 00011 #include "BuildingPlacer.h" 00012 00013 class DefaultGValue 00014 { 00015 public: 00016 int operator()(TilePosition currentTile, TilePosition previousTile, int gTotal) 00017 { 00018 gTotal += 10; 00019 if (currentTile.x() != previousTile.x() && currentTile.y() != previousTile.y()) 00020 gTotal += 4; 00021 00022 return gTotal; 00023 } 00024 }; 00025 00026 class DefaultWalkGValue 00027 { 00028 public: 00029 int operator()(WalkPosition currentTile, WalkPosition previousTile, int gTotal) 00030 { 00031 gTotal += 10; 00032 if (currentTile.x != previousTile.x && currentTile.y != previousTile.y) 00033 gTotal += 4; 00034 00035 return gTotal; 00036 } 00037 }; 00038 00039 class DefaultHValue 00040 { 00041 public: 00042 int operator()(TilePosition position, TilePosition target) 00043 { 00044 int dx = abs(position.x() - target.x()); 00045 int dy = abs(position.x() - target.y()); 00046 return abs(dx - dy) * 10 + std::min(dx, dy) * 14; 00047 } 00048 }; 00049 00050 class DefaultWalkHValue 00051 { 00052 public: 00053 int operator()(WalkPosition position, WalkPosition target) 00054 { 00055 int dx = abs(position.x - target.x); 00056 int dy = abs(position.x - target.y); 00057 return abs(dx - dy) * 10 + std::min(dx, dy) * 14; 00058 } 00059 }; 00060 00061 class DefaultTileTest 00062 { 00063 public: 00064 bool operator()(TilePosition position) 00065 { 00066 return BuildingPlacer::Instance().isTileWalkable(position); 00067 } 00068 }; 00069 00070 class DefaultWalkTest 00071 { 00072 public: 00073 bool operator()(WalkPosition position) 00074 { 00075 return BWAPI::Broodwar->isWalkable(position.x, position.y); 00076 } 00077 }; 00078 00079 class PathFinderClass 00080 { 00081 public: 00082 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); 00083 BuildTilePath CreateAdvancedFleePath(TilePosition start, const UnitGroup &enemies, bool stickToRegion = false); 00084 00085 RegionPath CreateRegionPath(Region start, Region target); 00086 00087 PositionPath CreateCheapWalkPath(Position start, Position target); 00088 00089 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); 00090 }; 00091 00092 typedef Singleton<PathFinderClass> PathFinder;