我在网上找到的编译出来是cpp的,求帮我弄一个.c的,我改了俩天实在不会了
/*------------------------------------
project : 汉诺塔演示软件;
language: C语言
author: 404name
叠64层需要开全窗口并且将字号调整为6
------------------------------------0-*/
#include <stdio.h>
#include <windows.h>
int len, width, left, mid, right, time;
char map[80][1000];
int next[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //上0下1左2右3;
int turn[2][3] = {{0, 3, 1}, //a -> b b -> c a -> c 上右下
{0, 2, 1}}; //b -> a c -> b c -> a 上左下
void gotoxy(int x, int y)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
int init()
{
system("color 30");
printf("请输入你要递归的\n汉诺塔数目_");
int n;
scanf("%d", &n);
time = 50 / n;
left = 1, mid = 2 * (n + 1), right = mid + 2 * n + 1;
len = 3 * (2 * n + 1);
width = n + 1;
for (int i = 0; i <= width; i++)
{
for (int j = 0, num = i; j <= len; j++)
{
if (i == 0 || j == 0 || i == width || j == len)
map[i][j] = '#';
if ((i > 1 && i < width) && (j == mid - 1 || j == right - 1))
map[i][j] = '|';
if (num && (i >= 1 && i <= width - 1) && j % 2 != 0 && j < mid)
{
map[i][j] = -95;
map[i][j + 1] = -10; //打印 ■ ■占2个字节可以拆开来
num--;
}
}
}
gotoxy(0, 0); //容易出现东西卡顿
for (int i = 0; i <= width; i++)
{
for (int j = 0; j <= len; j++)
printf("%c", map[i][j]);
printf("\n");
}
return n;
}
void play(int x, int y)
{
int turn_0, n = 0, i, j, k, tx, ty, flag = 0;
if ((x == mid && y == right) || (x == left && y == mid) || (x == left && y == right))
turn_0 = 0; //往右
else if ((x == mid && y == left) || (x == right && y == left) || (x == right && y == mid))
turn_0 = 1; //往左
for (i = 1, j = y; i <= width; i++)
{ //目的地
if (map[i][j] != 0)
{
tx = i - 1;
ty = j;
break;
}
}
for (i = 1, j = x; i <= width; i++)
{ //出发点
if (map[i][j] != 0)
{
break;
}
}
while (1)
{
while ((i != 1 || j != x) && (i != 1 || j != y) && (i != tx || j != ty))
{
if (turn_0 == 0)
for (k = mid - 3; k >= 0; k--)
{
map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
map[i][j + k] = 0;
}
else
for (k = 0; k < mid - 2; k++)
{
map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
map[i][j + k] = 0;
}
gotoxy(j, i);
Sleep(time);
for (k = 0; k < mid - 2; k++)
{
printf(" ");
}
i = i + next[turn[turn_0][n]][0];
j = j + next[turn[turn_0][n]][1];
gotoxy(j, i);
Sleep(time);
for (k = 0; k < mid - 2; k++)
{
printf("%c", map[i][j + k]);
}
}
n++; //改变方向;
if (i == tx && j == ty)
return;
if (turn_0 == 0)
for (k = mid - 3; k >= 0; k--)
{
map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
map[i][j + k] = 0;
}
else
for (k = 0; k < mid - 2; k++)
{
map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
map[i][j + k] = 0;
}
gotoxy(j, i);
for (k = 0; k < mid - 2; k++)
{
printf(" ");
}
Sleep(time);
i = i + next[turn[turn_0][n]][0];
j = j + next[turn[turn_0][n]][1];
gotoxy(j, i);
for (k = 0; k < mid - 2; k++)
printf("%c", map[i][j + k]);
Sleep(time);
}
}
void move(int a, int b, int c, char aa, char bb, char cc, int n)
{
if (n == 1)
{
gotoxy(0, width + 1);
printf("from %c to %c", aa, cc);
play(a, c);
return;
}
move(a, c, b, aa, cc, bb, n - 1);
gotoxy(0, width + 1);
printf("from %c to %c", aa, cc);
play(a, c);
move(b, a, c, bb, aa, cc, n - 1);
gotoxy(0, width + 1);
}
int main()
{
int n = init();
move(left, mid, right, 'a', 'b', 'c', n);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include <Windows.h>
int total=0;
int **data;
int total_layer;
int main()
{
void hanoi(int n,int one,int two,int three);
int m;
printf("Please input the number of diskes:");
scanf("%d",&m);
total_layer=m;
data=(int**)malloc(sizeof(int*)*m);
for(int i=0;i<m;i++)
{
data[i]=(int*)malloc(sizeof(int)*3);
data[i][0]=4+2*i;
data[i][1]=0;
data[i][2]=0;
}
printf("The step to move %d diskes:\n",m);
Sleep(2*1000);
hanoi(m,1,2,3);
printf("The beast answer of this game is %d steps.",total);
for(int i=0;i<m;i++)free(data[i]);
free(data);
return 0;
}
void hanoi(int n,int one,int two,int three)
{
void move(int x,int y);
if(n==1)
{
move(one,two);
move(two,three);
}
else
{
hanoi(n-1,one,two,three);
move(one,two);
hanoi(n-1,three,two,one);
move(two,three);
hanoi(n-1,one,two,three);
}
}
void move(int x,int y)
{
void show(int x,int y);
show(x,y);
total=total+1;
Sleep(500);
}
void show(int x,int y)
{
void rectangle(int *len,int n);
static int a[3]={0,0,0};
system("cls");
if(a[0]==0 && a[1]==0 && a[2]==0)a[0]=total_layer;
int width=0;
a[x-1]=a[x-1]-1;
for(int i=0;i<total_layer;i++)
{
if(data[i][x-1]!=0)
{
width=data[i][x-1];
data[i][x-1]=0;
break;
}
}
a[y-1]=a[y-1]+1;
for(int i=0;i<total_layer;i++)
{
if(data[i][y-1]!=0)
{
data[i-1][y-1]=width;
break;
}
else if(i==total_layer-1)
{
data[i][y-1]=width;
}
}
int layer[3];
for(int i=0;i<total_layer;i++)
{
layer[0]=data[i][0];
layer[1]=data[i][1];
layer[2]=data[i][2];
rectangle(layer,total_layer);
}
}
void rectangle(int *len,int n)
{
int x;
x=5+2*(n-1);
printf("\n");
for(int j=0;j<3;j++)
{
printf(" ");
for(int i=0;i<x-len[j]/2;i++)
{
printf(" ");
}
for(int i=0;i<len[j];i++)
{
printf("_");
}
for(int i=0;i<x-len[j]/2;i++)
{
printf(" ");
}
printf(" ");
}
printf("\n");
for(int j=0;j<3;j++)
{
for(int i=0;i<x-len[j]/2;i++)
{
printf(" ");
}
printf("|");
for(int i=0;i<len[j];i++)
{
printf("_");
}
printf("|");
for(int i=0;i<x-len[j]/2;i++)
{
printf(" ");
}
}
printf("\n");
}