Little_hobbit

binary floor generator

Jul 26th, 2020 (edited)
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <ctime>
  4. #include <queue>
  5.  
  6. using namespace std;
  7.  
  8. /*
  9.  * Для матрицы определенно следующее
  10.  * 1 - X комната
  11.  * 2 - | коридор
  12.  * 3 - - коридор
  13.  *
  14.  * Этот алгоритм (как мне кажется) удобнее будет использовать для спавна
  15.  * ибо в анриле есть методы проверки, возможен ли спавн и т.д. Тем самым можно перестроить
  16.  * этот алгоритм на блюпринты
  17.  */
  18.  
  19. // Вариации путей при 4-х возможных направлениях (спавна)
  20. const int rand_ways_four[6][4] =
  21.         {
  22.                 {1, 1, 0, 0},
  23.                 {1, 0, 1, 0},
  24.                 {1, 0, 0, 1},
  25.                 {0, 1, 1, 0},
  26.                 {0, 1, 0, 1},
  27.                 {0, 0, 1, 1}
  28.         };
  29.  
  30. // Вариации путей при 3-х возможных направлениях (спавна)
  31. const int rand_ways_three[3][3] =
  32.         {
  33.                 {1, 1, 0},
  34.                 {1, 0, 1},
  35.                 {0, 1, 1}
  36.         };
  37.  
  38. // Процедура генерации матрицы (в анриле это канешна будет не матрица,
  39. // спавн будет происходит в реалтайме без использоания матрицы
  40. // матрица тут ток для показа нужна
  41. vector<vector<int>> generate_matrix(int N, int size)
  42. {
  43.     // Генерируем матрицу и задаем начало генерации
  44.     vector<vector<int>> matrix(size, vector<int>(size, 0));
  45.     matrix[size / 2][size / 2] = 1;
  46.  
  47.     // Создаем очередь свободных ячеек (или же направлений спавна комнат/коридоров)
  48.     queue<pair<int, int>> q;
  49.     q.push(make_pair(size / 2, size / 2));
  50.  
  51.     // Ну тут поиск в ширину
  52.     while (N > 0 && !q.empty())
  53.     {
  54.         // Получаем занесенные в очередь координаты
  55.         pair<int, int> coords = q.front();
  56.         q.pop();
  57.  
  58.         // подсчитываем количество путей, в которые НЕ можем пойти
  59.         int count_cant =
  60.                 matrix[coords.first + 2][coords.second] +
  61.                 matrix[coords.first - 2][coords.second] +
  62.                 matrix[coords.first][coords.second + 2] +
  63.                 matrix[coords.first][coords.second - 2];
  64.  
  65.         // Если можем пойти хотя бы в два направления
  66.         if (count_cant <= 2)
  67.         {
  68.             // Количество возможных путей
  69.             int count_can = 4 - count_cant;
  70.  
  71.             // Список вохможных путей
  72.             vector<pair<int, int>> possible;
  73.  
  74.             // Добавляем в этот список пути, в которые можем пойти
  75.             // 0 в матрице - можем идти
  76.             if (!matrix[coords.first + 2][coords.second])
  77.                 possible.emplace_back(coords.first + 2, coords.second);
  78.  
  79.             if (!matrix[coords.first - 2][coords.second])
  80.                 possible.emplace_back(coords.first - 2, coords.second);
  81.  
  82.             if (!matrix[coords.first][coords.second + 2])
  83.                 possible.emplace_back(coords.first, coords.second + 2);
  84.  
  85.             if (!matrix[coords.first][coords.second - 2])
  86.                 possible.emplace_back(coords.first, coords.second - 2);
  87.  
  88.             // Для двух возможных путей заносим их все
  89.             if (count_can == 2)
  90.             {
  91.                 for (auto c : possible)
  92.                 {
  93.                     if (N > 0)
  94.                     {
  95.                         // Выставляем комнату
  96.                         matrix[c.first][c.second] = 1;
  97.  
  98.                         // соединяем коридором
  99.                         if (c.first == coords.first + 2)
  100.                             matrix[coords.first + 1][coords.second] = 2;
  101.                         if (c.first == coords.first - 2)
  102.                             matrix[coords.first - 1][coords.second] = 2;
  103.                         if (c.second == coords.second + 2)
  104.                             matrix[coords.first][coords.second + 1] = 3;
  105.                         if (c.second == coords.second - 2)
  106.                             matrix[coords.first][coords.second - 1] = 3;
  107.  
  108.                         // уменьшаем количество комнат
  109.                         N--;
  110.                         //заносим в очередь
  111.                         q.push(c);
  112.                     }
  113.                 }
  114.             }
  115.             else if (count_can == 3)
  116.             {
  117.                 // Вычисляем индекс путей пути нипутю
  118.                 int k = rand()%3;
  119.                 for (int i = 0; i < possible.size(); ++i)
  120.                 {
  121.                     if (N > 0 && rand_ways_three[k][i])
  122.                     {
  123.                         // Выставляем комнату
  124.                         matrix[possible[i].first][possible[i].second] = 1;
  125.  
  126.                         // Коридор (много т.к для массива (можно и в отдельную функцию вынести))
  127.                         if (possible[i].first == coords.first + 2)
  128.                             matrix[coords.first + 1][coords.second] = 2;
  129.                         if (possible[i].first == coords.first - 2)
  130.                             matrix[coords.first - 1][coords.second] = 2;
  131.                         if (possible[i].second == coords.second + 2)
  132.                             matrix[coords.first][coords.second + 1] = 3;
  133.                         if (possible[i].second == coords.second - 2)
  134.                             matrix[coords.first][coords.second - 1] = 3;
  135.  
  136.                         // уменьшаем количество путей
  137.                         N--;
  138.                         // заносим в очередь
  139.                         q.push(possible[i]);
  140.                     }
  141.                 }
  142.             }
  143.             else if (count_can == 4)
  144.             {
  145.                 // Ну тут как в предыдущем
  146.                 int k = rand() % 6;
  147.                 for (int i = 0; i < possible.size(); ++i)
  148.                 {
  149.                     if (N > 0 && rand_ways_four[k][i])
  150.                     {
  151.                         matrix[possible[i].first][possible[i].second] = 1;
  152.  
  153.                         if (possible[i].first == coords.first + 2)
  154.                             matrix[coords.first + 1][coords.second] = 2;
  155.                         if (possible[i].first == coords.first - 2)
  156.                             matrix[coords.first - 1][coords.second] = 2;
  157.                         if (possible[i].second == coords.second + 2)
  158.                             matrix[coords.first][coords.second + 1] = 3;
  159.                         if (possible[i].second == coords.second - 2)
  160.                             matrix[coords.first][coords.second - 1] = 3;
  161.  
  162.                         N--;
  163.                         q.push(possible[i]);
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.  
  169.     }
  170.  
  171.     return matrix;
  172. }
  173.  
  174. int main()
  175. {
  176.     int n, seed;
  177.  
  178.     // колво комнат
  179.     cout << "Num of rooms: " << endl;
  180.     cin >> n; n--;
  181.  
  182.     // зерно
  183.     cout << "Seed: " << endl;
  184.     cin >> seed;
  185.  
  186.     // закладываем зерно
  187.     srand(seed);
  188.  
  189.     // получаем матрицу
  190.     vector<vector<int>> matrix = generate_matrix(n, 101);
  191.    
  192.     // вот ет большое вывод, советую окно консоли растянуть на весь экран для большого количества комнат
  193.     for (int i = 0; i < matrix.size(); ++i)
  194.     {
  195.         for (int j = 0; j < matrix.size(); ++j)
  196.         {
  197.             if (matrix[i][j] == 1)
  198.             {
  199.                 if (i == 50 && j == 50)
  200.                     cout << 'X';
  201.                 else
  202.                     cout << 'x';
  203.             }
  204.             else if (matrix[i][j] == 2)
  205.                 cout << '|';
  206.             else if (matrix[i][j] == 3)
  207.                 cout << '-';
  208.             else
  209.                 cout << ' ';
  210.         }
  211.         cout << endl;
  212.     }
  213.  
  214.     return 0;
  215. }
  216.  
Add Comment
Please, Sign In to add comment