Advertisement
PIBogdanov

The Labyrinth

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