老师布置了一个学习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);
}
显示效果:



原文:http://www.cnblogs.com/linruier/p/6919717.html