Esempio n. 1
0
 void calculate_walk_distances_area(const BWAPI::Position& start
                                    , int width
                                    , int height
                                    , int max_distance
                                    , RectangleArray<int>& distance_map)
 {
     Heap<BWAPI::Position, int> heap(true);
     for (unsigned int x = 0;x < distance_map.getWidth();x++) {
         for (unsigned int y = 0;y < distance_map.getHeight();y++) {
             distance_map[x][y] = -1;
         }
     }
     int sx = (int)start.x();
     int sy = (int)start.y();
     for (int x = sx;x < sx + width;x++) {
         for (int y = sy;y < sy + height;y++) {
             heap.push(std::make_pair(BWAPI::Position(x, y), 0));
             distance_map[x][y] = 0;
         }
     }
     while (!heap.empty()) {
         BWAPI::Position pos = heap.top().first;
         int distance = heap.top().second;
         heap.pop();
         int x = (int)pos.x();
         int y = (int)pos.y();
         if (distance > max_distance && max_distance > 0)
             break;
         int min_x = max(x - 1, 0);
         int max_x = min(x + 1, BWAPI::Broodwar->mapWidth() * 4 - 1);
         int min_y = max(y - 1, 0);
         int max_y = min(y + 1, BWAPI::Broodwar->mapHeight() * 4 - 1);
         for (int ix = min_x;ix <= max_x;ix++) {
             for (int iy = min_y;iy <= max_y;iy++) {
                 int f = abs(ix - x) * 10 + abs(iy - y) * 10;
                 if (f > 10) {
                     f = 14;
                 }
                 int v = distance + f;
                 if (distance_map[ix][iy] > v) {
                     heap.set(BWAPI::Position(x, y), v);
                     distance_map[ix][iy] = v;
                 } else {
                     if (distance_map[ix][iy] == -1 && MapData::rawWalkability[ix][iy] == true) {
                         distance_map[ix][iy] = v;
                         heap.push(std::make_pair(BWAPI::Position(ix, iy), v));
                     }
                 }
             }
         }
     }
 }
Esempio n. 2
0
 void getGroundWalkDistanceMap(int walkx, int walky, RectangleArray<double>& distanceMap)
 {
   distanceMap.resize(BWAPI::Broodwar->mapWidth()*4,BWAPI::Broodwar->mapHeight()*4);
   Heap< BWAPI::TilePosition , int > heap(true);
   for(unsigned int x=0;x<distanceMap.getWidth();x++)
   {
     for(unsigned int y=0;y<distanceMap.getHeight();y++)
     {
       distanceMap[x][y]=-1;
     }
   }
   BWAPI::TilePosition start(walkx,walky);
   heap.push(std::make_pair(start,0));
   int sx=(int)start.x();
   int sy=(int)start.y();
   distanceMap[sx][sy]=0;
   while (!heap.empty()) {
     BWAPI::TilePosition pos=heap.top().first;
     int distance=heap.top().second;
     heap.pop();
     int x=(int)pos.x();
     int y=(int)pos.y();
     int min_x=max(x-1,0);
     int max_x=min(x+1,distanceMap.getWidth()-1);
     int min_y=max(y-1,0);
     int max_y=min(y+1,distanceMap.getHeight()-1);
     for(int ix=min_x;ix<=max_x;ix++)
     {
       for(int iy=min_y;iy<=max_y;iy++)
       {
         int f=abs(ix-x)*32+abs(iy-y)*32;
         if (f>32) {f=45;}
         if (MapData::walkability[ix][iy]==false)
           f+=100000;
         int v=distance+f;
         if (distanceMap[ix][iy]>v)
         {
           heap.set(BWAPI::TilePosition(x,y),v);
           distanceMap[ix][iy]=v;
         } else {
           if (distanceMap[ix][iy]==-1)
           {
             distanceMap[ix][iy]=v;
             heap.push(std::make_pair(BWAPI::TilePosition(ix,iy),v));
           }
         }
       }
     }
   }
 }
Esempio n. 3
0
 void calculate_walk_distances(const RectangleArray<bool>& read_map
                               , const BWAPI::Position& start
                               , int max_distance
                               , RectangleArray<int>& distance_map)
 {
     Heap<BWAPI::Position, int> heap(true);
     for (unsigned int x = 0;x < distance_map.getWidth();x++) {
         for (unsigned int y = 0;y < distance_map.getHeight();y++) {
             distance_map[x][y] = -1;
         }
     }
     heap.push(std::make_pair(start, 0));
     int sx = (int)start.x();
     int sy = (int)start.y();
     distance_map[sx][sy] = 0;
     while (!heap.empty()) {
         BWAPI::Position pos = heap.top().first;
         int distance = heap.top().second;
         heap.pop();
         int x = (int)pos.x();
         int y = (int)pos.y();
         if (distance > max_distance && max_distance > 0)
             break;
         int min_x = max(x - 1, 0);
         int max_x = min(x + 1, read_map.getWidth() - 1);
         int min_y = max(y - 1, 0);
         int max_y = min(y + 1, read_map.getHeight() - 1);
         for (int ix = min_x;ix <= max_x;ix++) {
             for (int iy = min_y;iy <= max_y;iy++) {
                 int f = abs(ix - x) * 10 + abs(iy - y) * 10;
                 if (f > 10) {
                     f = 14;
                 }
                 int v = distance + f;
                 if (distance_map[ix][iy] > v) {
                     heap.set(BWAPI::Position(x, y), v);
                     distance_map[ix][iy] = v;
                 } else {
                     if (distance_map[ix][iy] == -1 && read_map[ix][iy] == true) {
                         distance_map[ix][iy] = v;
                         heap.push(std::make_pair(BWAPI::Position(ix, iy), v));
                     }
                 }
             }
         }
     }
 }
Esempio n. 4
0
 //----------------------------------------------------------------------------------------------------------
 void Strings::makeWindow(RectangleArray<char>& input, 
                          unsigned int x, 
                          unsigned int y, 
                          unsigned int width, 
                          unsigned int height, 
                          unsigned int frameType)
 {
   for (unsigned int i = x + 1; i < x + width - 1 && x < input.getWidth(); i++)
   {
     input[i][y] = Strings::FrameCharacters[frameType][0];
     input[i][y + height - 1] = Strings::FrameCharacters[frameType][0];
   }
   
   for (unsigned int i = y + 1; i < y + height - 1 && y < input.getHeight(); i++)
   {
     input[x][i] = Strings::FrameCharacters[frameType][1];
     input[x + width - 1][i] = Strings::FrameCharacters[frameType][1];
   }
   input[x][y] = Strings::FrameCharacters[frameType][2];
   input[x + width - 1][y] = Strings::FrameCharacters[frameType][3];
   input[x][y + height - 1] = Strings::FrameCharacters[frameType][4];
   input[x + width - 1][y + height- 1] = Strings::FrameCharacters[frameType][5];
 }
Esempio n. 5
0
  //----------------------------------------------------------------------------------------------------------
  RectangleArray<char> Strings::makeBorder(const RectangleArray<char>& input, bool coordinates)
  {
    int leftBorder = (int)log10((float)input.getHeight()) + 2;
    int topBorder = 3;
    RectangleArray<char> returnValue = RectangleArray<char>(input.getWidth() + leftBorder*2, input.getHeight() + topBorder*2);
    for (unsigned int x = 0; x < returnValue.getWidth(); x++)
      for (unsigned int y = 0; y < returnValue.getHeight(); y++)  
        returnValue[x][y] = ' ';
    Strings::makeWindow(returnValue,
                        leftBorder - 1, 
                        topBorder - 1,
                        input.getWidth() + 2, 
                        input.getHeight() + 2);      
    for (unsigned int x = 0; x < input.getWidth(); x++)
      for (unsigned int y = 0; y < input.getHeight(); y++)  
        returnValue[x + leftBorder ][y + topBorder] = input[x][y];
    for (unsigned int i = 0; i < input.getWidth(); i+=10)
    {
      Strings::printTo(returnValue, Strings::intToString(i), i + leftBorder, 0);
      Strings::printTo(returnValue, Strings::intToString(i), i + leftBorder, returnValue.getHeight() - 1);
    }
    for (unsigned int i = 0; i < input.getWidth(); i++)
    {
      Strings::printTo(returnValue, Strings::intToString(i%10), i + leftBorder, 1);
      Strings::printTo(returnValue, Strings::intToString(i%10), i + leftBorder, returnValue.getHeight() - 2);
    }
    
    for (unsigned int i = 0; i < input.getHeight(); i++)
    {
      Strings::printTo(returnValue, Strings::intToString(i), 0 , i + topBorder);
      Strings::printTo(returnValue, Strings::intToString(i), leftBorder + input.getWidth() + 1, i + topBorder);
    }

    return returnValue;
  }