《C语言编程模拟下雨by张田浩》由会员分享,可在线阅读,更多相关《C语言编程模拟下雨by张田浩(11页珍藏版)》请在人人文库网上搜索。
1、程序设计实习报告题目:模拟下雨学院:计算机与通信工程学院专业:计算机科学与技术班级:计算 1402姓名:张田浩学号:1407010220一、需求分析1、本程序要求模拟下雨过程,要有雨点落下并有雨点落地时的水圈效果2、雨滴在屏幕出现的位置是随机的,雨圈的位置要和雨线对应,并且雨圈的大小要是随机 的来增强效果3、雨要一直下,不受程序员控制二、总体设计1. 利用 easyx 把 TC 下的 graphics.h 函数导入到了 VC6.0 中来实现绘图功能,并且调 用” initgraphics ”函数初始化图形模式 600*480 ,2. 雨滴和雨圈可以看作两个结构体,而且雨圈的结构体可以嵌套咋雨滴。
2、的结构体中3. 程序主要分为五大模块( 1)主函数void main( )(2) 雨点产生模块struct drop *creatDrop(void) , void recreatDrop(struct drop*p) ,void creatRain(void)(3) 雨点下落模 块 void updateRainLineData(struct rainDrop *p) ,void drawRainLine(struct rainDrop *p) ,void clearRainLine(struct rainDrop *p) , void rainDropDown(struct rainDro。
3、p *p)( 4 ) 水 纹 生 成 模 块 void updateRainCircleData(struct rainDrop *p) , void drawRainCircle(struct rainDrop *p) , void clearRainCircle(struct rainDrop *p)(5) 控制模块 void rain(void), void clearAll(void)我的任务:负责雨点产生和下落模块及最后的调试,编写实习报告。三、详细设计雨点落下造成的水圈1. 雨圈的结构体 struct rainCircleint x; int y; int r;int curR;i。
4、nt rainCircleStep;2. 雨线的结构体 struct rainDrop int startX; int startY; int endY;int curX; int curY;int rainLineStep;雨圈的圆心坐标水圈的半径中间过程水圈的半径水圈每次扩张的增量雨点开始的 X 值 雨点开始的 Y 值 雨点结束的 Y 值 雨点降落中的 X 值雨点降落中的 Y 值int rainLineLength;int status; struct rainCircle water; struct rainDrop *next;3. 动态链表的创建和释放 struct rainDrop。
5、 *head; struct rainDrop *p1,*p2;int i; p1=p2=creatDrop(); head=p1; for(i=0;inext=p2;p1=p2;在 creatDrop 函数中用 malloc() 动态分配内存4. 雨线和雨圈的绘制与清除Setcolor() 设定颜色, line() 画线。出现时用白色画,让其消失就在原位置画一条黑线。5三个 if-else 判断的核心函数(1) 整个下雨的控制过程rain()创建 rainDrop 类的指针 p 让它指向头指针;While( 键盘没有输入 )if(p 指到表尾 ) p 指向头指针;elseIf(status=。
6、0) 控制下雨;else 控制形成雨圈;延时;指针指向指向下一个;(2) 控制下雨rainDropDown()If( 当前的雨线的 y 坐标大于等于终点坐标 )擦除上一条雨线;Status=0 ;else擦除上一条雨线;更新雨线坐标;画新雨线;(3) 画雨圈思路和画雨线一样6. 随机的实现雨圈使用” time.h ”下的” rand ”函数进行随机, 对雨点雨圈的初始坐标, 雨圈的半径, 的扩张速度,延时时间进行随机。7主函数实现过程(1) 配置屏幕(2) 创建链表(3) 模拟下雨过程(4) 下雨结束,清除链表8. 使用的几个关键库函数 initgraphics(); kbhit() ; Sl。
7、eep();四、编码源代码如下:#include #include #include #include #include #include struct rainDrop *head; void initgraphics(void) );雨点落下造成的水圈int gmode,gdriver; gdriver=DETECT; initgraph(&gdriver,&gmode, int n = 100; /雨的数目struct rainCircle / int x;int y;int r;int curR;/ 水圈的顺序int rainCircleStep;/ int status;struct。
8、 rainCircle water; struct rainDrop *next;struct rainDropint startX; / int startY; / int endY; / int curX; / int curY; / int rainColor; / int rainLineStep; / int rainLineLength; 雨点开始的 X 值 雨点开始的 Y 值 雨点结束的 Y 值 雨点降落中的 X 值 雨点降落中的 Y 值 雨点的颜色 雨线的顺序 雨线的长度;struct rainDrop *creatDrop(void)struct rainDrop *p;动态。
9、分配内存p=(struct rainDrop *)malloc(sizeof(struct rainDrop); / p-startX=rand()%640; p-startY=rand()%430;p-endY=430+rand()%50;p-curX=p-startX;p-curY=p-startY;p-rainLineStep=8;p-rainLineLength=10;p-status=0;p-water.x=p-startX;p-water.y=p-endY;p-water.r=rand()%40;p-water.curR=rand()%2; p-water.rainCircleSt。
10、ep=rand()%2+1; p-next=NULL;return(p);void recreatDrop(struct rainDrop *p)p-startX=rand()%640;p-startY=rand()%430;p-endY=430+rand()%50;p-curX=p-startX;p-curY=p-startY;p-rainLineStep=8;p-rainLineLength=10;p-status=0;p-water.x=p-startX;p-water.y=p-endY;p-water.r=rand()%40;p-water.curR=rand()%2; p-water。
11、.rainCircleStep=rand()%2+1;void creatRain(void) / 创建链表struct rainDrop *p1,*p2;int i;p1=p2=creatDrop();head=p1;for(i=0;inext=p2;p1=p2;控制起始雨点的 Y 值void updateRainLineData(struct rainDrop *p) /p-curY+=p-rainLineStep;p-startY=p-curY-p-rainLineLength;void drawRainLine(struct rainDrop *p) /setcolor(WHITE);。
12、line(p-startX,p-startY,p-curX,p-curY);void clearRainLine(struct rainDrop *p) /setcolor(BLACK);line(p-startX,p-startY,p-curX,p-curY);void updateRainCircleData(struct rainDrop *p) /p-water.curR+=p-water.rainCircleStep;void drawRainCircle(struct rainDrop *p) /setcolor(WHITE);circle(p-water.x,p-water.y,。
13、p-water.curR);void clearRainCircle(struct rainDrop *p) /setcolor(BLACK);circle(p-water.x,p-water.y,p-water.curR);void rainDropDown(struct rainDrop *p) /if(p-curY=p-endY)clearRainLine(p);p-status=1;else画雨线以黑色表示雨线消失控制水圈的大小画雨降落后的水圈以黑色表示水圈消失控制雨的路径clearRainLine(p);updateRainLineData(p); drawRainLine(p);v。
14、oid fallToWater(struct rainDrop *p) / 控制雨圈雨点的衔接 if(p-water.curR=p-water.r)clearRainCircle(p);recreatDrop(p);elseclearRainCircle(p);updateRainCircleData(p);drawRainCircle(p);void rain() / 控制全程雨的开始到结束struct rainDrop *p;p=head;while(!kbhit()if(p=NULL)p=head;elseif(p-status=0) rainDropDown(p);else fallT。
15、oWater(p);Sleep(rand()%2+1)/10.0);p=p-next;void clearAll(void) / 画图结束,释放空间struct rainDrop *p,*pf;p=head;while(p!=NULL)pf=p;p=p-next;free(pf);closegraph();void main()initgraphics();creatRain();rain();clearAll();五综合测试1、在主程序中添加以下代码:printf(Input rainDrop Number:); /* 输入雨点的数目 */scanf(%d,&n);printf(Input 。
16、down speed:); /* 输入雨点的速度 */scanf(%d,&v);并定义 n,v 为全局变量,经过不断调试,最终确定了合适的雨点数目和雨点速度。2、由于本次编程要随机很多数据:雨圈的半径,延时时间,雨线雨圈的坐标,要是想达到 好的表现效果, 必须严格确定随机数的范围。 initgraphics() 函数已经把控制台初始化成了 800*640 ,我们不断地调试数据,不断地改变 rand() 模上的数值,最终确定了雨圈半径的变 化范围小于 40,以控制台下方宽为 50 的矩形模拟地面。3、本次作业的核心算法在于链表的使用。在选择链表访问方式的时候遇到两个问题:其一 是,一次访问一个结。
17、点的所有内容, 继而把整个链表全部访问完毕;其二是,一次只访问所 有结点的同一个位置,不断重复,从而把整个链表的内容全部访问。经过调试,发现要实现 多雨点同时出现在屏幕,必须选用第二种方法。六 . 经验总结1. 在编码前一定要先确定好需求,根据需求确定所需要的功能模块并考虑好实现功能的算 法,然后把过程用伪代码和流程图的形式表示出来,这样在实际编码的时候才能事半功倍。2. 要选择合适的编译环境, 这次只需要使用到几个简单的绘图函数, 使用 mfc 的话要学习的 东西太多,所以我们想到了用easyx把TC里的图形函数导入到了 VC6.0中,还是使用 C语言编程的技巧,这样便可以直接在控制台中模拟下雨过程了。3. 选择合适的数据结构, 这次使用链表和嵌套的结构体来存储所需要的数据, 在调用时很清 晰方便。