C语言-汉诺塔-图形化表达

本文基于:(1条消息) C语言实现汉诺塔【图文讲解】_圣喵的博客-CSDN博客_汉诺塔c语言代码进行改造编写

#include <stdio.h>
#include<windows.h>
int A = 1, B = 1, C = 1;//A 0-4 B 5-9 C 10-14
int a[10] = {}, b[10] = {}, c[10] = {};
void set_win_wh(int w, int h);
void goto_xy(short x, short y);
void chu_shi_hua(int tower);
void disks_A_B(void);
void disks_A_C(void);
void disks_B_C(void);
void disks_B_A(void);
void disks_C_A(void);
void disks_C_B(void);
void move_disk(char A, char B, char C, int tower);
void panduan(char A, char C);
int main() {
	int tower;
	printf("输入汉诺塔层数");
	scanf("%d", &tower);
	set_win_wh(20, tower + 20);
	SetConsoleTitle("汉诺塔游戏");
	system("cls");
	A = tower + 1;
	B = tower + 1;
	C = tower + 1;
	chu_shi_hua(tower);
	move_disk('A', 'B', 'C', tower);
	goto_xy(20, tower + 5);
	for (int i = 0; i <= tower; i++) {
		printf("\n");
	}
}
void move_disk(char A, char B, char C, int tower) {
	if (tower == 1) {
		panduan(A, C);
	} else {
		move_disk(A, C, B, tower - 1);
		panduan(A, C);
		move_disk(B, A, C, tower - 1);
	}
}
void panduan(char A, char C) {
	Sleep(500);
	if (A == 65 && C == 67) {// 65 66 67
		disks_A_C();
	} else if (A == 66 && C == 67) {
		disks_B_C();
	} else if (A == 65 && C == 66) {
		disks_A_B();
	} else if (A == 67 && C == 66) {
		disks_C_B();
	} else if (A == 66 && C == 65) {
		disks_B_A();
	} else if (A == 67 && C == 65) {
		disks_C_A();
	}
}
void disks_A_B(void) {
	goto_xy(0, A + 1);
	printf("  |  ");
	goto_xy(5, B);
	printf("(_%d_)", a[A + 1]);
	b[B] = a[A + 1];
	a[A + 1] = 0;
	A = A + 1;
	B = B - 1;
}
void disks_A_C(void) {
	goto_xy(0, A + 1);
	printf("  |  ");
	goto_xy(10, C);
	printf("(_%d_)", a[A + 1]);
	c[C] = a[A + 1];
	a[A + 1] = 0;
	A = A + 1;
	C = C - 1;
}
void disks_B_C(void) {
	goto_xy(5, B + 1);
	printf("  |  ");
	goto_xy(10, C);
	printf("(_%d_)", b[B + 1]);
	c[C] = b[B + 1];
	b[B + 1] = 0;
	B = B + 1;
	C = C - 1;
}
void disks_B_A(void) {
	goto_xy(5, B + 1);
	printf("  |  ");
	goto_xy(0, A);
	printf("(_%d_)", b[B + 1]);
	a[A] = b[B + 1];
	b[B + 1] = 0;
	B = B + 1;
	A = A - 1;
}
void disks_C_A(void) {
	goto_xy(10, C + 1);
	printf("  |  ");
	goto_xy(0, A);
	printf("(_%d_)", c[C + 1]);
	a[A] = c[C + 1];
	c[C + 1] = 0;
	C = C + 1;
	A = A - 1;
}
void disks_C_B(void) {
	goto_xy(10, C + 1);
	printf("  |  ");
	goto_xy(5, B);
	printf("(_%d_)", c[C + 1]);
	b[B] = c[C + 1];
	c[C + 1] = 0;
	C = C + 1;
	B = B - 1;
}
void chu_shi_hua(int tower) {
	for (int i = 0; i <= tower + 1; i++) {
		goto_xy(2, i);
		printf("|");
	}
	for (int i = 0; i <= tower + 1; i++) {
		goto_xy(7, i);
		printf("|");
	}
	for (int i = 0; i <= tower + 1; i++) {
		goto_xy(12, i);
		printf("|");
	}
	for (int i = tower; i >= 1; i--) {
		goto_xy(0, i + 1);
		printf("(_%d_)", i);
	}
	goto_xy(0, tower + 2);
	printf("===============");
	A = A - tower;
	for (int i = tower; i >= 1; i--) {
		a[i + 1] = i;
	}
}
void set_win_wh(int w, int h) {
	char cmdstr[40];
	sprintf(cmdstr, "mode con cols=%d lines=%d", w, h);
	system( cmdstr);
}
void goto_xy(short x, short y) {
	COORD pos = {x, y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

其中自定义函数goto_xy是windows移动光标自定义函数

自定义函数set_win_wh是设置窗口大小

自定义函数chu_shi_hua顾名思义初始化汉诺塔界面

自定义函数disk X_X 代表从X位移动到X位

本程序最多支持最大8个圆盘(事实上越多的圆盘跑完整个程序花费的时间会成指数级增长,所以我就懒得去额外声明其他了)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值