彩色雨和风的效果我没写,你自己可以想一想。只要在初始化模块中改写再加一个处理功能的模块。偷懒没有用链表做,用的是顺序表。以下代码可供参考。
/*按照严书的要求写了一个雨的效果*/
/*在运行前将第26行initgraph(&gdrive,&gmode,"c:\\turboc2");中的"C:\\turboc2" 改成你自己的TC的根目录就可以运行*/
#include "stdio.h"
#include "graphics.h"
#include "bios.h"
#include "dos.h"
#include "time.h"
struct yu /*雨结构*/
{
int flag;/*雨的状态:0为出现下落过程,1为落水过程,2为画微波过程,3为结束状态*/
int x;/*雨出现的横坐标*/
int y;/*雨出现的纵坐标*/
int x1;/*雨消失的横坐标*/
int y1;/*雨消失的纵坐标*/
int time;/*雨出现的时间*/
int time1;/*当前时间,用于判断是否出现雨*/
int speed;
int bo1;
int bo2;
};
struct yu a[1000];/*定义一个能存储1000个雨点信息的数组*/
int yn;/*定义处理雨点的个数*/
/*初始化图形界面*/
void inittu()
{
int gdrive,gmode;
gdrive=DETECT;
initgraph(&gdrive,&gmode,"c:\\turboc2");
setbkcolor(BLACK);/*将背景图象设置为黑色*/
}
/*雨点信息扫描函数对雨做出处理*/
ysm()
{
int i;
void ran(int);/*对ran函数的原形声明*/
for(i=0;i<yn;i++)/*重头到尾扫描数组信息*/
{
if(a[i].flag==3) ran(i); /*如果有完成所有过程的就调用ran()函数*/
else
{if ((a[i].time1)>=a[i].time)/*如果到了雨点的出现时间就出现雨点*/
cly(a[i].flag,a[i].x,a[i].y,a[i].x1,a[i].y1,a[i].speed,a[i].bo1,a[i].bo2,i);/*如果没有就调用雨处理过程*/
else /*否则的话就增加a[i].time1的值*/
a[i].time1++;}
}
}
/*随机处理雨信息函数*/
void ran(int i)
{int x,y,leng,x1,y1,spi,spi1,zjy,time,u;
u=getmaxx();
x=30+rand()%u;/*随机生成雨点的下落的x坐标*/
y=rand()%10;/*随机生成雨点的下落y坐标*/
zjy=getmaxy()-rand()%250+50;/*随机生成下落的增量,用来计算y的终点位子*/
y1=y+zjy;
time=50+rand()%100;/*随机生成雨点出现的时间*/
a[i].x=x;
a[i].y=y;
a[i].x1=x;
a[i].y1=y1;
a[i].flag=0;
a[i].time=time;
a[i].time1=0;
a[i].speed=1+rand()%2;
a[i].bo1=1;
a[i].bo2=15+rand()%10;
}
/*雨过程处理函数,通过对三个过程的判断决定调用的处理过程模块*/
cly(int flag,int x,int y,int x1,int y1,int speed,int bo1,int bo2,int i)
{
int n;
void xialuo(int,int,int,int,int,int);/*函数原形声明*/
/* void luoshui(int,int); 落水过程原形声明*/
/* void weibo(int,int,int,int);微波过程声明*/
switch (flag) /*因为首先对信息数组进行了扫描所以不存在flag=3的情况*/
{
case 0: xialuo(x,y,x1,y1,speed,i);break;
/* case 1: luoshui(x1,y1);break;可以加声音留以后处理*/
case 2: weibo(x1,y1,bo1,bo2,i);break;
}
}
/*雨下落过程*/
void xialuo(int x,int y,int x1,int y1,int speed,int i)
{
if(a[i].y>=a[i].y1) a[i].flag=2; /*(调试阶段)如果到了指定位置,雨消失(现在不处理具体的雨落水阶段)*/
else
{line(x,y,x,y+20);
a[i].y=a[i].y+speed;
a[i].speed++;
if (a[i].speed>=10) a[i].speed=10;
}/*否则的话继续下落*/
}
/*雨画微波过程*/
weibo(int x1,int y1,int bo1,int bo2,int i)
{
if(a[i].bo1<=a[i].bo2)
{
ellipse(x1,y1,0,360,bo1+20,bo1);
a[i].bo1++;
}
else
{
a[i].flag=3;
}
}
main()
{
int key,i,j=0;
printf("INPUT HOWMANY:");
scanf("%d",&yn);
/*初始化图型界面*/
inittu();
/*调用雨信息扫描:判断处理是否要随机生成雨信息"if a[i].flag=3" 调用生成雨函数*/
for(i=0;i<=yn;i++)
ran(i);
while(!kbhit())
{
cleardevice();
ysm();
if(j==getmaxx()) j=0;
delay(5000);
}
/*对雨信息处理函数*/
closegraph();
}