使用 C/C++ 计算机图形学制作河内塔动画
任务是使用 C/C++ 中的计算机图形设计河内塔。
河内塔:这是一个数学问题,其中有三个塔和N个磁盘。问题是按照以下规则将所有磁盘从第一个塔移动到第三个塔:
- 一次只能移动一个磁盘,一次不能移动两个或两个以上的磁盘。
- 在移动磁盘时,用户必须记住较小的磁盘将始终位于较大的磁盘之上。
- 这意味着较大的将在塔的底部,较小的将在塔的顶部。
函数:
- rectangle(l, t, r, b):来自 graphics.h 头文件的函数,它从左 (l) 到右 (r) & 从顶部 (t) 到底部 (b) 绘制一个矩形。
- line(a1, b1, a2, b2):来自 graphics.h 头文件的函数,它绘制一条从点(a1, b1)到点(a2, b2) 的线。
- setfillstyle(pattern, color):一个来自 graphics.h 头文件的函数,我们可以通过它给出一个绘图模式和一个特定的颜色。
- floodfill(a, b, c):来自 graphics.h 头文件的一个函数,我们可以通过它在特定的有界区域内着色,以 (a, b) 为中心,c 为边框颜色。
- outtextxy(int x, int y, char * 字符串):一个来自 graphics.h 头文件的函数,我们可以通过它打印任何语句,其中 x, y 是点的坐标,第三个参数包含字符串的地址到被显示。
- settextstyle(int font, int direction, int font_size): graphics.h 头文件中的一个函数,我们可以通过它来制作可打印文本的样式,其中 font 参数指定文本的字体,Direction 可以是HORIZ_DIR(从左到右)或VERT_DIR(自下而上) 。
方法:
- 这里制作了一个动画,其中实现了河内问题的 3 盘塔。整个过程将分 7 个阶段完成。
- 总共定义了九个函数,start()、p1()、p2()、p3()、p4()、p5()、p6()、p7()、outline()。
- 首先,调用 start()函数。打印一条消息“开始状态”。然后使用 rectangle()函数实现总共三个磁盘。然后上色。较低的较大的为红色,中间的为蓝色,较小的顶部为绿色。所有着色都是由setfillstyle()和floodfill()函数完成的。最后调用outline()。
- 在大纲()函数实现的塔使用线()函数,并打印塔的数量也。
- 然后调用 p1()函数。 cleardevice()函数将清除屏幕。在这里,将较小的绿色圆盘移动到第三个塔。然后调用 outline()函数。此外,打印消息'1st Phase' 。
- 然后调用 p2()函数。 cleardevice()函数将清除屏幕。在这里,将较小的蓝色圆盘移至第二个塔。然后也会调用outline()函数。此外,打印消息'2nd Phase' 。
- 然后将调用 p3()函数。 cleardevice()函数将清除屏幕。在这里,将较小的绿色圆盘移至蓝色圆盘顶部的第二个塔。然后也会调用outline()函数。此外,打印消息'3rd Phase' 。
- 然后将调用 p4()函数。 cleardevice()函数将清除屏幕。在这里,将较大的红色圆盘移至第三个塔。然后也会调用outline()函数。此外,打印消息'4th Phase' 。
- 然后将调用 p5()函数。 cleardevice()函数将清除屏幕。在这里,将较小的绿色圆盘移至第一个塔。然后也调用 outline()函数。此外,打印消息'5th Phase' 。
- 然后调用 p6()函数。 cleardevice()函数将清除屏幕。在这里,将较小的蓝盘移动到红盘顶部的第三个塔。然后也会调用outline()函数。此外,打印消息'6th Phase' 。
- 然后将调用 p7()函数。 cleardevice()函数将清除屏幕。在这里,将较小的绿色圆盘移动到蓝色圆盘顶部的第三个塔。然后也会调用outline()函数。此外,打印消息'7th Phase' 。至此动画制作完成。
下面是上述方法的实现:
C
// C program for the above approach
#include
#include
#include
// Function for moving the Green Disk
// to Third Tower On Top Of Blue Disk
void p7()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "7th Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(850, 500, 950, 550);
floodfill(855, 545, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(875, 450, 925, 500);
floodfill(880, 495, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(825, 600, 975, 550);
floodfill(830, 555, 15);
// Calling outline() function
outline();
}
// Function to find the moving the Blue
// Disk To Third Tower On Top Of Red Disk
void p6()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "6th Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(850, 500, 950, 550);
floodfill(855, 545, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(275, 600, 325, 550);
floodfill(280, 595, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(825, 600, 975, 550);
floodfill(830, 555, 15);
// Calling outline() function
outline();
}
// Function to find the moving Green Disk
// To the First Tower
void p5()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "5th Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(550, 550, 650, 600);
floodfill(555, 595, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(275, 600, 325, 550);
floodfill(280, 595, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(825, 600, 975, 550);
floodfill(830, 555, 15);
// Calling outline() function
outline();
}
// Moving Red Disk To Third Tower
void p4()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "4th Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(550, 550, 650, 600);
floodfill(555, 595, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(575, 500, 625, 550);
floodfill(580, 545, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(825, 600, 975, 550);
floodfill(830, 555, 15);
// Calling outline() function
outline();
}
// Function for moving the Green Disk
// To Second Tower On Top Of Blue Disk
void p3()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "3rd Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(550, 550, 650, 600);
floodfill(555, 595, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(575, 500, 625, 550);
floodfill(580, 545, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(225, 550, 375, 600);
floodfill(230, 590, 15);
// Calling outline() function
outline();
}
// Function for moving the Blue Disk
// To Second Tower
void p2()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "2nd Phase");
setfillstyle(SOLID_FILL, BLUE);
rectangle(550, 550, 650, 600);
floodfill(555, 595, 15);
setfillstyle(SOLID_FILL, GREEN);
rectangle(875, 600, 925, 550);
floodfill(880, 595, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(225, 550, 375, 600);
floodfill(230, 590, 15);
// Calling outline() function
outline();
}
// Function for moving the Green Disk
// To Third Tower
void p1()
{
getch();
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "1st Phase");
setfillstyle(SOLID_FILL, GREEN);
rectangle(875, 600, 925, 550);
floodfill(880, 595, 15);
setfillstyle(SOLID_FILL, RED);
rectangle(225, 550, 375, 600);
floodfill(230, 590, 15);
setfillstyle(SOLID_FILL, BLUE);
rectangle(250, 500, 350, 550);
floodfill(255, 545, 15);
// Calling outline() function
outline();
}
// Function to start the animations
void start()
{
// Starting Condition
cleardevice();
settextstyle(8, 0, 4);
outtextxy(500, 50, "Begining State");
// Red Coloring Of Disk
setfillstyle(SOLID_FILL, RED);
rectangle(225, 550, 375, 600);
floodfill(230, 590, 15);
// Blue Coloring Of Disk
setfillstyle(SOLID_FILL, BLUE);
rectangle(250, 500, 350, 550);
floodfill(255, 545, 15);
// Green Coloring Of Disk
setfillstyle(SOLID_FILL, GREEN);
rectangle(275, 450, 325, 500);
floodfill(285, 495, 15);
// calling outline() function
outline();
}
// Function to print the outlines of
// the animations
void outline()
{
// Main Base
line(100, 600, 1100, 600);
// 1st Line
line(300, 600, 300, 300);
// 2nd Line
line(600, 600, 600, 300);
// 3rd Line
line(900, 600, 900, 300);
// Printing Message
settextstyle(8, 0, 2);
outtextxy(290, 620, "(1)");
outtextxy(590, 620, "(2)");
outtextxy(890, 620, "(3)");
}
// Driver Code
void main()
{
int gd = DETECT, gm;
// Initialize of gdriver with
// DETECT macros
initgraph(&gd, &gm, "C:\\turboc3\\bgi");
// Calling start() function
start();
// Calling p1() function
p1();
// Calling p2() function
p2();
// Calling p3() function
p3();
// Calling p4() function
p4();
// Calling p5() function
p5();
// Calling p6() function
p6();
// Calling p7() function
p7();
// Holding screen for a while
getch();
// Close the initialized gdriver
closegraph();
}
输出:
想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程。