Advertisement
PIBogdanov

The Labyrinth

Feb 15th, 2023
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <Windows.h>
  5. #include <ctype.h>
  6. #include <random>
  7. #include <chrono>
  8. #include <thread>
  9. #include <conio.h>
  10.  
  11. using namespace std;
  12.  
  13. string player = "O";
  14.  
  15. int playerX = 1;
  16.  
  17. int playerY = 0;
  18.  
  19. int originalPlayerX = playerX;
  20.  
  21. int originalPlayerY = playerY;
  22.  
  23. int mainMenu();
  24.  
  25. void gameStart();
  26.  
  27. void customGame();
  28.  
  29. void gameControls();
  30.  
  31. void gameCredits();
  32.  
  33. void exitProgram();
  34.  
  35. int customGameMenu();
  36.  
  37. int difficultyMenu();
  38.  
  39. void easyDifficulty();
  40.  
  41. void normalDifficulty();
  42.  
  43. void hardDifficulty();
  44.  
  45. void backToMenu();
  46.  
  47. void characterMove(string**, int&, int&, int, int);
  48.  
  49. void playerMove(string**);
  50.  
  51. void display(string**, int, int, int, string);
  52.  
  53. void loadMap(string, int, string);
  54.  
  55. void loadCustomMapFromTheFolder();
  56.  
  57. void createCustomMap();
  58.  
  59. int filesInFolderCount(string);
  60.  
  61. void levels(string);
  62.  
  63. void ShowConsoleCursor(bool showFlag);
  64.  
  65. int main()
  66. {
  67.     system("color 04");
  68.  
  69.     ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);
  70.  
  71.     SendMessage(GetConsoleWindow(), WM_SYSKEYDOWN, VK_RETURN, 0x2000000);
  72.  
  73.     ShowConsoleCursor(false);
  74.  
  75.     mainMenu();
  76.  
  77.     return 0;
  78. }
  79.  
  80. typedef void(*menuOptions)();
  81.  
  82. menuOptions mainMenuOptions[] = { gameStart, customGame, gameControls, gameCredits, exitProgram };
  83.  
  84. int mainMenu()
  85. {
  86.     string menu[] = { "Start Game", "Create a Custom Game", "Controls", "Credits", "Exit" };
  87.  
  88.     int pointer = 0;
  89.  
  90.     bool lastUpKeyState = false;
  91.  
  92.     bool lastDownKeyState = false;
  93.  
  94.     bool lastReturnKeyState = false;
  95.  
  96.     bool arrowVisible = true;
  97.  
  98.     while (true)
  99.     {
  100.         system("cls");
  101.  
  102.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  103.  
  104.         cout << "The Labyrinth" << "\n" << "\n";
  105.  
  106.         cout << "Main Menu" << "\n" << "\n";
  107.  
  108.         for (int i = 0; i < size(menu); i++) // FROM i < 5
  109.         {
  110.             if (i == pointer)
  111.             {
  112.                 if (arrowVisible)
  113.                 {
  114.                     cout << "-> ";
  115.  
  116.                     arrowVisible = false;
  117.                 }
  118.  
  119.                 else
  120.                 {
  121.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  122.  
  123.                     arrowVisible = true;
  124.                 }
  125.  
  126.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  127.  
  128.                 cout << menu[i] << endl;
  129.             }
  130.  
  131.             else
  132.             {
  133.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  134.  
  135.                 cout << menu[i] << endl;
  136.             }
  137.         }
  138.  
  139.         bool upKeyState = GetAsyncKeyState(VK_UP);
  140.  
  141.         if ( (upKeyState) && !(lastUpKeyState) )
  142.         {
  143.             pointer -= 1;
  144.  
  145.             if (pointer == -1)
  146.             {
  147.                 pointer = size(menu) - 1; // FROM pointer = 4
  148.             }
  149.         }
  150.  
  151.         lastUpKeyState = upKeyState;
  152.  
  153.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  154.  
  155.         if ( (downKeyState) && !(lastDownKeyState) )
  156.         {
  157.             pointer += 1;
  158.  
  159.             if (pointer == size(menu)) // FROM pointer = 5
  160.             {
  161.                 pointer = 0;
  162.             }
  163.         }
  164.  
  165.         lastDownKeyState = downKeyState;
  166.  
  167.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  168.  
  169.         if ( (returnKeyState) && !(lastReturnKeyState) )
  170.         {
  171.             mainMenuOptions[pointer]();
  172.         }
  173.  
  174.         lastReturnKeyState = returnKeyState;
  175.  
  176.         this_thread::sleep_for(chrono::milliseconds(200));
  177.     }
  178. }
  179.  
  180. void gameStart()
  181. {
  182.     difficultyMenu();
  183. }
  184.  
  185. void customGame()
  186. {
  187.     customGameMenu();
  188. }
  189.  
  190. void gameControls()
  191. {
  192.     system("cls");
  193.  
  194.     cout << "\n";
  195.  
  196.     cout << "  --------------CONTROLS---------------" << "\n";
  197.     cout << "  |                                   |" << "\n";
  198.     cout << "  |                                   |" << "\n";
  199.     cout << "  |   ^ --> Up Arrow to move up       |" << "\n";
  200.     cout << "  |   < --> Left Arrow to move left   |" << "\n";
  201.     cout << "  |   > --> Right Arrow to move right |" << "\n";
  202.     cout << "  |   v --> Down Arrow to move down   |" << "\n";
  203.     cout << "  |                                   |" << "\n";
  204.     cout << "  |   Enter / Return --> Enter        |" << "\n";
  205.     cout << "  |   Escape --> Back                 |" << "\n";
  206.     cout << "  |                                   |" << "\n";
  207.     cout << "  |                                   |" << "\n";
  208.     cout << "  -------------------------------------" << "\n";
  209.  
  210.     while (true)
  211.     {
  212.         backToMenu();
  213.     }
  214. }
  215.  
  216. void gameCredits()
  217. {
  218.     system("cls");
  219.  
  220.     cout << "Thanks for playing!" << "\n";
  221.  
  222.     cout << "\n";
  223.  
  224.     cout << "Creator: Petar Bogdanov" << "\n";
  225.  
  226.     cout << "The people who helped me with this project: eng. Stoyan Filipov and eng. Monika Gencheva" << "\n" << "\n";
  227.  
  228.     cout << "Press \"ESCAPE\" to go back to the Main Menu" << "\n";
  229.  
  230.     while (true)
  231.     {
  232.         backToMenu();
  233.     }
  234. }
  235.  
  236. void exitProgram()
  237. {
  238.     exit(0);
  239. }
  240.  
  241. menuOptions customMenuOptions[] = { loadCustomMapFromTheFolder, createCustomMap };
  242.  
  243. int customGameMenu()
  244. {
  245.     string menu[] = { "Play on your created custom maps placed in the subfolder", "Create a custom map" };
  246.  
  247.     int pointer = 0;
  248.  
  249.     bool lastUpKeyState = false;
  250.  
  251.     bool lastDownKeyState = false;
  252.  
  253.     bool lastReturnKeyState = false;
  254.  
  255.     bool arrowVisible = true;
  256.  
  257.     while (true)
  258.     {
  259.         system("cls");
  260.  
  261.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  262.  
  263.         cout << "Type of a custom map" << "\n" << "\n";
  264.  
  265.         for (int i = 0; i < size(menu); i++)
  266.         {
  267.             if (i == pointer)
  268.             {
  269.                 if (arrowVisible)
  270.                 {
  271.                     cout << "-> ";
  272.  
  273.                     arrowVisible = false;
  274.                 }
  275.  
  276.                 else
  277.                 {
  278.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  279.  
  280.                     arrowVisible = true;
  281.                 }
  282.  
  283.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  284.  
  285.                 cout << menu[i] << endl;
  286.             }
  287.  
  288.             else
  289.             {
  290.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  291.  
  292.                 cout << menu[i] << endl;
  293.             }
  294.         }
  295.  
  296.         bool upKeyState = GetAsyncKeyState(VK_UP);
  297.  
  298.         if ( (upKeyState) && !(lastUpKeyState) )
  299.         {
  300.             pointer -= 1;
  301.  
  302.             if (pointer == -1)
  303.             {
  304.                 pointer = size(menu) - 1;
  305.             }
  306.         }
  307.  
  308.         lastUpKeyState = upKeyState;
  309.  
  310.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  311.  
  312.         if ( (downKeyState) && !(lastDownKeyState) )
  313.         {
  314.             pointer += 1;
  315.  
  316.             if (pointer == size(menu))
  317.             {
  318.                 pointer = 0;
  319.             }
  320.         }
  321.  
  322.         lastDownKeyState = downKeyState;
  323.  
  324.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  325.  
  326.         if ( (returnKeyState) && !(lastReturnKeyState) )
  327.         {
  328.             customMenuOptions[pointer]();
  329.         }
  330.  
  331.         backToMenu();
  332.  
  333.         lastReturnKeyState = returnKeyState;
  334.  
  335.         this_thread::sleep_for(chrono::milliseconds(200));
  336.     }
  337. }
  338.  
  339. menuOptions difficultyMenuOptions[] = { easyDifficulty, normalDifficulty, hardDifficulty };
  340.  
  341. int difficultyMenu()
  342. {
  343.     string difficulty[] = { "Easy", "Normal", "Hard" };
  344.  
  345.     int pointer = 0;
  346.  
  347.     bool lastUpKeyState = false;
  348.  
  349.     bool lastDownKeyState = false;
  350.  
  351.     bool lastReturnKeyState = false;
  352.  
  353.     bool arrowVisible = true;
  354.  
  355.     while (true)
  356.     {
  357.         system("cls");
  358.  
  359.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  360.  
  361.         cout << "Choose difficulty" << "\n" << "\n";
  362.  
  363.         for (int i = 0; i < size(difficulty); i++)
  364.         {
  365.             if (i == pointer)
  366.             {
  367.                 if (arrowVisible)
  368.                 {
  369.                     cout << "-> ";
  370.  
  371.                     arrowVisible = false;
  372.                 }
  373.  
  374.                 else
  375.                 {
  376.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  377.  
  378.                     arrowVisible = true;
  379.                 }
  380.  
  381.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  382.  
  383.                 cout << difficulty[i] << endl;
  384.             }
  385.  
  386.             else
  387.             {
  388.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  389.  
  390.                 cout << difficulty[i] << endl;
  391.             }
  392.         }
  393.  
  394.         bool upKeyState = GetAsyncKeyState(VK_UP);
  395.  
  396.         if ( (upKeyState) && !(lastUpKeyState) )
  397.         {
  398.             pointer -= 1;
  399.  
  400.             if (pointer == -1)
  401.             {
  402.                 pointer = size(difficulty) - 1;
  403.             }
  404.         }
  405.  
  406.         lastUpKeyState = upKeyState;
  407.  
  408.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  409.  
  410.         if ( (downKeyState) && !(lastDownKeyState) )
  411.         {
  412.             pointer += 1;
  413.  
  414.             if (pointer == size(difficulty))
  415.             {
  416.                 pointer = 0;
  417.             }
  418.         }
  419.  
  420.         lastDownKeyState = downKeyState;
  421.  
  422.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  423.  
  424.         if ( (returnKeyState) && !(lastReturnKeyState) )
  425.         {
  426.             difficultyMenuOptions[pointer]();
  427.         }
  428.  
  429.         backToMenu();
  430.  
  431.         lastReturnKeyState = returnKeyState;
  432.  
  433.         this_thread::sleep_for(chrono::milliseconds(200));
  434.     }
  435. }
  436.  
  437. void easyDifficulty()
  438. {
  439.     levels("easy");
  440. }
  441.  
  442. void normalDifficulty()
  443. {
  444.     levels("normal");
  445. }
  446.  
  447. void hardDifficulty()
  448. {
  449.     levels("hard");
  450. }
  451.  
  452. void backToMenu()
  453. {
  454.     if (GetAsyncKeyState(VK_ESCAPE))
  455.     {
  456.         main();
  457.     }
  458. }
  459.  
  460. void characterMove(string** labyrinth, int& x, int& y, int dx, int dy)
  461. {
  462.     if (labyrinth[x + dx][y + dy] == "S" || labyrinth[x + dx][y + dy] == " " || labyrinth[x + dx][y + dy] == "E")
  463.     {
  464.         x += dx;
  465.         y += dy;
  466.     }
  467. }
  468.  
  469. void playerMove(string** labyrinth)
  470. {
  471.     char key = _getch();
  472.  
  473.     if (key == 72) // The ASCII CODE FOR THE UP ARROW KEY
  474.     {
  475.         characterMove(labyrinth, playerX, playerY, -1, 0);
  476.     }
  477.  
  478.     else if (key == 75) // The ASCII CODE FOR THE LEFT ARROW KEY
  479.     {
  480.         characterMove(labyrinth, playerX, playerY, 0, -1);
  481.     }
  482.  
  483.     else if (key == 80) // The ASCII CODE FOR THE DOWN ARROW KEY
  484.     {
  485.         characterMove(labyrinth, playerX, playerY, 1, 0);
  486.     }
  487.  
  488.     else if (key == 77) // The ASCII CODE FOR THE RIGHT ARROW KEY
  489.     {
  490.         characterMove(labyrinth, playerX, playerY, 0, 1);
  491.     }
  492. }
  493.  
  494. void display(string** labyrinth, int rowsCount, int columnsCount, int level, string levelType)
  495. {
  496.     bool breakAfterRender = false;
  497.  
  498.     while (true)
  499.     {
  500.         system("cls");
  501.  
  502.         cout << "Difficulty: " << levelType << "\n";
  503.  
  504.         cout << "Level: " << level << " / " << filesInFolderCount(levelType) << "\n" << "\n";
  505.  
  506.         int colour = rand() % 15 + 1;
  507.  
  508.         for (int i = 0; i < rowsCount; i++)
  509.         {
  510.             for (int j = 0; j < columnsCount; j++)
  511.             {
  512.                 if ((i == playerX) && (j == playerY))
  513.                 {
  514.                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colour);
  515.  
  516.                     cout << player;
  517.  
  518.                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
  519.                 }
  520.  
  521.                 else
  522.                 {
  523.                     cout << labyrinth[i][j];
  524.                 }
  525.             }
  526.  
  527.             cout << "\n";
  528.         }
  529.  
  530.         if (breakAfterRender)
  531.         {
  532.             cout << "\n";
  533.  
  534.             cout << "Congratulations! You have reached the end of the level!" << "\n";
  535.  
  536.             playerX = originalPlayerX;
  537.  
  538.             playerY = originalPlayerY;
  539.  
  540.             cout << "\n" << "\n";
  541.  
  542.             cout << "Press \"ENTER\" to continue" << "\n";
  543.  
  544.             while (true)
  545.             {
  546.                 if (_getch() == 13) // The ASCII CODE FOR THE ENTER / RETURN KEY
  547.                 {
  548.                     break;
  549.                 }
  550.             }
  551.  
  552.             break;
  553.         }
  554.  
  555.         labyrinth[playerX][playerY] = " ";
  556.  
  557.         playerMove(labyrinth);
  558.  
  559.         if (labyrinth[playerX][playerY] == "E")
  560.         {
  561.             breakAfterRender = true;
  562.         }
  563.  
  564.         labyrinth[playerX][playerY] = player;
  565.  
  566.         this_thread::sleep_for(chrono::milliseconds(24));
  567.     }
  568. }
  569.  
  570. void loadMap(string fileName, int level, string levelType)
  571. {
  572.     int rowsCount = 1;
  573.  
  574.     int columnsCount = 0;
  575.  
  576.     int startAt = 0;
  577.  
  578.     int endAt = 0;
  579.  
  580.     ifstream mapFile;
  581.     mapFile.open(fileName);
  582.  
  583.     if (mapFile.is_open())
  584.     {
  585.         char mychar;
  586.  
  587.         while (mapFile)
  588.         {
  589.             mychar = mapFile.get();
  590.  
  591.             if (mychar == '\n')
  592.             {
  593.                 rowsCount++;
  594.             }
  595.  
  596.             else if ( (mychar != '\n') && (rowsCount == 1) )
  597.             {
  598.                 columnsCount++;
  599.             }
  600.  
  601.             else if (mychar == 'S')
  602.             {
  603.                 startAt = rowsCount - 1;
  604.             }
  605.  
  606.             else if (mychar == 'E')
  607.             {
  608.                 endAt = rowsCount - 1;
  609.             }
  610.         }
  611.     }
  612.  
  613.     else
  614.     {
  615.         cout << "Error: Unable to open file " << fileName << "\n" << "\n";
  616.  
  617.         cout << "Press \"ESCAPE\" to go back to the Main Menu" << "\n";
  618.  
  619.         while (true)
  620.         {
  621.             backToMenu();
  622.         }
  623.     }
  624.  
  625.     mapFile.close();
  626.  
  627.     // Dynamically allocating row space in the heap
  628.     string** labyrinth = new string * [rowsCount];
  629.  
  630.     // Dynamically allocating column space in the heap
  631.     for (int i = 0; i < rowsCount; i++)
  632.     {
  633.         labyrinth[i] = new string[columnsCount];
  634.     }
  635.  
  636.     int currentRow = 0;
  637.  
  638.     int currentColumn = 0;
  639.  
  640.     mapFile.open(fileName);
  641.  
  642.     if (mapFile.is_open())
  643.     {
  644.         char currentSymbol;
  645.  
  646.         while (mapFile.get(currentSymbol))
  647.         {
  648.             if ( (currentRow < rowsCount) && (currentColumn < columnsCount) )
  649.             {
  650.                 labyrinth[currentRow][currentColumn] = currentSymbol;
  651.             }
  652.  
  653.             if (currentSymbol == '\n')
  654.             {
  655.                 currentRow++;
  656.  
  657.                 currentColumn = 0;
  658.             }
  659.  
  660.             else
  661.             {
  662.                 currentColumn++;
  663.             }
  664.         }
  665.     }
  666.  
  667.     mapFile.close();
  668.  
  669.     // Displaying the labyrinth
  670.     display(labyrinth, rowsCount, columnsCount, level, levelType);
  671.  
  672.     // Free up the space after the use of the array
  673.     for (int i = 0; i < rowsCount; i++)
  674.     {
  675.         delete[] labyrinth[i];
  676.     }
  677.  
  678.     delete[] labyrinth;
  679. }
  680.  
  681. void loadCustomMapFromTheFolder()
  682. {
  683.     int fileCount = filesInFolderCount("custom");
  684.  
  685.     string* menu = new string[fileCount]; // NOTE: To work with a dynamic array the second if statement in the while loop, that's located in a if statement is needed
  686.  
  687.     //vector<string> menu(fileCount); // NOTE: Works perfectly
  688.  
  689.     WIN32_FIND_DATA findData;
  690.     HANDLE hFind;
  691.  
  692.     string folderPath = "maps/custom/";
  693.  
  694.     wstring wideFolderPath(folderPath.begin(), folderPath.end());
  695.     wideFolderPath += L"*";
  696.  
  697.     hFind = FindFirstFile(wideFolderPath.c_str(), &findData);
  698.  
  699.     if (hFind != INVALID_HANDLE_VALUE)
  700.     {
  701.         char narrowString[MAX_PATH];
  702.  
  703.         int counter = 0;
  704.  
  705.         while (FindNextFile(hFind, &findData) != 0)
  706.         {
  707.             WideCharToMultiByte(CP_ACP, 0, findData.cFileName, -1, narrowString, MAX_PATH, NULL, NULL);
  708.  
  709.             if (strcmp(narrowString, ".") != 0 && strcmp(narrowString, "..") != 0)
  710.             {
  711.                 if (counter == fileCount)
  712.                 {
  713.                     string* newData = new string[fileCount * 2];
  714.  
  715.                     for (int i = 0; i < counter; i++)
  716.                     {
  717.                         newData[i] = menu[i];
  718.                     }
  719.  
  720.                     delete[] menu;
  721.  
  722.                     menu = newData;
  723.                 }
  724.  
  725.                 menu[counter] = narrowString;
  726.  
  727.                 counter++;
  728.             }
  729.         }
  730.  
  731.         FindClose(hFind);
  732.     }
  733.  
  734.     int pointer = 0;
  735.  
  736.     bool lastUpKeyState = false;
  737.  
  738.     bool lastDownKeyState = false;
  739.  
  740.     bool lastReturnKeyState = false;
  741.  
  742.     bool arrowVisible = true;
  743.  
  744.     while (true)
  745.     {
  746.         system("cls");
  747.  
  748.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  749.  
  750.         cout << "There are " << fileCount << " files in the subfolder called \"custom\"." << "\n" << "\n";
  751.  
  752.         cout << "Select a Custom Map" << "\n" << "\n";
  753.  
  754.         for (int i = 0; i < fileCount; i++)
  755.         {
  756.             if (i == pointer)
  757.             {
  758.                 if (arrowVisible)
  759.                 {
  760.                     cout << "-> ";
  761.  
  762.                     arrowVisible = false;
  763.                 }
  764.  
  765.                 else
  766.                 {
  767.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  768.  
  769.                     arrowVisible = true;
  770.                 }
  771.  
  772.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  773.  
  774.                 cout << menu[i] << "\n";
  775.             }
  776.  
  777.             else
  778.             {
  779.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  780.  
  781.                 cout << menu[i] << "\n";
  782.             }
  783.         }
  784.  
  785.         bool upKeyState = GetAsyncKeyState(VK_UP);
  786.  
  787.         if ( (upKeyState) && !(lastUpKeyState) )
  788.         {
  789.             pointer -= 1;
  790.  
  791.             if (pointer == -1)
  792.             {
  793.                 pointer = fileCount - 1;
  794.             }
  795.         }
  796.  
  797.         lastUpKeyState = upKeyState;
  798.  
  799.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  800.  
  801.         if ( (downKeyState) && !(lastDownKeyState) )
  802.         {
  803.             pointer += 1;
  804.  
  805.             if (pointer == fileCount)
  806.             {
  807.                 pointer = 0;
  808.             }
  809.         }
  810.  
  811.         lastDownKeyState = downKeyState;
  812.  
  813.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  814.  
  815.         if ((returnKeyState) && !(lastReturnKeyState))
  816.         {
  817.             // code to load the selected file goes here
  818.         }
  819.  
  820.         lastReturnKeyState = returnKeyState;
  821.  
  822.         if (GetAsyncKeyState(VK_ESCAPE))
  823.         {
  824.             customGame();
  825.         }
  826.  
  827.         this_thread::sleep_for(chrono::milliseconds(200));
  828.     }
  829.  
  830.     delete[] menu;
  831. }
  832.  
  833. void createCustomMap()
  834. {
  835.  
  836. }
  837.  
  838. int filesInFolderCount(string levelType)
  839. {
  840.     int fileCount = 0;
  841.  
  842.     string folderPath = "maps/" + levelType + "/";
  843.  
  844.     // Get the first file in the folder
  845.     WIN32_FIND_DATAA findFileData;
  846.  
  847.     HANDLE hFind = FindFirstFileA((folderPath + "*").c_str(), &findFileData);
  848.  
  849.     // Iterate through the files in the folder
  850.     if (hFind != INVALID_HANDLE_VALUE)
  851.     {
  852.         while (true)
  853.         {
  854.             // Check if the current file is a regular file
  855.             if ( (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 )
  856.             {
  857.                 fileCount++;
  858.             }
  859.  
  860.             if ( !(FindNextFileA(hFind, &findFileData)) )
  861.             {
  862.                 break;
  863.             }
  864.         }
  865.  
  866.         // Clean up
  867.         FindClose(hFind);
  868.     }
  869.  
  870.     return fileCount;
  871. }
  872.  
  873. void levels(string levelType)
  874. {
  875.     int level = 1;
  876.  
  877.     if ( (levelType != "easy") && (levelType != "normal") && (levelType != "hard") )
  878.     {
  879.         system("cls");
  880.  
  881.         cout << "Invalid level!" << "\n";
  882.  
  883.         return;
  884.     }
  885.  
  886.     while (level <= filesInFolderCount(levelType))
  887.     {
  888.         system("cls");
  889.  
  890.         string mapFile = "maps/" + levelType + "/map_" + to_string(level) + ".txt";
  891.  
  892.         // Opening the text file
  893.         loadMap(mapFile, level, levelType);
  894.  
  895.         level++;
  896.     }
  897.  
  898.     system("cls");
  899.  
  900.     cout << "Congratulations! You have finished the game!" << "\n" << "\n";
  901.  
  902.     cout << "Press \"ENTER\" to continue";
  903.  
  904.     while (true)
  905.     {
  906.         if (_getch() == 13) // The ASCII CODE FOR THE ENTER / RETURN KEY
  907.         {
  908.             break;
  909.         }
  910.     }
  911.  
  912.     gameCredits();
  913. }
  914.  
  915. void ShowConsoleCursor(bool showFlag)
  916. {
  917.     HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
  918.  
  919.     CONSOLE_CURSOR_INFO     cursorInfo;
  920.  
  921.     GetConsoleCursorInfo(out, &cursorInfo);
  922.  
  923.     cursorInfo.bVisible = showFlag; // SET THE CURSOR VISIBILITY
  924.  
  925.     SetConsoleCursorInfo(out, &cursorInfo);
  926. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement