先前发表了如何设计一个动态简单的汉诺塔初始化图形,下面进一步学习如何设计三个汉诺塔,一个汉诺塔就不叫汉诺塔游戏了,其中一个有盘子的汉诺塔已经设计好了,还有两个用来转移汉诺塔的盘子,也就设计成一个没有盘子的柱子就行了。经过改进,增加了两个二维字符数组,中间控制打印图形方面的算法也稍微改了一些,简单的汉诺塔图形就初步形成了。
图形如下:
代码如下:
#include <stdio.h>
#define N 10 //数组的行
#define M 19 //数组的列
char a[N][M], b[N][M], c[N][M];
void InitHanoi(int n) //初始化图形
{
for(int i=0; i<10; i++) //控制行
{
for(int j=0; j<19; j++)//控制列
{
if(j==9) //每个汉诺塔的第9列都以|为柱子
{
a[i][j] = '|';
b[i][j] = '|';
c[i][j] = '|';
}
else
{
if(i>=N-n) //输出n层汉诺塔的盘子
{
int k=i+n-10+1; //随着i(行)的增加,打印*的左右范围扩大
if(j>=9-k&&j<=9+k)
{
a[i][j] = '*';
}
else //在盘子部分也有打印空字符的部分
{
a[i][j] = ' ';
}
}
else //上面已经打印空了但严格来讲i<N-n那部分也要打印空字符
{
a[i][j] = ' ';
}
b[i][j] = ' '; //两个汉诺塔除了打印柱子,还需要打印空字符
c[i][j] = ' ';
}
}
}
}
void DrawHanoi() //打印汉诺塔
{ int i, j;
for(i=0; i<10; i++)
{
for(j=0; j<19; j++) //打印第一个汉诺塔初始化图形
{
printf("%c",a[i][j]);
}
for(j=0; j<19; j++) //打印第二个汉诺塔初始化图形
{
printf("%c",b[i][j]);
}
for(j=0; j<19; j++) //打印第三个个汉诺塔初始化图形
{
printf("%c",c[i][j]);
}
printf("\n"); //打印完一行换行
}
printf("---------------------------------------------------------------\n");
}
int main()
{ int n; //汉诺塔的层数
printf("请输入汉诺塔的层数:");
scanf("%d",&n);//(汉诺塔层数要小于10大于0)
printf("\n\n\n");
InitHanoi(n); //初始化汉诺塔的数组
DrawHanoi(); //打印汉诺塔
return 0;
}