对源程序的一点说明:
在屏幕作图之前, 必须根据显示器适配器种类将显示器设置成为某种图形模
式, 在未设置图形模式之前, 微机系统默认屏幕为文本模式(80列, 25行字符模
式), 此时所有图形函数均不能工作。设置屏幕为图形模式, 可用下列图形初始
化函数:
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所
在的目录路径(即EGAVGA.BGI所在的目录路径)。
本程序中的initgraph函数调用形式为
initgraph(&gdriver,&gmode,"c:\\tc20\\bgi"),其中"c:\\tc20\\bgi"是
我电脑上的图形驱动程序EGAVGA.BGI所在的目录路径。
要使程序在别的电脑上运行,必须改成所在电脑上的图形驱动程序
EGAVGA.BGI所在的目录路径。
/*
Name: hanoime.c
Author: zhuqing
Des cription: HANOI塔问题的递归解的动画演示
Date: 06-08-03 11:44
Copyright:
*/
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#define N 5
#define COLOREXP (i+1)%15
/* 原柱,中间柱,目标柱初值数组 */
char a[]={'1','2','3','4','5','6','7','8','9'};
char b[]={'0','0','0','0','0','0','0','0','0'};
char c[]={'0','0','0','0','0','0','0','0','0'};
int step=0;
int m;
int gdriver,gmode;
int stick1x,stick2x,stick3x;
int base,top,stkwid;
int thick,width;
int startx,starty,endx,endy;
int *pic,size,i;
int dif;
int delaytime;
void disp(int);
void drawplate(int startx,int starty,int endx,int endy,int color){
int i;
setcolor(color);
for(i=startx;i<=endx;i++)
line(i,starty,i,endy);
}
main()
{
thick=10;
width=100;
stkwid=10;
top=120;
stick1x=120;
stick2x=320;
stick3x=520;
dif=16;
delaytime=800000;
printf("\n Please choice disp mode: 1 automatic 2 step by step\n");
scanf("%3d",&m);
gdriver=DETECT;
/* registerbgidriver(EGAVGA_driver); */
initgraph(&gdriver,&gmode,"c:\\tc20\\bgi");
setcolor(BLUE);
setbkcolor(LIGHTCYAN);
base=getmaxy()-60;
line(60,base+1,580,base+1);
setwritemode(XOR_PUT);
setlinestyle(0, 0, 1); /*设置1点宽实线*/
disp(N);
getch();
disp(N);
move(N,a,b,c);
getch();
closegraph();
}
/* 递归函数 */
move(int n,char a1[],char b1[],char c1[])
{
int i=0;
if(n>0){
move(n-1,a1,c1,b1);
c1[n-1]=a1[n-1];
a1[n-1]='0';
disp(N);
while(i<N&&c[i]!='0')i++;
if(i<N){
if(m==1)
delay(delaytime);
else
getch();
disp(N);
move(n-1,b1,a1,c1);
}
}
}
/* 打印输出结果到屏幕的函数 */
void disp(int n)
{
int i;
int count;
int startx,starty,endx,endy;
int color;
stick1x=120;
stick2x=320;
stick3x=520;
/* 画A柱的盘子*/
count=0;
starty=base;
for(i=0;i<N;i++){
if(a[N-1-i]!='0'){
color=COLOREXP;
setcolor(color);
startx=stick1x-(width-dif*i-stkwid)/2;
starty=base-thick*(count+1)-count;
endx=startx+(width-dif*i);
endy=base-thick*count-count;
/* rectangle(startx,starty,endx,endy); */
drawplate(startx,starty,endx,endy,color);
count++;
}
}
/* 画A柱*/
setcolor(BLUE);
rectangle(stick1x,top,stick1x+stkwid,starty);
/* 画B柱的盘子*/
count=0;
starty=base;
for(i=0;i<N;i++){
if(b[N-1-i]!='0'){
color=COLOREXP;
setcolor(color);
startx=stick2x-(width-dif*i-stkwid)/2;
starty=base-thick*(count+1)-count;
endx=startx+(width-dif*i);
endy=base-thick*count-count;
/* rectangle(startx,starty,endx,endy); */
drawplate(startx,starty,endx,endy,color);
count++;
}
}
/* 画B柱*/
setcolor(BLUE);
rectangle(stick2x,top,stick2x+stkwid,starty);
/* 画C柱的盘子*/
count=0;
starty=base;
for(i=0;i<N;i++){
if(c[N-1-i]!='0'){
color=COLOREXP;
setcolor(color);
startx=stick3x-(width-dif*i-stkwid)/2;
starty=base-thick*(count+1)-count;
endx=startx+(width-dif*i);
endy=base-thick*count-count;
/* rectangle(startx,starty,endx,endy); */
drawplate(startx,starty,endx,endy,color);
count++;
}
}
/* 画C柱*/
setcolor(BLUE);
rectangle(stick3x,top,stick3x+stkwid,starty);
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |