that_one_nigga_you_k

gerador de labirintos com menu e iterações

Jun 11th, 2024 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <algorithm>
  5. #include <fstream>
  6. #include <stack>
  7. #include <queue>
  8.  
  9. using namespace std;
  10.  
  11. void gerarCaminhoDFSIterative(vector<vector<char>>& layout, int startX, int startY, ofstream& outputFileDFS ,ofstream& iterationFile) {
  12.     vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
  13.     random_device rd;
  14.     mt19937 g(rd());
  15.  
  16.     stack<pair<int, int>> s;
  17.     s.push({startX, startY});
  18.  
  19.     int largura = layout.size();
  20.     int comprimento = layout[0].size();
  21.  
  22.     while (!s.empty()) {
  23.         auto [x, y] = s.top();
  24.         s.pop();
  25.  
  26.         shuffle(directions.begin(), directions.end(), g);
  27.  
  28.         for (auto& dir : directions) {
  29.             int nx = x + dir.first;
  30.             int ny = y + dir.second;
  31.  
  32.             if (nx > 0 && nx < largura - 1 && ny > 0 && ny < comprimento - 1 && layout[nx][ny] == '@') {
  33.                 layout[nx][ny] = ' ';
  34.                 layout[x + dir.first / 2][y + dir.second / 2] = ' ';
  35.                 s.push({nx, ny});
  36.  
  37.                 // escreve as iterações em outro .txt
  38.                 for (int i = 0; i < largura; i++) {
  39.                     for (int j = 0; j < comprimento; j++) {
  40.                         iterationFile << layout[i][j] << " ";
  41.                     }
  42.                     iterationFile << endl;
  43.                 }
  44.                 iterationFile << endl;
  45.             }
  46.         }
  47.     }
  48.  
  49.     int saida;
  50.     vector<int> possibilidades_saidaDFS;
  51.  
  52.     for (int i = 0; i < comprimento; i++) {
  53.         if (layout[largura - 2][i] == ' ') {
  54.             possibilidades_saidaDFS.push_back(i);
  55.         }
  56.     }
  57.  
  58.     if (!possibilidades_saidaDFS.empty()) {
  59.         saida = possibilidades_saidaDFS[rand() % possibilidades_saidaDFS.size()];
  60.         layout[largura - 1][saida] = ' ';
  61.     }
  62.  
  63.     for (int i = 0; i < largura; i++) {
  64.         for (int j = 0; j < comprimento; j++) {
  65.             cout << layout[i][j] << " ";
  66.         }
  67.         cout << endl;
  68.     }
  69.  
  70.     // Write to the final file
  71.     if (outputFileDFS.is_open()) {
  72.         for (int i = 0; i < largura; i++) {
  73.             for (int j = 0; j < comprimento; j++) {
  74.                 outputFileDFS << layout[i][j] << " ";
  75.             }
  76.             outputFileDFS << endl;
  77.         }
  78.         outputFileDFS.close();
  79.         cout << "Labirinto e iterações criado lá no labirintoDFS.txt e iteracoes_gerarCaminhoDFS.txt" << endl;
  80.     } else {
  81.         cout << "criacionismo falhou." << endl;
  82.     }
  83. }
  84.  
  85. void gerarCaminhoDFS(vector<vector<char>>& layout, int startX, int startY, ofstream& outputFileDFS ) {
  86.     vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
  87.     random_device rd;
  88.     mt19937 g(rd());
  89.  
  90.     stack<pair<int, int>> s;
  91.     s.push({startX, startY});
  92.  
  93.     int largura, comprimento;
  94.  
  95.     largura = layout.size();
  96.     comprimento = layout[1].size();
  97.  
  98.     while (!s.empty()) {
  99.         auto [x, y] = s.top();
  100.         s.pop();
  101.  
  102.         shuffle(directions.begin(), directions.end(), g);
  103.  
  104.         for (auto& dir : directions) {
  105.             int nx = x + dir.first;
  106.             int ny = y + dir.second;
  107.  
  108.             if (nx > 0 && nx < layout.size() - 1 && ny > 0 && ny < layout[0].size() - 1 && layout[nx][ny] == '@') {
  109.                 layout[nx][ny] = ' ';
  110.                 layout[x + dir.first / 2][y + dir.second / 2] = ' ';
  111.                 s.push({nx, ny});
  112.             }
  113.         }
  114.     }
  115.  
  116.     int saida;
  117.  
  118.     vector<int> possibilidades_saidaDFS;
  119.  
  120.     for (int i = 0; i < comprimento; i++) {
  121.         if (layout[largura - 2][i] == ' ') {
  122.             possibilidades_saidaDFS.push_back(i);
  123.             }
  124.         }
  125.  
  126.         if (!possibilidades_saidaDFS.empty()) {
  127.             saida = possibilidades_saidaDFS[rand() % possibilidades_saidaDFS.size()];
  128.             layout[largura - 1][saida] = ' ';
  129.         }
  130.  
  131.         for (int i = 0; i < largura; i++) {
  132.             for (int j = 0; j < comprimento; j++) {
  133.                 cout << layout[i][j] << " ";
  134.             }
  135.             cout << endl;
  136.         }
  137.  
  138.     //escrever no arquivo final
  139.     if (outputFileDFS.is_open()) {
  140.                 for (int i = 0; i < largura; i++) {
  141.                     for (int j = 0; j < comprimento; j++) {
  142.                         outputFileDFS << layout[i][j] << " ";
  143.                     }
  144.                     outputFileDFS << endl;
  145.                 }
  146.                 outputFileDFS.close();
  147.                 cout << "Labirinto criado lá no labirintoDFS.txt" << endl;
  148.             }
  149.            
  150.             else {
  151.                 cout << "criacionismo falhou." << endl;
  152.             }
  153.  
  154.  
  155. }
  156.  
  157. void gerarCaminhoBFSIterative(vector<vector<char>>& layout, int startX, int startY, ofstream& outputfileBFS ,ofstream& iterationFile) {
  158.     vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
  159.     random_device rd;
  160.     mt19937 g(rd());
  161.  
  162.     queue<pair<int, int>> q;
  163.     q.push({startX, startY});
  164.  
  165.     int largura = layout.size();
  166.     int comprimento = layout[0].size();
  167.  
  168.     while (!q.empty()) {
  169.         auto [x, y] = q.front();
  170.         q.pop();
  171.  
  172.         shuffle(directions.begin(), directions.end(), g);
  173.  
  174.         for (auto& dir : directions) {
  175.             int nx = x + dir.first;
  176.             int ny = y + dir.second;
  177.  
  178.             if (nx > 0 && nx < largura - 1 && ny > 0 && ny < comprimento - 1 && layout[nx][ny] == '@') {
  179.                 layout[nx][ny] = ' ';
  180.                 layout[x + dir.first / 2][y + dir.second / 2] = ' ';
  181.                 q.push({nx, ny});
  182.  
  183.                 // escreve em outro .txt
  184.                 for (int i = 0; i < largura; i++) {
  185.                     for (int j = 0; j < comprimento; j++) {
  186.                         iterationFile << layout[i][j] << " ";
  187.                     }
  188.                     iterationFile << endl;
  189.                 }
  190.                 iterationFile << endl;
  191.             }
  192.         }
  193.     }
  194.  
  195.     int saida;
  196.     vector<int> possibilidades_saidaBFS;
  197.  
  198.     for (int i = 0; i < comprimento; i++) {
  199.         if (layout[largura - 2][i] == ' ') {
  200.             possibilidades_saidaBFS.push_back(i);
  201.         }
  202.     }
  203.  
  204.     if (!possibilidades_saidaBFS.empty()) {
  205.         saida = possibilidades_saidaBFS[rand() % possibilidades_saidaBFS.size()];
  206.         layout[largura - 1][saida] = ' ';
  207.     }
  208.  
  209.     for (int i = 0; i < largura; i++) {
  210.         for (int j = 0; j < comprimento; j++) {
  211.             cout << layout[i][j] << " ";
  212.         }
  213.         cout << endl;
  214.     }
  215.  
  216.     if (outputfileBFS.is_open()) {
  217.         for (int i = 0; i < largura; i++) {
  218.             for (int j = 0; j < comprimento; j++) {
  219.                 outputfileBFS << layout[i][j] << " ";
  220.             }
  221.             outputfileBFS << endl;
  222.         }
  223.         outputfileBFS.close();
  224.         cout << "Labirinto e iterações criado lá no labirintoBFS.txt e iterações_gerarCaminhoBFS.txt" << endl;
  225.     } else {
  226.         cout << "criacionismo falhou." << endl;
  227.     }
  228. }
  229.  
  230. void gerarCaminhoBFS(vector<vector<char>>& layout, int startX, int startY, ofstream& outputfileBFS) {
  231.     vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
  232.     random_device rd;
  233.     mt19937 g(rd());
  234.  
  235.     queue<pair<int, int>> q;
  236.     q.push({startX, startY});
  237.  
  238.     int largura, comprimento;
  239.  
  240.     largura = layout.size();
  241.     comprimento = layout[1].size();
  242.  
  243.     while (!q.empty()) {
  244.         auto [x, y] = q.front();
  245.         q.pop();
  246.  
  247.         shuffle(directions.begin(), directions.end(), g);
  248.  
  249.         for (auto& dir : directions) {
  250.             int nx = x + dir.first;
  251.             int ny = y + dir.second;
  252.  
  253.             if (nx > 0 && nx < layout.size() - 1 && ny > 0 && ny < layout[0].size() - 1 && layout[nx][ny] == '@') {
  254.                 layout[nx][ny] = ' ';
  255.                 layout[x + dir.first / 2][y + dir.second / 2] = ' ';
  256.                 q.push({nx, ny});
  257.             }
  258.            
  259.         }
  260.     }
  261.  
  262.    
  263.     int saida;
  264.     vector<int> possibilidades_saidaBFS;
  265.  
  266.     for (int i = 0; i < comprimento; i++) {
  267.         if (layout[largura - 2][i] == ' ') {
  268.             possibilidades_saidaBFS.push_back(i);
  269.         }
  270.     }
  271.  
  272.     if (!possibilidades_saidaBFS.empty()) {
  273.         saida = possibilidades_saidaBFS[rand() % possibilidades_saidaBFS.size()];
  274.         layout[largura - 1][saida] = ' ';
  275.     }
  276.  
  277.     // ver o resultado
  278.     for (int i = 0; i < largura; i++) {
  279.         for (int j = 0; j < comprimento; j++) {
  280.             cout << layout[i][j] << " ";
  281.         }
  282.         cout << endl;
  283.     }
  284.    
  285.     cout << endl;
  286.  
  287.     if (outputfileBFS.is_open()) {
  288.         for (int i = 0; i < largura; i++) {
  289.             for (int j = 0; j < comprimento; j++) {
  290.                 outputfileBFS << layout[i][j] << " ";
  291.             }
  292.             outputfileBFS << endl;
  293.         }
  294.         outputfileBFS.close();
  295.         cout << "Labirinto criado lá no labirintoBFS.txt" << endl;
  296.     } else {
  297.         cout << "criacionismo falhou." << endl;
  298.     }
  299. }
  300.  
  301.  
  302.  
  303. int main() {
  304.     // altura e largura
  305.     int largura;
  306.     int comprimento;
  307.  
  308.     int opc = 0;
  309.  
  310.     while (opc != 6) {
  311.         cout << "\n----------digite o que você quer fazer----------\ndigite 1 para gerar um labirinto DFS\ndigite 2 para gerar um labirinto BFS\ndigite 3 para gerar o labirinto DFS com as iterações\ndigite 4 para gerar o labirinto BFS com iterações\n e 6 para sair: ";
  312.         cin >> opc;
  313.  
  314.         switch (opc) {
  315.             case 1: {
  316.                 cout << "\ndigite a largura e comprimento do labirinto: ";
  317.                 cin >> largura >> comprimento;
  318.                 vector<vector<char>> layoutDFS(largura, vector<char>(comprimento, '@'));
  319.                 ofstream outputFileDFS("labirintoDFS.txt");
  320.  
  321.                 if (!outputFileDFS.is_open()) {
  322.                     cout << "Faiô.txt" << endl;
  323.                     return 1;
  324.                 }
  325.  
  326.                 random_device rd;
  327.                 mt19937 g(rd());
  328.                 int entrada = rand() % (comprimento - 2) + 1;
  329.                 layoutDFS[0][entrada] = ' ';
  330.  
  331.                 gerarCaminhoDFS(layoutDFS, 1, entrada, outputFileDFS);
  332.                 outputFileDFS.close();
  333.  
  334.                 cout << endl;
  335.                 break;
  336.             }
  337.  
  338.             case 2: {
  339.                 cout << "\ndigite a largura e comprimento do labirinto: ";
  340.                 cin >> largura >> comprimento;
  341.  
  342.                 vector<vector<char>> layoutBFS(largura, vector<char>(comprimento, '@'));
  343.  
  344.                 random_device rd;
  345.                 mt19937 g(rd());
  346.                 int entrada = rand() % (comprimento - 2) + 1;
  347.  
  348.                 ofstream outputFileBFS("labirintoBFS.txt");
  349.                 if (!outputFileBFS.is_open()) {
  350.                     cout << "Faiô.txt" << endl;
  351.                     return 1;
  352.                 }
  353.  
  354.                 // definir o começo
  355.                 layoutBFS[0][entrada] = ' ';
  356.                 gerarCaminhoBFS(layoutBFS, 1, entrada, outputFileBFS);
  357.                 outputFileBFS.close();
  358.                 break;
  359.             }
  360.  
  361.             case 3: {
  362.                 cout << "\ndigite a largura e comprimento do labirinto: ";
  363.                 cin >> largura >> comprimento;
  364.  
  365.                 vector<vector<char>> layoutDFS(largura, vector<char>(comprimento, '@'));
  366.  
  367.                 ofstream iterationFileDFS("iteracoes_gerarCaminhoDFS.txt");
  368.                 if (!iterationFileDFS.is_open()) {
  369.                     cout << "Faiô.txt" << endl;
  370.                     return 1;
  371.                 }
  372.  
  373.                 ofstream outputFileDFS("labirintoDFS.txt");
  374.  
  375.                 if (!outputFileDFS.is_open()) {
  376.                     cout << "Faiô.txt" << endl;
  377.                     return 1;
  378.                 }
  379.  
  380.                 random_device rd;
  381.                 mt19937 g(rd());
  382.                 int entrada = rand() % (comprimento - 2) + 1;
  383.  
  384.                 layoutDFS[0][entrada] = ' ';
  385.                 gerarCaminhoDFSIterative(layoutDFS, 1, entrada, outputFileDFS, iterationFileDFS);
  386.                 iterationFileDFS.close();
  387.                 outputFileDFS.close();
  388.  
  389.                 cout << endl;
  390.                 break;
  391.             }
  392.  
  393.             case 4: {
  394.                 cout << "\ndigite a largura e comprimento do labirinto: ";
  395.                 cin >> largura >> comprimento;
  396.  
  397.                 vector<vector<char>> layoutBFS(largura, vector<char>(comprimento, '@'));
  398.  
  399.                 random_device rd;
  400.                 mt19937 g(rd());
  401.                 int entrada = rand() % (comprimento - 2) + 1;
  402.  
  403.                 ofstream iterationFileBFS("iteracoes_gerarCaminhoBFS.txt");
  404.                 if (!iterationFileBFS.is_open()) {
  405.                     cout << "Faiô.txt" << endl;
  406.                     return 1;
  407.                 }
  408.                 ofstream outputFileBFS("labirintoBFS.txt");
  409.                 if (!outputFileBFS.is_open()) {
  410.                     cout << "Faiô.txt" << endl;
  411.                     return 1;
  412.                 }
  413.  
  414.                 // definir o começo
  415.                 layoutBFS[0][entrada] = ' ';
  416.                 gerarCaminhoBFSIterative(layoutBFS, 1, entrada, outputFileBFS, iterationFileBFS);
  417.                 iterationFileBFS.close();
  418.                 outputFileBFS.close();
  419.                 break;
  420.             }
  421.  
  422.             case 6:
  423.                 cout << "Saindo..." << endl;
  424.                 break;
  425.  
  426.             default:
  427.                 cout << "Opção inválida. Tente novamente." << endl;
  428.                 break;
  429.         }
  430.     }
  431.  
  432.     return 0;
  433. }
  434.  
Add Comment
Please, Sign In to add comment