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