📜  使用 C/C++ 计算机图形学制作河内塔动画

📅  最后修改于: 2022-05-13 01:54:54.855000             🧑  作者: Mango

使用 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 基础课程