C语言程序设计今天下雨了吗,C语言编程模拟下雨by张田浩.doc

C语言编程模拟下雨by张田浩.doc

程序设计实习报告程序设计实习报告 题目 题目 模拟下雨模拟下雨 学院 学院 计算机与通信工程学院计算机与通信工程学院 专业 专业 计算机科学与技术计算机科学与技术 班级 班级 计算计算 1402 姓名 姓名 张田浩张田浩 学号 学号 1407010220 一 需求分析一 需求分析 1 本程序要求模拟下雨过程 要有雨点落下并有雨点落地时的水圈效果 2 雨滴在屏幕出现的位置是随机的 雨圈的位置要和雨线对应 并且雨圈的大小要是随机 的来增强效果 3 雨要一直下 不受程序员控制 二 总体设计二 总体设计 1 利用 easyx 把 TC 下的 graphics h 函数导入到了 VC6 0 中来实现绘图功能 并且调 用 initgraphics 函数初始化图形模式 600 480 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 rainDrop 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 rainCircle 雨点落下造成的水圈 int x 雨圈的圆心坐标 int y int r 水圈的半径 int curR 中间过程水圈的半径 int rainCircleStep 水圈每次扩张的增量 2 雨线的结构体 struct rainDrop int startX 雨点开始的 X 值 int startY 雨点开始的 Y 值 int endY 雨点结束的 Y 值 int curX 雨点降落中的 X 值 int curY 雨点降落中的 Y 值 int rainLineStep 雨线每次的增量 int rainLineLength 雨线的长度 int status 表示下落过程是否完成 struct rainCircle water 嵌套的雨圈结构体 struct rainDrop next 用于创建动态链表的指针 3 动态链表的创建和释放 struct rainDrop 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 指向头指针 else If status 0 控制下雨 else 控制形成雨圈 延时 指针指向指向下一个 2 控制下雨 rainDropDown If 当前的雨线的 y 坐标大于等于终点坐标 擦除上一条雨线 Status 0 else 擦除上一条雨线 更新雨线坐标 画新雨线 3 画雨圈 思路和画雨线一样 6 随机的实现 使用 time h 下的 rand 函数进行随机 对雨点雨圈的初始坐标 雨圈的半径 雨圈的扩 张速度 延时时间进行随机 7 主函数实现过程 1 配置屏幕 2 创建链表 3 模拟下雨过程 4 下雨结束 清除链表 8 使用的几个关键库函数 initgraphics kbhit Sleep 四 编码四 编码 源代码如下 include include include include include include struct rainDrop head void initgraphics void int gmode gdriver gdriver DETECT initgraph int n 100 雨的数目 struct rainCircle 雨点落下造成的水圈 int x int y int r int curR int rainCircleStep 水圈的顺序 struct rainDrop int startX 雨点开始的 X 值 int startY 雨点开始的 Y 值 int endY 雨点结束的 Y 值 int curX 雨点降落中的 X 值 int curY 雨点降落中的 Y 值 int rainColor 雨点的颜色 int rainLineStep 雨线的顺序 int rainLineLength 雨线的长度 int status struct rainCircle water struct rainDrop next struct rainDrop creatDrop void struct rainDrop p 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 rainCircleStep 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 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 void updateRainLineData struct rainDrop p 控制起始雨点的 Y 值 p curY p rainLineStep p startY p curY p rainLineLength void drawRainLine struct rainDrop p 画雨线 setcolor WHITE 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 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 void fallToWater struct rainDrop p 控制雨圈雨点的衔接 if p water curR p water r clearRainCircle p recreatDrop p else clearRainCircle p updateRainCircleData p drawRainCircle p void rain 控制全程雨的开始到结束 struct rainDrop p p head while kbhit if p NULL p head else if p status 0 rainDropDown p else fallToWater 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 rainDrop Number 输入雨点的数目 scanf d printf down speed 输入雨点的速度 scanf d 并定义 n v 为全局变量 经过不断调试 最终确定了合适的雨点数目和雨点速度 2 由于本次编程要随机很多数据 雨圈的半径 延时时间 雨线雨圈的坐标 要是想达到 好的表现效果 必须严格确定随机数的范围 initgraphics 函数已经把控制台初始化成了 800 640 我们不断地调试数据 不断地改变 rand 模上的数值 最终确定了雨圈半径的变 化范围小于 40 以控制台下方宽为 50 的矩形模拟地面 3 本次作业的核心算法在于链表的使用 在选择链表访问方式的时候遇到两个问题 其一 是 一次访问一个结点的所有内容 继而把整个链表全部访问完毕 其二是 一次只访问所 有结点的同一个位置 不断重复 从而把整个链表的内容全部访问 经过调试 发现要实现 多雨点同时出现在屏幕 必须选用第二种方法 六六 经验经验总结总结 1 在编码前一定要先确定好需求 根据需求确定所需要的功能模块并考虑好实现功能的算法 然后把过程用伪代码和流程图的形式表示出来 这样在实际编码的时候才能事半功倍 2 要选择合适的编译环境 这次只需要使用到几个简单的绘图函数 使用 mfc 的话要学习的 东西太多 所以我们想到了用 easyx 把 TC 里的图形函数导入到了 VC6 0 中 还是使用 C 语 言编程的技巧 这样便可以直接在控制台中模拟下雨过程了 3 选择合适的数据结构 这次使用链表和嵌套的结构体来存储所需要的数据 在调用时很清 晰方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值