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);
}

显示效果:

时间: 2024-10-22 22:18:04

ege图形库之动画排序的相关文章

EGE图形库配置(Dev-C++ 5.10 , TDM GCC 4.8.1)

准备工作:1>Dev-C++ 5.10版本    系统 Win XP/WIN 7 2>下载EGE图形库“ege-13.04.02-full” !,关于本次配置的Dev-C++的信息见如: 现在开始配置: 1,解压“ege-13.04.02-full”到任一个文件夹,如C:/ege 2,在解压后的文件中有一个"include"的文件夹.文件夹里有 一个“ege”文件夹和两个.H的文件 复制下来. 3,把include文件夹内的文件拷贝到安装目录对应的文件夹内.C:\Progr

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序 #ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #ifndef __cplusplus #error You must use C++ compiler, or you need filename with '.cpp' suffix #endif #include "ege.h" using namespace ege; #endif #inc

c++入门之一:EGE图形库介绍与配置(VS2013、DEVCPP)

c++学习的方式方法很多,本篇笔记主要记录DEVCPP和VS2013的ege图形库的配置,为接下来利用ege图形库学习c++做准备. 一.EGE图形库简介 EGE图形行库中的EGE为Easy Graphics Engine的缩写,是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在.它的使用方法与TC中的graphics.h相当接近. EGE图形库的作者是:misakamm,他的主页请点击:[这里] E

一键快速部署CodeBlocks的EGE图形库工具

大一下学期,学完了c语言的基本内容, 也就开始开发项目了,此时一个图形界面就比较重要了,c语言中不提供图形界面,一般这些是用的其它开发的图形库,如 Easyx .ege等. 本文就提供 Codeblocks 快速部署ege图形库的小工具,其实就是方便些,原理是一样的复制对应的文件到相应的文件夹中,只是使用了bat命令来批量快速地复制罢了. 工具下载链接 链接:https://pan.baidu.com/s/1pFUBcjmE0dNketwIc6AQrA Password:jb8s 下载解压后,双

初识ege图形库

简介: EGE (Easy Graphics Engine),是Windows 下的简易绘图库, 是一个类似BGI (graphics.h)的 面向C/C++语言新手的图形库,对新手来说,简单,友好,容易上手,免费开源,而且因为借口意义直观,即使没有接触过图形编程的,也能迅速学会基本的绘图. 简单示例: #include "graphics.h" int main(void) { initgraph(宽度,高度):   // 初始化绘图环境 ege::getch(); // 类似C语言

属性动画

属性(Property)动画 属性(Property)动画:安卓提供的众多动画中的一种,从某种角度来看,属性动画实际上是增强版的补间(Tween)动画. 属性动画主要由两方面组成: 1.计算各帧的相关属性值. 2.给指定的对象设置相关的属性值. 区别: 1.补间(Tween)动画只能够操控各种组件的透明度(alpha),位置(translate), 旋转(rotate)和放缩(scale)四种属性进行相应的变换,但是属性(Property)动画可以对任何的属性值做出改变. 2.补间(Tween)

EGE 在Dev下的环境配置 和 第一个绘图程序

EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在. 从它的名字就知道,它的存在就是为了便于C++语言的图形绘画. 下面详细说一下,ege图形库的配置方法. 1.首先,下载ege-13.04.01 并下载压缩至X:\ege 2.将ege\include内的内容添加到Dev-C++的库路径中 3.将ege\lib添加到Dev-C++的库路径中 注意这里

C++学习笔记--Season 2

一个简单的EGE程序: #include "graphics.h" //EGE库的头文件 int main(int argc, char** argv) { initgraph(320,240); //初始化绘图窗口 outtextxy(20,120,"Aloha World!"); line(10,10,300,200); circle(30,40,20); ege::getch(); //此处加ege::名字空间,是因为conio.h文件里面也有getch函数.

Flex相关案例及资源搜集

Flex一些例子: http://blog.minidx.com/ 上千个Flex例子,对于学习者来说是一个庞大的资源宝库. http://fleksray.org/Flex_skin.html http://www.scalenine.com/samples/themeSwapper/themeSwap.html http://www.scalenine.com/ http://code.google.com/p/openflux/ http://blogs.ilog.com/elixir/2