diff --git a/Hanoi.cpp b/Hanoi.cpp new file mode 100644 index 0000000..68a7eaa --- /dev/null +++ b/Hanoi.cpp @@ -0,0 +1,234 @@ +#include +#include +#include + +//COLORS +#define BLACK 0 +#define BLUE 1 +#define GREEN 2 +#define AQUA 3 +#define RED 4 +#define PURPLE 5 +#define YELLOW 6 +#define WHITE 7 +#define GRAY 8 +#define LIGHT_BLUE 9 +#define LIGHT_GREEN 10 +#define LIGHT_AQUA 11 +#define LIGHT_RED 12 +#define LIGHT_PURPLE 13 +#define LIGHT_YELLOW 14 +#define BRIGHT_WHITE 15 + +unsigned int counter = 0; +unsigned int maxx = 0; + +HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + +void gotoxy(int x, int y) +{ + COORD c; + c.X = x; + c.Y = y; + SetConsoleCursorPosition(hConsole, c); +} + +char getCursorChar() +{ + char c = '\0'; + CONSOLE_SCREEN_BUFFER_INFO con; + if (hConsole != INVALID_HANDLE_VALUE && + GetConsoleScreenBufferInfo(hConsole, &con)) + { + DWORD read = 0; + if (!ReadConsoleOutputCharacterA(hConsole, &c, 1, + con.dwCursorPosition, &read) || read != 1 + ) + c = '\0'; + } + return c; +} + +char readChar(int x, int y) +{ + gotoxy(x, y); + char c = getCursorChar(); + return c; +} + +void vanishCursor() +{ + CONSOLE_CURSOR_INFO info; + info.dwSize = 100; + info.bVisible = FALSE; + SetConsoleCursorInfo(hConsole, &info); +} + +void color(int foreground, int background) +{ + int color = (background * 16) + foreground; + SetConsoleTextAttribute(hConsole, color); +} + +int getColor(int n) +{ + switch (n) + { + case 1: + return LIGHT_GREEN; + case 2: + return YELLOW; + case 3: + return BLUE; + case 4: + return LIGHT_RED; + case 5: + return RED; + default: + return 0; + } +} + +void generatePoles() +{ + color(WHITE, BLACK); + gotoxy(15, 20); + std::cout << "-----+-----"; + gotoxy(30, 20); + std::cout << "-----+-----"; + gotoxy(45, 20); + std::cout << "-----+-----"; + + for (int i = 1; i <= 5; i++) + { + gotoxy(20, 20 - i); + std::cout << "|"; + gotoxy(35, 20 - i); + std::cout << "|"; + gotoxy(50, 20 - i); + std::cout << "|"; + } +} + +void generateRing(int n) +{ + for (int j = n; j > 0; j--) + { + color(getColor(j), BLACK); + for (int i = 0; i < j; i++) + { + gotoxy(21 + i, (19 - n) + j); + std::cout << "_"; + gotoxy(19 - i, (19 - n) + j); + std::cout << "_"; + } + } + +} + +void editRing(char action, int n, char pole, int total) +{ + int x = 0; + switch (pole) + { + case 'A': + x = 20; + break; + case 'B': + x = 35; + break; + case 'C': + x = 50; + break; + } + + switch (action) + { + case 'P': + case 'p': + for (int i = 0; i < total; i++) + { + if (readChar(x + 1, 19 - i) == ' ') + { + for (int j = 0; j < n; j++) + { + color(getColor(n), BLACK); + gotoxy(x + 1 + j, 19 - i); + std::cout << "_"; + gotoxy(x - 1 - j, 19 - i); + std::cout << "_"; + } + break; + } + } + break; + case 'r': + case 'R': + for (int i = 0; i < total + 1; i++) + { + if (readChar(x + 1, 19 - i) == ' ') + { + for (int j = 0; j < total; j++) + { + gotoxy(x + 1 + j, 19 - i + 1); + std::cout << " "; + gotoxy(x - 1 - j, 19 - i + 1); + std::cout << " "; + } + } + } + break; + } +} + +void hanoi(int n, char x, char y, char z) +{ + if (n > maxx) maxx = n; + if (n == 1) + { + editRing('R', n, x, maxx); + editRing('P', n, y, maxx); + Sleep(1000); + } + else + { + hanoi(n - 1, x, z, y); + editRing('R', n, x, maxx); + editRing('P', n, y, maxx); + Sleep(1000); + hanoi(n - 1, z, y, x); + } +} + +void hanoiMain(int n) +{ + generatePoles(); + generateRing(n); + Sleep(1000); + hanoi(n, 'A', 'B', 'C'); +} + +int main() +{ + vanishCursor(); + int n; + while (1) + { + std::cout << "How many rings? "; + std::cin >> n; + if (n > 5 || n < 3) + { + std::cout << "Select a number between 3 and 5" << std::endl; + n = 0; + } + else + { + system("cls"); + hanoiMain(n); + break; + } + } + color(WHITE, BLACK); + gotoxy(0, 0); + return 0; +} \ No newline at end of file diff --git a/Hanoi.sln b/Hanoi.sln new file mode 100644 index 0000000..fa5f499 --- /dev/null +++ b/Hanoi.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30523.141 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Hanoi", "Hanoi.vcxproj", "{AF18BCDC-F52C-41BA-9F04-EF47025D1B00}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Debug|x64.ActiveCfg = Debug|x64 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Debug|x64.Build.0 = Debug|x64 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Debug|x86.ActiveCfg = Debug|Win32 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Debug|x86.Build.0 = Debug|Win32 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Release|x64.ActiveCfg = Release|x64 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Release|x64.Build.0 = Release|x64 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Release|x86.ActiveCfg = Release|Win32 + {AF18BCDC-F52C-41BA-9F04-EF47025D1B00}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1FE5F2FE-8E15-4671-B9AC-63E0AF9AD87B} + EndGlobalSection +EndGlobal diff --git a/Hanoi.vcxproj b/Hanoi.vcxproj new file mode 100644 index 0000000..bed4b73 --- /dev/null +++ b/Hanoi.vcxproj @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {af18bcdc-f52c-41ba-9f04-ef47025d1b00} + Hanoi + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/Hanoi.vcxproj.filters b/Hanoi.vcxproj.filters new file mode 100644 index 0000000..57b21bf --- /dev/null +++ b/Hanoi.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file