池塘夜降彩色雨课程设计报告
课 程 设 计 课程名称 数据结构 题目名称 1.6池塘夜降彩色雨(难度4)学生学院 计算机学院 专业班级 计算机科学与技术12 学 号 学生姓名 指导教师 2010 年 7 月 7日 池塘夜降彩色雨系统 1 需求分析 设计一个程序,演示美丽的“池塘夜雨”景色:色彩缤纷的雨点飘飘洒洒地从天而降, 滴滴入水有声,溅起圈圈微澜。 具体要求: (1) 雨点在空中的出现位置、雨点大小、降落过程的可见程度、入水位置、颜色、最大水圈等,都是随机确定的 ; (2) 多个雨点按照各自的随机参数和存在状态,同时演示在屏幕上。可以适当调整控制雨点密度、大小、涟漪和状态变化的时间间隔等参数。 该系统实现了池塘的夜晚,下起了五彩的雨点的自然现象。2概要设计根据题目要求的分析,可以将整个系统的数据类型定义如下 ADT graphList 数据对象:D=ai | ai Charset , I = 1,2,3,···,n, n0 数据关系:R1=<ai-1,ai> | ai-1,aiD,ai-1<ai, I =2,···,n 基本操作: initgraphics(void) 操作结果;图形模式的初始化 rainDrop *creatDrop(void) 操作结果;构造雨点 drawRainLine(struct rainDrop *p)初始条件:雨点已经产生 操作结果;画雨点下落路线 creatRain(void) 初始条件:雨点已经产生 操作结果;产生雨连续下落的效果 setwinddirection(struct rainDrop *p) 初始条件:雨点已经开始下落 操作结果:风向的设置(无风,东风,西风 updateRainLineData(struct rainDrop *p) 初始条件:雨点已经产生 操作结果;雨点的下落过程更改 updateRainCircleData and floatradius(struct rainDrop *p) 初始条件:雨点已经出现且落在湖面上 操作结果;水圈涟漪的设计 rainDropDown(struct rainDrop *p) 初始条件:雨点下落到湖面 操作结果;使雨点在落到湖面上消失 drawRainCircle(struct rainDrop *p) 初始条件: 水圈涟漪已存在 操作结果;水圈涟漪的画出 clearRainLine(struct rainDrop *p)初始条件:雨点已经出现且已经画出了一段痕迹 操作结果;清除雨点的滑落路线 clearRainCircle(struct rainDrop *p) 初始条件:水圈涟漪已存在 操作结果;清除水圈涟漪 clearAll(void) 操作结果:清除所有 ADT graphList 程序的主要模块包括四个部分: (1) 主函数:void main()(2) 设定雨滴:creatDrop(void) struct rainDrop *p rainLineLength(struct rainDrop *p)(3) 结束 end各模块调用关系 主程序 雨的设置3详细设计Struct rainCircle/定义水圈的相关数据/横坐标、纵坐标、路线步骤、水圈半径等等Struct raindrop/定义雨点下落的过程的数据/包括雨点开始结束的坐标,颜色,路径,长度,对是否到达水面的判断,水圈的产生以及指向下一个雨点Void initgraphics(void) /图形函数的初始化 int gmodegdiver; gdriver=DETECT; initgraph(&gdriver,&gmode,“C:/TC20/BGI”) /其中gdriver和gmode分别表示图形驱动器和模式,“C:/TC20/BGI”是指的图形驱动程序所在的目录路径,由于使用的是虚拟的TURBO C编译器,其指定路径是“C:/TC20/BGI”。Struct raindrop *creatDrop(void)/雨点开始产生时的随机设置Struct raindrop *p;P=(struct raindrop *)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);Void recreat atDrop(struct raindrop *p)/重复产生雨点/跟雨点开始的随机设置是一样的Void creatRain(void)/重复雨点的产生,使之连续不断/用随机产生雨点,重复产生,使得雨点连续不断void updateRainLineData(struct rainDrop *p)/这个是每次下落雨点的数目void drawRainLine(struct rainDrop *p)/画出雨点的下落的轨迹void clearRainLine(struct rainDrop *p)/清除雨点的轨迹if(p->curY<=400) setcolor(BLACK);/判断是否到了水面,不是的话就是黑色的 line(p->startX,p->startY,p->curX,p->curY); if(p->curY>400) setcolor(BLUE);/到了水面之后用蓝色清除雨点的轨迹 line(p->startX,p->startY,p->curX,p->curY);void rainDropDown(struct rainDrop *p)/构造雨点的下落效果/如果发生坐标大于结束坐标,雨点的下落效果产生 if(p->curY>=p->endY) clearRainLine(p); p->status=1; else clearRainLine(p);/清除原来雨点的轨迹 updateRainLineData(p);/产生新雨点的线路 drawRainLine(p);/画出新路线 void updateRainCircleData(struct rainDrop *p)/水圈的消失半径 p->water.curR+=p->water.rainCircleStep;void drawRainCircle(struct rainDrop *p)/画出水圈的半径,包括颜色和大小void clearRainCircle(struct rainDrop *p)/消除水圈/由于池塘是蓝色的,所以用蓝色来刷新水圈的填充色 setcolor(BLUE); circle(p->water.x,p->water.y,p->water.curR);void fallToWater(struct rainDrop *p)/这个是落水的动画void rain(void)/下雨的动画/里面有个计时器,构造下雨的动画void clearAll(void)/清除所有的东西/里面有个closegraph是用来关闭图像的 main()/主函数 int w; printf("Input rainDrop Number:(<300)"); scanf("%d",&rainDropNumber);/输入雨量,小于300 printf("Input down Delay:(<50)"); scanf("%d",&downDelay);/输入雨点下落速度,小于50 randomize(); initgraphics(); setbkcolor(BLACK);/画出背景 setfillstyle(1,BLUE); bar(0,390,640,480);/构造池塘 creatRain(); rain(); clearAll();/调用各个模块 开始 输入雨量 输入雨速画夜幕池塘 产生雨点 雨点路径 结束 关闭图像继续? 清除水圈 画出水圈 清除路径否是4 编码测试 输入界面,输入雨点数,雨速 输入雨量50,雨速1输入雨量150,雨速15 设计体会选题的时候,主要是这个主题吸引了我,池塘夜降彩色雨,一听名字就是要做出一个动画出来的,所以很好奇做出来是什么效果,然后就想尝试一下。一接触的时候无从下手,从来没有用过图形库。然后一开始用的是vc来编程,怎么也弄不出来,后来发现vc中没有tc中的graphics.h的库。然后就开始在网上找关于这个库的资料,慢慢的从画一个圆圈入手,慢慢的把图形做出来,勉勉强强的把效果弄出来了,能力有限,本来想加一个风的效果的,可是做不出来,只能做出夜降彩色雨。有点遗憾。这个程序中使用的就是简单的链表,采用带头结点的循环链表,仅需改变头尾两个指针即可。creatRain,drawRainLine和rainDropDown以及确定链表中第一个结点和之后一个结点的运算时间都是O(l),销毁雨点线路算法clearRainLine和销毁水圈算法clearRainCircle都是对每个元素调用一个O(1)的函数,因此都是O(n),也有简单的图表的应用,也有对链表的的应用,即双向循环链表的使用。课程设计做完了,做的不