Advertisement
desdemona

mapgeneration

Mar 24th, 2014
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. #define XSIZE 80
  10. #define YSIZE 68
  11. #define WALL_PROCENT 49
  12. #define STEPS_CNT 15
  13.  
  14. #define WERID_PROCENT 5
  15.  
  16. #define WALL 8
  17. #define FLOOR 0
  18.  
  19. struct point {
  20.   int x;
  21.   int y;
  22. } ;
  23.  
  24. int map[XSIZE][YSIZE];
  25.  
  26. void fillRandomly()
  27. {
  28.     srand(time(NULL));
  29.     for(int i=0; i<XSIZE; i++)
  30.     {
  31.         for(int j=0; j<YSIZE; j++)
  32.         {
  33.             if((rand()%100) < WALL_PROCENT)
  34.                 map[i][j]=WALL;
  35.             else
  36.                 map[i][j]=FLOOR;
  37.         }
  38.     }
  39. }
  40.  
  41. void fillBorders()
  42. {
  43.     for(int i=0; i<XSIZE; i++)
  44.     {
  45.         map[i][0]=WALL;
  46.         map[i][YSIZE-1]=WALL;
  47.     }
  48.     for (int i = 0; i < YSIZE; i++)
  49.     {
  50.         map[0][i]=WALL;
  51.         map[XSIZE-1][i]=WALL;
  52.     }
  53. }
  54.  
  55. int cntNeighbours(int i, int j)
  56. {
  57.     int x=0;
  58.     if(map[i+1][j]==WALL)
  59.         x++;
  60.     if(map[i-1][j]==WALL)
  61.         x++;
  62.     if(map[i][j+1]==WALL)
  63.         x++;
  64.     if(map[i][j-1]==WALL)
  65.         x++;
  66.     if(map[i+1][j+1]==WALL)
  67.         x++;
  68.     if(map[i-1][j-1]==WALL)
  69.         x++;
  70.     if(map[i+1][j-1]==WALL)
  71.         x++;
  72.     if(map[i-1][j+1]==WALL)
  73.         x++;
  74.     return x;
  75. }
  76.  
  77. int evolve()
  78. {
  79.     vector<point> toChange;
  80.     point current;
  81.     //fillBorders();
  82.     int walls=0;
  83.     int floors=0;
  84.     for(int i=1; i<XSIZE-1; i++)
  85.         for(int j=1; j<YSIZE-1; j++)
  86.         {
  87.             walls = cntNeighbours(i,j);
  88.             floors = 8- walls;
  89.             current.x = i;
  90.             current.y = j;
  91.  
  92.             if(map[i][j]==WALL && floors >= 5)
  93.                 toChange.push_back(current);
  94.             else if(map[i][j]==FLOOR && walls >= 5)
  95.                 toChange.push_back(current);       
  96.         }
  97.  
  98.         for(int i=0; i<toChange.size(); i++)
  99.         {
  100.             if(map[toChange[i].x][toChange[i].y] == FLOOR)
  101.                 map[toChange[i].x][toChange[i].y] = WALL;
  102.             else
  103.                 map[toChange[i].x][toChange[i].y] = FLOOR;
  104.         }
  105.  
  106.         return (toChange.size());
  107. }
  108.  
  109. void printMap()
  110. {
  111.     string line = "";
  112.    
  113.     for(int i=0; i<XSIZE; i++)
  114.     {
  115.         for(int j=0; j<YSIZE; j++)
  116.         {
  117.             if(map[i][j]==WALL)
  118.                 line+="#";
  119.             else
  120.                 line+=".";
  121.         }
  122.         cout << line << endl;
  123.         line = "";
  124.     }
  125. }
  126.  
  127. bool validCords(int x, int y)
  128. {
  129.     if(x >= 0 && y>= 0 && x<XSIZE && y<YSIZE)
  130.         return true;
  131.     return false;
  132. }
  133.  
  134. //void drunkenWalk(int x, int y, int len, int terrain)
  135. //{
  136. //  int xprev=x;
  137. //  int yprev=y;
  138. //  int xnext=x;
  139. //  int ynext=y;
  140. //  int rprev=78;
  141. //  int r;
  142. //  for(int i=0; i<len+1; i++)
  143. //  {
  144. //      map[xprev][yprev]=terrain;
  145. //      xnext = xprev; ynext = yprev;
  146. //      rprev = r;
  147. //      r =rand()%3;
  148. //      if(rprev == 0)
  149. //
  150. //      switch (r)
  151. //      {
  152. //          case 0:
  153. //              xnext++;
  154. //              break;
  155. //          case 1:
  156. //              xnext--;
  157. //              break;
  158. //          case 2:
  159. //              ynext++;
  160. //              break;
  161. //          case 3:
  162. //              ynext--;
  163. //              break;
  164. //      }
  165. //      if(xprev == xn
  166. //      while(xprev == xnext && yprev == ynext || !validCords(xprev, yprev))
  167. //      {
  168. //          xnext = xprev; ynext = yprev;
  169. //          r =rand()%4;
  170. //          switch (r)
  171. //          {
  172. //              case 0:
  173. //                  xnext++;
  174. //                  break;
  175. //              case 1:
  176. //                  xnext--;
  177. //                  break;
  178. //              case 2:
  179. //                  ynext++;
  180. //                  break;
  181. //              case 3:
  182. //                  ynext--;
  183. //                  break;
  184. //          }
  185. //      }
  186. //      xprev = xnext; yprev = ynext;
  187. //  }
  188. //  map[xprev][yprev]=terrain;
  189. //
  190. //}
  191.  
  192. int floorCnt()
  193. {
  194.     int cnt =0;
  195.     for(int i=0; i<XSIZE; i++)
  196.     {
  197.         for(int j=0; j<YSIZE; j++)
  198.         {
  199.             if(map[i][j]==FLOOR)
  200.                 cnt++;
  201.         }
  202.     }
  203.     return cnt;
  204. }
  205.  
  206. int main()
  207. {
  208.     fillRandomly();
  209.     fillBorders();
  210.  
  211.     for(int i=0; i<STEPS_CNT; i++)
  212.     {
  213.         evolve();
  214.         //if(rand()%100 <= 5)
  215.         //  drunkenWalk((rand()%(XSIZE-2))+1,(rand()%(YSIZE-2))+1,rand()%XSIZE,WALL);
  216.     }
  217.  
  218.     printMap();
  219.  
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement