Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <conio.h>
- #define KEY_ESCAPE 27
- #define KEY_ARROW 224
- #define KEY_UP 72
- #define KEY_DOWN 80
- #define KEY_LEFT 75
- #define KEY_RIGHT 77
- #define DIR_LEFT -1
- #define DIR_RIGHT 1
- #define INSTRUCTIONS " =====\t Towers of Hanoi \t===== \n"\
- " Use arrow keys to control\n"\
- " U/D: Change block\n"\
- " L/R: Move selected block left or right\n\n"\
- " Move all blocks to another tower to win!\n\n"
- #define INVALID_MOVE " Invalid move!\n"
- const char TOWER_ITEM[5][10] = {
- " = ",
- " === ",
- " ===== ",
- " ======= ",
- " | "
- };
- int BLOCK[4];
- void DrawTowers(int selection) {
- int i, j;
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- printf("%s", TOWER_ITEM[4]);
- }
- printf("\n");
- for (j = 0; j < 3; j++) {
- if (BLOCK[i] == j) {
- printf("%s", TOWER_ITEM[i]);
- }
- else {
- printf("%s", TOWER_ITEM[4]);
- }
- }
- printf("\n");
- }
- printf(" Current Block: %i\n\n", (selection + 1));
- }
- void MoveBlock(int block, int direction) {
- int limit;
- limit = (direction == DIR_LEFT) ? (0) : (2);
- if (BLOCK[block] == limit) {
- printf("%s", INVALID_MOVE);
- }
- else if (block != 0) {
- int i, clear;
- clear = 1;
- for (i = block; i != 0; i--) {
- if ((BLOCK[i - 1] == BLOCK[block]) || (BLOCK[i - 1] == (BLOCK[block] + direction))) {
- clear = 0;
- break;
- }
- }
- if (clear == 1) {
- BLOCK[block] += direction;
- }
- else {
- printf("%s", INVALID_MOVE);
- }
- }
- else {
- BLOCK[block] += direction;
- }
- }
- bool CheckWin() {
- bool result;
- int i, tower;
- result = false;
- tower = BLOCK[0];
- if (tower != 0) {
- result = true;
- for (i = 1; i < 4; i++) {
- if (BLOCK[i] != tower) {
- result = false;
- break;
- }
- }
- }
- return result;
- }
- int main() {
- int key, currBlock;
- BLOCK[0] = 0;
- BLOCK[1] = 0;
- BLOCK[2] = 0;
- BLOCK[3] = 0;
- currBlock = 0;
- printf("%s", INSTRUCTIONS);
- DrawTowers(currBlock);
- while (1) {
- key = _getch();
- if (key == KEY_ESCAPE) {
- break;
- }
- else if (key == KEY_ARROW) {
- key = _getch();
- switch (key) {
- case KEY_UP:
- currBlock = (currBlock != 0) ? (currBlock - 1) : (0);
- break;
- case KEY_DOWN:
- currBlock = (currBlock != 3) ? (currBlock + 1) : (3);
- break;
- case KEY_LEFT:
- MoveBlock(currBlock, DIR_LEFT);
- break;
- case KEY_RIGHT:
- MoveBlock(currBlock, DIR_RIGHT);
- break;
- }
- DrawTowers(currBlock);
- if (CheckWin()) {
- printf(" YOU WON!\n Press any key to exit...");
- _getch();
- break;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement