• ege图形库之动画排序


    老师布置了一个学习ege图形库来做动画排序的小动画程序,这是我自己做的效果。由于个人水平有限,可能代码有些地方可以改进。不足之处敬请指出。

    注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作。具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html

    编程环境:codeblocks   windows10  corei5 cpu

    源代码:


    #include<graphics.h>
    #include<cmath>
    class fireball//烟花火球类
    {
    private:
    double x;
    double y;
    double vx;
    double vy;
    int r;
    public:
    void setfireball(double a,double b,double c,double d){x=a;y=b;vx=c;vy=d;}
    void setx(double a){x=a;}
    double getx(){return x;}
    void sety(double a){y=a;}
    double gety(){return y;}
    void setvx(double a){vx=a;}
    double getvx(){return vx;}
    void setvy(double a){vy=a;}
    double getvy(){return vy;}
    void explode(){}
    void setr(int a){r=a;}
    int getr(){return r;}
    void show()
    {
    //模拟的是抛体运动
    setx(getx()+vx);
    sety(gety()+vy);
    vy+=0.3f;
    fillellipse(x,y,r,r);
    }
    };
    class firework//烟花类
    {
    private:
    fireball f[80];//用80个火球类作为烟花类的子对象
    int x0;int y0;
    public:
    int getx0(){return x0;}
    int gety0(){return y0;}
    int c=255;
    void setfirework(int x,int y,int r)
    {
    double angle=0;
    for(int i=0;i<80;i++)
    {
    f[i].setvx(8*cos(angle));f[i].setvy(8*sin(angle));f[i].setx(x);f[i].sety(y);f[i].setr(r);
    angle+=0.078539;
    }
    x0=x;y0=y;
    }
    void showfirework()
    {
    c--;
    setfillcolor(EGERGB(c,c,0));
    fillellipse(x0,y0,5,5);
    for(int i=0;i<80;i++){if(i%2==0)setfillcolor(EGERGB(255,0,0));else setfillcolor(EGERGB(0,255,0));if(i%3==0)setfillcolor(EGERGB(255,255,0));f[i].show();}
    }
    };
    void fireworkscene(int num)//用若干个烟花组成一个烟花景象
    {
    while(num--)
    {
    setbkcolor(EGERGB(0x0,0x0,0x0));
    setbkmode(TRANSPARENT);
    //firework fw[15];
    //for(int i=0;i<15;i++)fw[i].setfirework(40+i*40,100);
    firework f;f.setfirework(320,100,3);firework f2;f2.setfirework(200,78,2);firework f3;f3.setfirework(480,148,1);
    int count=0;int y2=480,y3=480;int y=480;firework f4;f4.setfirework(150,350-100,3);firework f5;f5.setfirework(400,380-100,1);firework f6;f6.setfirework(500,398-100,2);
    int y4=480,y5=480,y6=480;firework f7;f7.setfirework(198,230,1);firework f9;f9.setfirework(322,200,1);firework f8;f8.setfirework(448,269,2);firework f10;f10.setfirework(336,70,3);
    int y7=480,y8=480,y9=480;int y10=480;
    for(;is_run()&&count<200;delay_fps(80))
    {count++;
    imagefilter_blurring(NULL, 0x7e, 0xff);
    setcolor(EGERGB(255,255,255));
    if(y2>f2.gety0())circle(f2.getx0(),y2=y2-4,3);
    else f2.showfirework();
    if(y3>f3.gety0())circle(f3.getx0(),y3=y3-4,3);
    else f3.showfirework();
    if(y>f.gety0())circle(f.getx0(),y=y-4,3);
    else f.showfirework();
    if(y4>f4.gety0())circle(f4.getx0(),y4=y4-4,3);
    else f4.showfirework();
    if(y5>f5.gety0())circle(f5.getx0(),y5=y5-4,3);
    else f5.showfirework();
    if(y6>f6.gety0())circle(f6.getx0(),y6=y6-4,3);
    else f6.showfirework();
    if(y7>f7.gety0())circle(f7.getx0(),y7=y7-4,3);
    else f7.showfirework();
    if(y8>f8.gety0())circle(f8.getx0(),y8=y8-4,3);
    else f8.showfirework();
    if(y9>f9.gety0())circle(f9.getx0(),y9=y9-4,3);
    else f9.showfirework();
    if(y10>f10.gety0())circle(f10.getx0(),y10=y10-4,3);
    else f10.showfirework();

    setfillcolor(EGERGB(255,255,0));
    fillellipse(500,50,20,20);//金黄色的月亮
    for(int i=0;i<30;i++)
    {
    fillellipse((i*i*34+i*8*8*i*i-3)%640,(i*i*i*28+i*8+i*i-232)%240,1,1);//美丽的星星
    }
    }
    }
    }
    class box//条形柱
    {
    private:
    int x1;int h;
    bool highlight;
    bool flag;
    public:
    void setflag(bool n){flag=n;}
    bool getflag(){return flag;}
    void sethighlight(int b){highlight=b;}
    bool gethighlight(){return highlight;}
    int getx1(){return x1;}
    int geth(){return h;}
    void setx1(int a){x1=a;}
    void seth(int b){h=b;}
    box(int a=0,int b=0):x1(a),h(b){highlight=0;}
    void setbox(int x,int h0)
    {
    x1=x;h=h0;flag=0;
    }
    void showfall()
    {
    if(gethighlight())setfillcolor(EGERGB(255,0x0,0x0));
    else setfillcolor(EGERGB(0,0,255));
    int h0=-400;int i=0;
    for(;is_run()&&h0<=0;delay_fps(10+2*i))
    {
    cleardevice();
    for(int i=0;i<30;i++)
    {
    fillellipse((i*i*34+i*8*8*i*i-3)%640,(i*i*i*28+i*8+i*i-232)%240,1,1);//美丽的星星
    }
    bar(x1,400-h+h0,x1+20,400+h0);
    setfont(18,0,"宋体");
    int l=0;
    int n=geth();int m;int n0=geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int i=0;i<l;i++)
    {
    m=n0%10;n0=n0/10;ch[l-i-1]='0'+m;
    }
    outtextxy(x1,400-h-25+h0,ch);
    i++;
    h0=h0+1;
    }
    for(int i=0;i<10;i++)
    {
    int l=0;
    int n=geth();int m;int n0=geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int i=0;i<l;i++)
    {
    m=n0%10;n0=n0/10;ch[l-i-1]='0'+m;
    }
    delay_fps(60-i*2);cleardevice();

    bar(x1,400-h-i,x1+20,400-i);outtextxy(x1,400-h-25-i,ch);
    }
    for(int i=0;i<10;i++)
    {
    int l=0;
    int n=geth();int m;int n0=geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int i=0;i<l;i++)
    {
    m=n0%10;n0=n0/10;ch[l-i-1]='0'+m;
    }
    delay_fps(40+i);cleardevice();
    bar(x1,400-h+i,x1+20,400+i);outtextxy(x1,400-h-25+i,ch);
    }
    Sleep(2000);
    }
    void show()
    {setcolor(EGERGB(0xFF,0x0,0x0));
    if(highlight==0)
    {setfillcolor(EGERGB(0x0,0x0,0xff));
    bar(x1,400-h,x1+20,400);
    setfont(18,0,"宋体");
    int l=0;
    int n=geth();int m;int n0=geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int i=0;i<l;i++)
    {
    m=n0%10;n0=n0/10;ch[l-i-1]='0'+m;
    }
    outtextxy(x1,400-h-25,ch);
    }
    else
    {
    setfillcolor(EGERGB(255,0x0,0x0));
    bar(x1,400-h,x1+20,400);
    setfont(18,0,"宋体");
    int l=0;
    int n=geth();int m;int n0=geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int i=0;i<l;i++)
    {
    m=n0%10;n0=n0/10;ch[l-i-1]='0'+m;
    }
    outtextxy(x1,400-h-25,ch);
    }
    if(flag)
    {
    setcolor(EGERGB(255,255,0x0));
    line(x1+10,400-h,x1+10,350-h);
    setfillcolor(EGERGB(255,0,255));
    bar(x1-10,350-h,x1+10,355-h);
    setfillcolor(EGERGB(0,255,255));
    bar(x1-10,355-h,x1+10,360-h);
    setfillcolor(EGERGB(255,255,0));
    bar(x1-10,360-h,x1+10,365-h);
    }
    }

    };
    box b[15];
    void showallboxfall()//柱体坠落的效果
    {
    setfillcolor(EGERGB(0x0,0x0,0xFF));
    int h0=-400;int m=0;int x1;int h;
    for(;is_run()&&h0<=0;delay_fps(10+2*m))
    {
    cleardevice();
    for(int j=0;j<15;j++)
    {x1=b[j].getx1();h=b[j].geth();
    bar(x1,400-h+h0,x1+20,400+h0);
    setfont(18,0,"宋体");
    int l=0;
    int n=b[j].geth();int m;int n0=b[j].geth();
    while(n>0)
    {
    m=n%10;
    n=n/10;
    l++;
    }
    char ch[l];
    for(int k=0;k<l;k++)
    {
    m=n0%10;n0=n0/10;ch[l-k-1]='0'+m;
    }
    outtextxy(x1,400-h-25+h0,ch);
    }
    m++;
    h0=h0+1;
    }


    for(int i=0;i<10;i++)
    {
    delay_fps(60-i*2);cleardevice();
    for(int a=0;a<15;a++)
    {x1=b[a].getx1();h=b[a].geth();
    bar(x1,400-h-i,x1+20,400-i);
    }
    }
    for(int i=0;i<10;i++)
    {
    delay_fps(40+i);cleardevice();
    for(int a=0;a<15;a++)
    {
    x1=b[a].getx1();h=b[a].geth();
    bar(x1,400-h+i,x1+20,400+i);
    }
    }

    Sleep(1000);
    }
    void selectsort()//选择排序
    {void movebox(box&,box&);void showallbox();
    for(int i=0;i<15;i++)
    {int k=i;
    for(int j=k;j<15;j++)
    {
    if(b[k].geth()>b[j].geth())k=j;
    }
    if(k!=i){movebox(b[k],b[i]);box t=b[k];b[k]=b[i];b[i]=t;}
    b[i].setflag(1);
    }
    showallbox();
    Sleep(1000);
    fireworkscene(2);
    showallbox();
    Sleep(1000);
    }
    void bubblesort()//冒泡排序
    {void showallbox();
    void movebox(box&,box&);
    for(int i=0;i<15;i++)
    {
    for(int j=0;j<15-i-1;j++)
    {
    if(b[j].geth()>b[j+1].geth()){movebox(b[j],b[j+1]);box t=b[j];b[j]=b[j+1];b[j+1]=t;}
    }
    b[15-i].setflag(1);
    }
    b[0].setflag(1);
    showallbox();
    Sleep(1000);
    fireworkscene(2);
    showallbox();
    Sleep(1000);
    }

    void insertsort()//插入排序
    {void showallbox();
    cleardevice();
    for(int i=1;i<15;i++)b[i].setbox(b[i].getx1(),20*i+30);
    box a(30,230);a.sethighlight(1);
    b[0]=a;b[0].sethighlight(1);a.sethighlight(1);
    a.showfall();
    for(int i=1;i<15;i++)b[i].setbox(b[i].getx1(),20*i+30);
    bubblesort();//因为此处已经从小到大排好了,所以用冒泡排序就相当于插入排序了
    Sleep(1000);
    }
    void menu()//选择菜单
    {
    //cleardevice();
    //SetBkColor(EGERGB(0x0,0x0,0xFF));
    setfont(25,0,"宋体");
    setcolor(EGERGB(0xFF,0x0,0x00));
    outtextxy(250,100,"1.选择排序");
    outtextxy(250,200,"2.冒泡排序");
    outtextxy(250,300,"3.插入排序");
    char n;
    n=getch();
    if(n=='2')bubblesort();
    if(n=='1')selectsort();
    if(n=='3')insertsort();
    }

    int main()
    {int h;
    INITGRAPH(640,480);
    //setbkcolor(EGERGB(0,255,0));
    setfillcolor(EGERGB(0xFF,0x0,0x0));
    void showallbox();
    //showallbox();
    void movebox(box& ,box&);
    while(1)
    {
    for(int i=0;i<15;i++)
    {
    h=(20*i+3*i*i+14*i*i*i)%400;//模拟随机初始化各个柱体的高度
    if(h==0)h=10*i+100;
    b[i].setbox(30+i*40,h);
    }
    showallboxfall();
    menu();
    }
    getch();
    closegraph();
    return 0;
    }
    void showallbox()
    {
    for(int i=0;i<15;i++)b[i].show();
    }
    void movebox(box &a,box &b)//这是柱体移动的函数
    {//Sleep(500);

    a.sethighlight(1);b.sethighlight(1);

    int x2=b.getx1();
    for(;is_run();)
    {

    if(a.getx1()<b.getx1())
    {
    while(a.getx1()<=x2)
    {delay_fps(90);
    int m=a.getx1();
    a.setx1(m+1);
    int n=b.getx1();
    b.setx1(n-1);
    cleardevice();
    showallbox();
    }
    break;
    }
    else movebox(b,a);
    }
    a.sethighlight(0);b.sethighlight(0);
    }

    显示效果:

     

  • 相关阅读:
    【转】selenium自动化测试环境搭建
    【cl】多表查询(内、外连接)
    【cl】子查询应用场景
    udev笔记
    C编译相关
    USB学习笔记-协议
    ARM汇编返回指令
    v4l2框架函数调用关系
    /etc/fstab和/etc/mtab
    各种存储介质的差异
  • 原文地址:https://www.cnblogs.com/linruier/p/6919717.html
Copyright © 2020-2023  润新知