// Programmer: Sadjad Refagat 1395/03/01 #include #include #include #include #include #include int move = 0, towerTopDisc[3] = {0}; void printString(char c, int count) { while (count-- > 0) cprintf("%c", c); } void DrawDisk(int discNumber, int layerNumber, char towerName) { int towerNumber = towerName - 64; textcolor(WHITE - discNumber); gotoxy(towerNumber * 20 - discNumber - 1, 24 - layerNumber); cprintf("%d", discNumber); printString('²', discNumber * 2 + 1); } void MoveDisk(int discNumber, char sourceTowerName, char targetTowerName) { int i, step = + 1, sourceTowerNumber = sourceTowerName - 64, targetTowerNumber = targetTowerName - 64, x = sourceTowerNumber * 20 - discNumber - 1; if (sourceTowerNumber > targetTowerNumber) step = -1; for (i = 24 - towerTopDisc[sourceTowerNumber - 1]; i > 8; i--) { DrawDisk(discNumber, 24 - i + 1, sourceTowerName); gotoxy(sourceTowerNumber * 20 - 9, i); for (int j = 0; j <= 19; j++) if (i >= 10 && j == 9) { textcolor(WHITE); cprintf("²"); } else cout << " "; delay(30); } do { x += step; gotoxy(x - 1, 8); textcolor(WHITE - discNumber); cprintf(" %d", discNumber); printString('²', discNumber * 2 + 1); cout << " "; delay(30); } while (x != targetTowerNumber * 20 - discNumber - 1); towerTopDisc[sourceTowerNumber - 1]--; for (i = 8; i < 24 - towerTopDisc[targetTowerNumber - 1] - 1; i++) { gotoxy(targetTowerNumber * 20 - 9, i); for (int j = 0; j <= 19; j++) if (i >= 10 && j == 9) { textcolor(WHITE); cprintf("²"); } else cout << " "; DrawDisk(discNumber, 23 - i, targetTowerName); delay(30); } towerTopDisc[targetTowerNumber - 1]++; } void PrintMoveMap(int discNumber, char sourceTowerName, char targetTowerName) { move++; gotoxy(1, 1); printString(' ', 28); gotoxy(1, 1); cout << setw(4) << move << ": Disk " << discNumber << " " << sourceTowerName << " -> " << targetTowerName << endl; MoveDisk(discNumber, sourceTowerName, targetTowerName); } void DrawTower(int towerNumber) { textcolor(15); int i; for (i = 10; i <= 23; i++) { gotoxy(towerNumber * 20, i); cprintf("²"); } gotoxy(towerNumber * 20 - 9, 24); textcolor(DARKGRAY); printString('Û', 19); gotoxy(towerNumber * 20, 25); cprintf("%c", towerNumber + 64); } void MoveHanoiDisk(int discCount, char sourceTower, char tempTower, char targetTower) { if (discCount == 1) PrintMoveMap(discCount, sourceTower, targetTower); else { MoveHanoiDisk(discCount - 1, sourceTower, targetTower, tempTower); PrintMoveMap(discCount, sourceTower, targetTower); MoveHanoiDisk(discCount - 1, tempTower, sourceTower, targetTower); } } void PrintHash(int left) { for (int j = 3; j <= 24; j++) { gotoxy(left, j); for (int i = 1; i <= 8; i++) if ((i + j) % 2 == 0) { textcolor(DARKGRAY); cprintf("°"); } else { textcolor(9 + rand() % 7); cprintf("²"); } } } void hideCursor() { asm mov ah, 3 asm mov bx, 0 asm int 0x10 asm or ch, 0x20 asm mov ah, 1 asm mov bx, 0 asm int 0x10 } void main() { int discCount, i, len, c = 1; char k, *title = "Hanoi Towers Program in C++", *pattern = "°°°°±±±²²Û"; randomize(); hideCursor(); clrscr(); gotoxy(1, 25); cout << "Press any key to start..."; do { textcolor(c + 8 * (rand() % 2)); gotoxy(1 + rand() % 80, 1 + rand() % 24); cprintf("%c", pattern[rand() % strlen(pattern)]); if (rand() % 123456 == 12345) c++; if (c == 8) c = 1; } while (!kbhit()); getch(); textbackground(BLACK); textcolor(BROWN); clrscr(); printString(' ', 38); cout << "Û Û" << endl; printString(' ', 37); cout << "ÛÛ ÛÛ" << endl; printString(' ', 36); cout << "ÛÛÛ ÛÛÛ" << endl; printString(' ', 33); cout << "Û ÛÛÛÛ ÛÛÛÛ Û" << endl; printString(' ', 32); cout << "ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ" << endl; printString(' ', 29); cout << "Û ÛÛÛÛ ÛÛ ÛÛ ÛÛÛÛ Û" << endl; printString(' ', 28); cout << "ÛÛÛ ÛÛÛÛ ÛÛ ÛÛ ÛÛÛÛ ÛÛÛ" << endl; printString(' ', 27); cout << "ÛÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛÛ ÛÛÛÛ" << endl; printString(' ', 26); cout << "ÛÛÛÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛÛÛÛ" << endl; printString(' ', 27); cout << "ÛÛÛÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛÛÛÛ" << endl; printString(' ', 28); cout << "ÛÛÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛÛÛ" << endl; printString(' ', 30); cout << "ÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛ" << endl; for (i = 0; i < 9; i++) { printString(' ', 31); cout << "ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ" << endl; } gotoxy(20, 22); cout << "University of Applied Science and Technology"; gotoxy(25, 23); cout << "Project for C++ Programming (Basic)"; gotoxy(24, 24); cout << "Professor: Dr. Robab Norouzi Gavganei"; gotoxy(29, 25); cout << "Programmer: Sadjad Refagat"; getch(); clrscr(); textcolor(LIGHTGREEN); gotoxy(24, 2); cprintf("É"); printString('Í', 29); cprintf("»"); gotoxy(24, 3); cprintf("º "); textcolor(WHITE); printString(' ', 27); textcolor(LIGHTGREEN); cprintf(" º"); gotoxy(18, 4); cprintf("ÉÍÍÍÍÍÊ"); printString('Í', 29); cprintf("ÊÍÍÍÍÍÍ»"); gotoxy(18, 5); cprintf("º "); textcolor(LIGHTMAGENTA); cprintf("Programmer: Sadjad Refagat ["); textcolor(LIGHTRED); cprintf("09145041648"); textcolor(LIGHTMAGENTA); cprintf("]"); textcolor(LIGHTGREEN); cprintf(" º"); gotoxy(18, 6); cprintf("È"); printString('Í', 42); cprintf("¼"); gotoxy(10, 7); textbackground(BLUE); textcolor(WHITE); cprintf(" University of Applied Science and Technology "); textbackground(BLACK); PrintHash(1); PrintHash(73); for (i = 1; i <= 3; i++) DrawTower(i); do { gotoxy(1, 1); cout << "Enter number of discs: "; len = 0; discCount = 0; do { do { gotoxy(26, 3); for (int i = 0; i < 27; i++) { textcolor(1 + rand() % 15); cprintf("%c", title[i]); } } while (!kbhit()); gotoxy(24 + len, 1); k = getch(); if (len < 2 && k >= '0' && k <= '9') { len++; cout << k; discCount *= 10; discCount += k - 48; } } while (len <= 0 || k != 13); } while (discCount < 0 || discCount > 10); for (i = 1; i <= discCount; i++) DrawDisk(i, discCount - i + 1, 'A'); towerTopDisc[0] = discCount; if (discCount > 0) { MoveHanoiDisk(discCount, 'A', 'B', 'C'); gotoxy(1, 1); cout << "Total moves: " << move; printString(' ', 15); } getch(); }