C语言流星雨的实现.doc_第1页
C语言流星雨的实现.doc_第2页
C语言流星雨的实现.doc_第3页
C语言流星雨的实现.doc_第4页
C语言流星雨的实现.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HUNAN UNIVERSITY程序设计训练报告题目 流 星 雨 的 实 现 学生姓名毛 宇 锋学生学号201208060116专业班级信息安全一班学院名称信息科学与工程学院指导老师李 丽 娟2013年7月8日(一)程序要求及功能简介程序模拟一组流星飞向地面的情景。地面用多行#来表示,流星用大写字母表示。程序产生一组流星(比如10个),从屏幕顶部下降飞向地面。一组流星中,每个流星的字符颜色是随机的,下降的位置是随机的,下降的速度也是随机的。一个流星下落只能去掉一个#号,当最后一行地面有#被去掉时,程序终止,程序在下降过程中,程序必须知道流星的字符、颜色、位置、速度。(二)基本算法思想说明定义一个二维数组screen2480,代表25行80列的程序界面,由于DOS界面在输出第25行的时候会发生滚屏的现象,所以只利用上面24行,通过sky数组和ground数组对screen数组进行初始化和更改。利用随机数产生一组十个流星的数据,包括流星的字符、出现位置、颜色和速度,分别保存在letter,lie,color,speed数组里。流星坠落的实现就是将上一行出现的字符在下一行出现并将上一行的字符更改为0,坠落的速度是每次替换的行数,替换的多则坠落的快,少则坠落的慢,流星的颜色可以用SetConsoleTextAttribute函数进行更改。(三)模块的功能及程序说明 调用函数介绍load函数:初始化sky,ground,heng,lie数组,给他们赋初始值。make函数:用随机数制造一组流星的数据,包括流星的字符、颜色、初始位置、速度。combine函数:将经过初始化或者经过改变后的sky与ground数组赋给screen数组。output函数:程序界面的输出,将包含流星信息的screen函数输出到屏幕上。gotoxy函数:光标移动函数,将光标移动到初始位置重新输出以达到替换屏幕从而实现流星坠落的效果。这个函数也可以用clearscreen这个系统函数来代替,可是clearscreen函数会造成屏幕的闪烁,影响最终效果。fall函数:通过替换和替换的次数来实现流星在screen数组里的位置改变和改变速度的快慢,达到流星坠落的效果。exist_or函数:判断屏幕上是否还有流星,如果没有流星则产生新的流星。(四)算法流程图产生一组流星的数据初始化并输出经过数组screen根据流星的位置、颜色和下落速度对初始化的地面和天空进行改变,如果落到地面,则#与流星同时变为空字符 否 光标移动到(0,0),重新输出screen第24行的#被碰到 是程序终止(五)核心源程序 本程序的核心部分是流星雨的制造和通过替换实现流星雨的下落,在源程序中分别被定义为make函数和fall函数。make函数通过随机数产生流星的字符、颜色、速度性质并传给其他函数进行运算,它所要解决的最重要的问题是如何使流星产生在不同的列和如何将列序号从小到大排列,使得在output函数里能通过SetConsoleTextAttribute函数给流星不同的颜色而不影响整个背景的颜色。解决第一个问题的方法是通过产生随机数逐次比较来筛选掉出现重复的流星列位置,解决第二个问题的方法是将所有产生的列位置进行冒泡排序。该函数的源代码如下:void make(char screen2480,char sky2480,char letter10,int lie10,int heng10,int color10,int speed10,int exist10) int i1,i2,t,change,base=1; for(i1=0;i110;i1+) hengi1=0; letteri1=(abs(rand()%26+65);/随机产生一个字母作为流星 colori1=abs(rand()%3; while(1) /保证流星不产生在同一列的筛选函数 base=0; t=(abs(rand()%80); for(i2=0;i210;i2+) if(t=liei2) base=1; if(base=0) break; liei1=t; speedi1=(abs(rand()%3)+1; sky0liei1=letteri1; existi1=1; for(i1=0;i110;i1+) /每一列冒泡排序 for(i2=0;i2liei2+1) change=liei2; liei2=liei2+1; liei2+1=change; fall函数的主要作用是让流星以不同的速度实现逐行的替换,并且保证流星撞到地面时消失。流星的速度是产生一个大于0的随机数来作为循环最大值,在每一次下落中因为循环的不同导致第二次出现的位置不同,在主函数中通过Sleep来加强屏幕的滞留时间,从而加深了下落速度不同的效果。fall函数的源代码如下:void fall(char screen2480,char sky2480,int speed10,char ground980,int exist10,int heng10,int lie10) int i1,i2; for(i1=0;i110;i1+) if(existi1=1) for(i2=1;i2=20) if(groundhengi1-20liei1=#) skyhengi1liei1= ; groundhengi1-20liei1= ; existi1=0; break; (六)实验结果程序运行情况如图:(七)设计体会 该程序在编译时,困扰我的最大问题就是如何让屏幕清空重新输出。我曾经采用clearscreen清屏函数,可是该函数在清屏时会使屏幕闪烁,效果不好,最终我从网上查找了相关资料,得知了在turbo C里面有gotoxy函数,在进一步的学习中我得到了gotoxy在头文件中的源代码,设计了该调用函数并学会通过光标移动重新输出数组。在设计字符颜色时,也经常出现很多不正常的地方,要么整个背景都在跟着变颜色,要么只有几个字符出现颜色,要么一列是白色一列是红色,在一遍一遍的更改并设置了比较复杂的判断条件后,才得以实现效果。由于对算法的不够熟悉和通过c语言编写较长程序的经验相对缺乏,我的程序在设计的时候有很多语句不够简洁、语法不够规范的地方,希望能在将来的学习中对此进行完善,进一步加强我对C语言的理解,最后谢谢李丽娟老师和两位助教在我编写程序时对我的帮助。(八)源代码#include#include#include#includevoid load(char sky2480,char ground980,int heng10,int lie10); /初始化各数组数据void output(char screen2480,int lie10,int color10); /界面初始化void make(char screen2480,char sky2480,char letter10,int lie10,int heng10,int color10,int speed10,int exist10);/定义流星的字符、颜色、速度void fall(char screen2480,char sky2480,int speed10,char ground980,int exist10,int heng10,int lie10);/实现流星下降void end();void gotoxy(int x,int y); /光标移动函数void combine(char screen2480,char star2480,char ground980);/将ground数组与star数组结合起来形成screenint exist_or(char sky2480);/当屏幕上没有流星时自动产生新的流星void main() char screen2480,sky2480,letter10; int i,a=0; int exist10,lie10,heng10,color10,speed10; char ground980=, , -/ ,; load(sky,ground,heng,lie); srand(int)time(0); combine(screen,sky,ground); output(screen,lie,color); for(;) make(screen,sky,letter,lie,heng,color,speed,exist); for(;) combine(screen,sky,ground); output(screen,lie,color); for(i=0;i80;i+) if(ground8i= ) end(); getchar(); Sleep(50); fall(screen,sky,speed,ground,exist,heng,lie); if(exist_or(sky)=0) break; void load(char sky2480,char ground980,int heng10,int lie10) int i1,i2; for(i1=0;i124;i1+) for(i2=0;i280;i2+) skyi1i2= ; for(i1=4;i19;i1+) for(i2=0;i280;i2+) groundi1i2=#; for(i1=0;i110;i1+) hengi1=0; liei1=i1; void output(char screen2480,int lie10,int color10) /输出screen数组 int i1,i2,i3=0; gotoxy(0,0); for(i1=0;i124;i1+) i3=0; for(i2=0;i2=A & screeni1i2=Z) switch(colori3) case 0: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);break; case 1: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);break; case 2: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);break; i3+=1; printf(%c,screeni1i2); void make(char screen2480,char sky2480,char letter10,int lie10,int heng10,int color10,int speed10,int exist10) int i1,i2,t,change,base=1; for(i1=0;i110;i1+) hengi1=0; letteri1=(abs(rand()%26+65);/随机产生一个字母作为流星 colori1=abs(rand()%3; while(1) base=0; t=(abs(rand()%80); for(i2=0;i210;i2+) if(t=liei2) base=1; if(base=0) break; liei1=t; speedi1=(abs(rand()%3)+1; sky0liei1=letteri1; existi1=1; for(i1=0;i110;i1+) for(i2=0;i2liei2+1) change=liei2; liei2=liei2+1; liei2+1=change; /流星列冒泡排序void fall(char screen2480,char sky2480,int speed10,char ground980,int exist10,int heng10,int lie10) int i1,i2; for(i1=0;i110;i1+) if(existi1=1) for(i2=1;i2=20) if(groundhengi1-20liei1=#) skyhengi1liei1= ; groundhengi1-20liei1= ; existi1=0; break; int exist_or(char sky2480) /判断是否还有流星,如果没有就开始新的make函数 int i1,i2,t=0; for(i1=0;i125;i1+) for(i2=0;i280;i2+) if(skyi1i2!= ) t=1; break; return t;void combine(char screen2480,char sky2480,char ground980) /将流行数组与地面数组整合到out数组中 int i1,i2; for(i1=0;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论