Advertisement
PIBogdanov

The Labyrinth

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