Advertisement
PIBogdanov

The Labyrinth

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