池塘夜降彩色雨系统1需求分析设计一个程序,演示美丽的“池塘夜雨”景色:色彩缤纷的雨点飘飘洒洒地从天而降,滴滴入水有声,溅起圈圈微澜。具体要求:(1)雨点在空中的出现位置、雨点大小、降落过程的可见程度、入水位置、颜色、最大水圈等,都是随机确定的;(2)多个雨点按照各自的随机参数和存在状态,同时演示在屏幕上。可以适当调整控制雨点密度、大小、涟漪和状态变化的时间间隔等参数。该系统实现了池塘的夜晚,下起了五彩的雨点的自然现象。2概要设计该系统旨在描绘一幅池塘夜雨的动态图,因此应该关注每一滴雨点:(1)每个雨点的存在周期可分为三个阶段:从天而降、入水有声和入水涟漪,需要一个记录存储其相关参数、当前状态和下一状态的更新时刻。(2)雨点下降的可见程度应是断断续续、依稀可见;入水涟漪应是由里至外逐渐扩大和消失的。(3)每个雨点发生时,生成其记录,并预置下一个雨点的发生时间。(4)用一个适当的结构管理当前存在的雨点,使系统能利用它按时更新每个雨点的状态,一旦有雨点的水圈全部消失,就从结构中删去。根据以上的分析,可以将整个系统的数据类型定义如下ADTgraphList{数据对象:D={ai|ai∈Charset,I=1,2,3,···,n,n≥0}数据关系:R1={ai-1,ai|ai-1,ai∈D,ai-1ai,I=2,···,n}基本操作:initgraphics(void)操作结果;图形模式的初始化rainDrop*creatDrop(void)操作结果;构造雨点drawRainLine(structrainDrop*p)初始条件:雨点已经产生操作结果;画雨点下落路线creatRain(void)初始条件:雨点已经产生操作结果;产生雨连续下落的效果setwinddirection(structrainDrop*p)初始条件:雨点已经开始下落操作结果:风向的设置(无风,东风,西风updateRainLineData(structrainDrop*p)初始条件:雨点已经产生操作结果;雨点的下落过程更改updateRainCircleDataandfloatradius(structrainDrop*p)初始条件:雨点已经出现且落在湖面上操作结果;水圈涟漪的设计rainDropDown(structrainDrop*p)初始条件:雨点下落到湖面操作结果;使雨点在落到湖面上消失drawRainCircle(structrainDrop*p)初始条件:水圈涟漪已存在操作结果;水圈涟漪的画出clearRainLine(structrainDrop*p)初始条件:雨点已经出现且已经画出了一段痕迹操作结果;清除雨点的滑落路线clearRainCircle(structrainDrop*p)初始条件:水圈涟漪已存在操作结果;清除水圈涟漪clearAll(void)操作结果:清除所有}ADTgraphList程序的主要模块包括四个部分:(1)主函数void(main)(2)设定雨滴大小creatDrop(void)structrainDrop*prainLineLength(structrainDrop*p)(3)风向的设置setWindDirection(structrainDrop*p)(4)结束end各大模块的调用关系:雨滴的设置3详细设计StructrainCircle//定义水圈的相关数据{//横坐标、纵坐标、路线步骤、水圈半径intx;//横坐标主程序inty;//纵坐标intcutR;//水圈初始半径intr;//水圈变化后的半径intrainCircleStep;//水圈产生的步骤}Structraindrop//定义雨点下落的过程的数据{intstartX;//开始的横坐标intstartY;//开始的纵坐标intendY;//结束的纵坐标intcurX;//每个雨点消失的横坐标intcurY;//每个雨点消失的纵坐标intrainColor;//雨点的的颜色intrainLineStep;//雨点下落的路径intrainLineLength;//雨点的长度intstatus;//判断是否到达湖面structrainCirclewater;//产生涟漪structraindrop*next;//指向下一颗雨点}Voidinitgraphics(void)//图形函数的初始化{intgmodegdiver;gdriver=DETECT;initgraph(&gdriver,&gmode,”D:\\TC”)//其中gdriver和gmode分别表示图形驱动器和模式,“D:\\TC”是指的图形驱动程序所在的目录路径}Structraindrop*creatDrop(void)//雨点开始产生时的随机设置{Structraindrop*p;P=(structraindrop*)molloc(LEN);p-startX=rand()%640;//随机产生的位置Xp-startY=rand()%430;//随机产生的位置Yp-endY=430+rand()%50;//结束坐标p-curX=p-startX;//每个雨点消失的横坐标p-curY=p-startY;//每个雨点消失的纵坐标p-rainLineStep=8://共分8个步骤p-rainColor=rand()%15+1;//彩色的随机产生p-rainLineLenth=rand()%10+10;//雨点大小的随即产生p-status=0;p-water.x=p-startX;p-water.y=p-startY;//随机产生的涟漪的位置p-water.r=p-rand()%45;//随机产生涟漪的半径p-water.curR=rand()%3;//涟漪消失的半径p-water.rainCircleStep=rand()%3+1;p-next=NULL;return(p);}VoidrecreatatDrop(structraindrop*p)//重复产生雨点{p-startX=rand()%640;//随机产生的位置Xp-startY=rand()%430;//随机产生的位置Yp-endY=430+rand()%50;//结束坐标p-curX=p-startX;//每个雨点消失的横坐标p-curY=p-startY;//每个雨点消失的纵坐标p-rainLineStep=8://共分8个步骤p-rainColor=rand()%15+1;//彩色的随机产生p-rainLineLenth=rand()%10+10;//雨点大小的随即产生p-status=0;p-water.x=p-startX;p-water.y=p-startY;//随机产生的涟漪的位置p-water.r=p-rand()%45;//随机产生涟漪的半径p-water.curR=rand()%3;//涟漪消失的半径p-water.rainCircleStep=rand()%3+1;}VoidcreatRain(void)//重复雨点的产生,使之连续不断{StructrainDrop*p1*p2;IntI;p1=p2=creatDrop();head=p1;for(i=0;inext=p2;)p1=p2;}}VoidupdateRainLineData(structrainDrop*p){//每次下落雨点的数目If(p-rainLineStep%5==0)p-rainLineStep++;p-curY+=p-rainLineStep;p-startY=p-curY-p-rainLineLength;}VoiddrawRainLine(structrainDrop*p)//雨点下落的轨迹{switch(p-rainColor){case0:setcolor(RED);break;case1:setcolor(GREEN);break;case2:setcolor(BLUE);break;case3:setcolor(CYAN);break;case4:setcolor(MAGENTA);break;case5:setcolor(BROWN);break;case6:setcolor(LIGHTRED);break;case7:setcolor(LIGHTMAGENTA);break;case8:setcolor(WHITE);break;case9:setcolor(LIGHTGRAY);break;case10:setcolor(DARKGRAY);break;case11:setcolor(LIGHTBLUE);break;case12:setcolor(LIGHTGREEN);break;case13:setcolor(LIGHTCYAN);break;case14:setcolor(YELLOW);break;system(pause);}setlinestyle(0,0,1);line(p-startX,p-startY,p-curX+w,p-curY+5);//w表示终点坐标相对初始点产生的偏移,使之产生风的效果}voidclearRainLine(structrainDrop*p)//清除雨点的轨迹{setcolor(BLACK);line(p-startX,p-startY,p-curX+w,p-cueY+5);}VoidrainDropDown(structrainDrop*p)//构造雨点的下落效果{//如果发生坐标大于结束坐标,雨点的下落效果产生;If(p-curY=p-endY){clearRainLine(p);p-status=1;}else{clearRainLine(p);//清除原来雨点的轨迹updateRainLineData(p);//产生新雨点的线路drawRainLine(p);//画出新路线}}VoidupdateRainCircleData(structrainDrop*p)//涟漪的消失半径{p-water.curR+=p-water.rainCircleStep;}VoiddrawRainCircle(structrainDrop*p)//画出涟漪{setcolor(p-rainColor);circle(p-water.x,p-water.y,p-water.curR);}VoidclearRainCircle(structrainDrop*p)//清除涟漪{setcolor(BLACK);circle(p-water.x,p-water.y,p-water.curR);}VoidfallToWater(structrainDrop*p)//落水动画{if(p-water.curR=p-water.r){clearRainCircle(p);recreatDrop(p);}else{clearRainCircle(p);updateRainCircleData(p);drawRainCircle(p);}}Voidrain(void)//下雨动画{structrainDrop*p;p=head;while(!kbhit()){if(p=NUll)p=head;else{if(p-bottom==0)rainDropDown(p);elsefallToWater(p);}dalay(downDelay);p=p-next;}}VoidclearAll(void)//清除所有;{structrainDrop*p*pf;p=head;while(p!=NUll){pf=p;p=p-next;free(pf);}closegraph();//关闭图像}主函数voidmain(){printf(----------------------------ColorfulRain--------------------------