神呐!救救我吧!!!明天就答辩了,谁能帮帮我啊。
我的雪花程序运行后有个子菜单,第一项是汉诺塔但是是假的,不能运行。于是我又找了一个真的汉诺塔程序,可是我不会把它们合并成一个程序,各位大哥谁能帮我一下啊,使第一个雪花程序的子菜单汉诺塔程序变成真的----既第2个程序
谢谢啦,我真的好急,明天就交了,怎么办。拜托!!!!!!!!!!
祝新年快乐!!!!!!!!
雪花程序:
/*3. ?′3ìDò*/
/***dsdemo.c?Yê??μí3***/
#include<stdlib.h>
#include<graphics.h>
#define ESC 0x011b
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
struct Snow/*??μ?ò"D?2?êy*/
{
int x;
int y;
int speed;/*??"¨μ??ùè*/
}snow[100];
struct Star/*D?D?μ?ò"D?2?êy*/
{
int x;
int y;
int color;
}star[200];
int key;/*°′?ü±?á?*/
int keyx,keyy;/*?????üμ?×?±ê*/
int snownum=0;/*??μ???êy*/
int size;/*±£′???óòμ?′óD?*/
int change=10;/*±???é"óD1?*/
void *save1,*save2;/*±£′?????*/
void Copy(void);/*±£′???óò*/
void DrawSnow(void);/*??ì?êμ??*/
void Pr(void);/*ê?3?×?ì?*/
void Choose(void);/*?????Yê??úèY*/
void DrawStar(void);/*×?oóμ?D?D?D§1?*/
void DrawBall(int x,int y,int color);/*"-????μ??òì?*/
void Init(void);/*í?D??yˉ*/
void Close(void);/*í?D?1?±?*/
void main(void)
{
Init();
Copy();
DrawSnow();/*??"¨??ˉ*/
Choose();/*?????Yê??úèY*/
DrawStar();/*?áê?"-??*/
Close();
exit(0);
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void Close(void)/*í?D?1?±?*/
{
getch();
closegraph();
}
void Copy(void)/*±£′???óò*/
{
setcolor(0);
setfillstyle(SOLID_FILL,15);
fillellipse(200,200,4,4);
size=imagesize(196,196,204,204);/*¨ò?±£′?í??ó??óò′óD?*/
save1=malloc(size);/*éê??????*/
save2=malloc(size);
getimage(196,196,204,204,save1);/*±£′???"¨*/
getimage(96,96,104,104,save2); /*±£′?±3?°oúé"*/
}
void Pr(void)/*?ú???Dê?3???×?*/
{
settextstyle(0,0,1);
if(change>=20&&change<=30||change>=50&&change<=60||
change>=100&&change<=110)/*éá??D§1?*/
setcolor(YELLOW);
else
setcolor(BLACK);
outtextxy(250,250,"anykey to continue");
setcolor(change/10);/*±?""??é"??ê?±êìa*/
settextstyle(0,0,3);
outtextxy(100,200,"Data Structure Demo");/*±êìa*/
}
/*??ê???"¨μ???ì?1y3ì*/
void DrawSnow(void)
{
int i;
int sx[62];
randomize();
for(i=0;i<62;i++) /*¨ò???"¨μ?x×?±ê*/
sx[i]=(i+2)*10;
cleardevice();
while(!kbhit())
{
Pr();
if(snownum!=100)/*éú3éD?μ???"¨*/
{
snow[snownum].speed=2+random(5);/*?ùè??"ú¨£μ"2"D?óú2*/
i=random(62);
snow[snownum].x=sx[i];/*??"úè?x×?±ê*/
snow[snownum].y=10-random(100);
}
for(i=0;i<snownum;i++)/*�?*/
putimage(snow[i].x,snow[i].y,save2,COPY_PUT);
Pr(); /*??ê?±êìa*/
if(snownum!=100)
snownum++;
setfillstyle(SOLID_FILL,15);/*"-??*/
for(i=0;i<snownum;i++)
{
snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save1,COPY_PUT);
if(snow[i].y>500)
snow[i].y=10-random(200);
}
change++;
if(change==140)/*??é"±?"ˉ*/
change=10;
}
}
/*"-????μ??òì?xoíy?a×?±ê£color?a?òμ???é"*/
void DrawBall(int x,int y,int color)
{
setcolor(0);
setfillstyle(SOLID_FILL,color);
fillellipse(x,y+10,10,10);
}
/*?????Yê?oˉêy*/
void Choose(void)
{
int yes;/*?D?ê?·?í?3?????£12"í?3?0í?3?*/
int oyes=1;
while(oyes)
{
Init();
cleardevice();
yes=1;
keyx=140;
keyy=150;
setcolor(11);
rectangle(40,40,600,440);/*"-±??ò??/
setcolor(13);
settextstyle(0,0,3);/*±êìa′óò"D?*/
outtextxy(100,70,"Data Structure Demo");
settextstyle(0,0,2);/*???ü????D?ò"D?*/
setcolor(RED);
outtextxy(200,150,"hanoi tower");/*oo?μ?t*/
setcolor(BLUE);
outtextxy(200,190,"double link");/*?"á′±í*/
setcolor(GREEN);
outtextxy(200,230,"bubble sorting"); /*?e?Y??Dò*/
setcolor(YELLOW);
outtextxy(200,270,"radix sorting"); /*"ùêy??Dò*/
setcolor(10);
outtextxy(200,310,"binary serach"); /*t·?2é?ò*/
setcolor(MAGENTA);
outtextxy(200,350,"binary tree"); /* t2?ê÷±éàú*/
setcolor(WHITE);
outtextxy(200,390,"exit");/*?áê?3ìDò*/
DrawBall(keyx,keyy,11);
while(yes)
/*????μ??-"·ì??t*/
{
key=bioskey(0);
if(key==ESC)/*í?3??μí3*/
break;
if(key==UP)/*é??ü?ì2ù×÷*/
{
DrawBall(keyx,keyy,BLACK);/*?èó?oúé"?ú?-à′?"??è¥3y?ò*/
if(keyy!=150)
keyy-=40;
else
keyy=390;
DrawBall(keyx,keyy,11);/*D??"??ê?3??ò*/
}
if(key==DOWN)/*???ü?ì2ù×÷*/
{
DrawBall(keyx,keyy,BLACK);/*?èó?oúé"?ú?-à′?"??è¥3y?ò*/
if(keyy!=390)
keyy+=40;
else
keyy=150;
DrawBall(keyx,keyy,11);/*D??"??ê?3??ò*/
}
if(key==ENTER)/*è·¨?ü*/
{
switch(keyy)/*?D??úèY*/
{
case 150:system("hanoi");yes=0;break;/*μ÷ó?oo?μ?t*/
case 190:system("dblink");yes=0;break;/*μ÷ó??"á′±í*/
case 230:system("bubble");yes=0;break;/*μ÷ó??e?Y??Dò*/
case 270:system("radix");yes=0;break;/*μ÷ó?"ùêy??Dò*/
case 310:system("binary");yes=0;break;/*μ÷ó?t·?2é?ò*/
case 350:system("tree2");yes=0;break; /*μ÷ó?t2?ê÷*/
case 390: yes=0;oyes=0;/*exit????*/
}/*endswitch*/
} /*endenter*/
} /*endwhile*/
} /*endwhile*/
}
/*?áê?"-??*/
void DrawStar(void)
{
int i;
cleardevice();
setcolor(GREEN);
settextstyle(0,0,2);
while(!kbhit())
{
for(i=0;i<200;i++)/*??"úéú3éD?D?*/
{
star[i].x=random(640);
star[i].y=random(480);
star[i].color=random(13)+1;
}
for(i=0;i<200;i++)/*ê?3?D?D?*/
{
putpixel(star[i].x,star[i].y,star[i].color);
delay(100);
}
outtextxy(100,200,"Thank you for use this system");
sleep(1);
for(i=0;i<200;i++)/*è¥3yD?D?*/
{
putpixel(star[i].x,star[i].y,0);
delay(50);
}
}
}
/*汉诺塔源程序*/
/********hanoi.c*********/
#include <graphics.h>
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d",&n);
printf("Please input 1 or 2:\ 2.people\n");
scanf("%d",&i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
for(i=0;i<3;i++)
num[i].top=-1;/*三个地方的高度开始都为-1*/
for(i=0;i<n;i++)/*画一开始的塔座A上的盘子*/
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"--->");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}