1题目:流星雨的实现学院:班级:姓名:学号:指导教师:时间:2目录一课程设计目的.......................................................................3二设计内容与要求...................................................................3三概要设计...............................................................................3四详细设计...............................................................................5五运行界面...............................................................................5六设计总结.............................................................................15七教师评语.............................................................................163一课程设计目的程序模拟一组流星飞向地面的情境,地面用多行#来表示,流星用大写字母表示。二设计内容与要求1内容:程序产生一组流星(比如10个),从屏幕顶部下降飞向地面。2一组流星中,每个流星的字符颜色是随机的,下降的位置是随机的,下降的速度也是随机的。一个流星下落只能去掉一个#号,当最后一行地面有#被去掉时,程序终止。三概要设计○1首先定义二维数组screen表示地面和天空,此数组是一个24行81列的字符数组。上面的行表示天空,数组单元的值是空格;最下面的几行(如5行)表示地面,数组单元的值是’#’;整个屏幕的大小是80*25,即25行80列,为了在输出最后一行时不换行滚屏,程序只能利用上面的24行空间。把数组定义成81列的目的是,每行的最后字符赋值成’\0’,就可以按照字符串的方式输出每行文本了。○2编写的程序在下降过程中,程序必须知道流星的字符、颜色、位置、速度,因此程序需要定义以下几个数组变量:存放流星字符的数组,存放流星字符颜色的数组,存放流星行位置的数组,存放流星4列位置的数组,存放流星下降速度的数组。○3输出时程序首先输出地面和天空,即输出定义的二维数组screen中的字符串,前21行是空行,后3行是#号。这样screen[24][81]的字符矩阵就与整个屏幕对应起来。然后随时机产生一组流星数据,包括字符、颜色、位置和速度。速度用一次下降多少行来表示,最大的速度是4。由于要随机产生这些数据,因此需要调用random函数。(random函数的原型是intrandom(intnum);这个函数产生一个0—num-1之间的一个随机数。流星字符可以这样产生:random(26)+’A’;流星字符的颜色可以这样产生:random(16)+1;流星下降的位置可以这样产生:random(4)+1;流星的行位置一开始都是1;流星的列位置可以这样产生:random(80)+1;但要保证所有流星的列位置不能相同。调用random之前,用randomize()库函数进行初始化。两个库函数都在stdlib.h文件中。)设置后,每个流星按照自己的速度下落,所谓的下落就是逐行移动流星字符:在下一行新的位置上显示流星字符,在原来的位置上显示空格以便擦除流星字符,然后再延迟等待几十毫秒。这样循环往复就构成了流星下落的动画。但要注意,流星的速度各不相同,而一次下落多行的流星也要逐行下落。如果流星的新位置所对应的screen的单元格的值是’#’,则表示撞到了地面。这种情况下在流星的新位置上输出空格,擦除#号,并且对screen相应的单元赋值为空格,流星字符也要赋值为空格,以表示流星消失。○4当screen[23]中任何一个单元格是空格时,程序终止。5四详细设计模块一:输入天空和地面,天空和地面都是静止的。模块二:产生一组流星,流星的表示。模块三:流行的颜色,位置,速度。模块四:若碰到#号,流星和#号同时消失。模块五:若第24行的流星被碰到,程序终止。五运行界面1程序框图流星的实现输入天空和地面产生一组流星流行的颜色,位置,速度若碰到#号,流星和#号同62程序清单#includestdio.h#includestdlib.h#includetime.h#includewindows.h#includeconio.h7#defineROW24#defineCOL81#defineREAL100#defineNUM10#defineSPEED4intrandom(intnum);staticvoidsetSky();staticvoiddisplay();intcheck_last_row();voidword_n_down();intword_one_down(intbegin,intposition,intspeed,intword,int*word_end);voidgotoxy(intx,inty);charsky_ground[REAL][COL];inttest=0;intcycle_end=0;intword_end[NUM];intlist=0;8intbegin[NUM];intposition[NUM];intword[NUM];intspeed[NUM];intmain(){intend_flag=0;time_tt;srand((unsigned)time(&t));setSky();while(!(end_flag=check_last_row())){for(inta=0;aNUM;a++)word_end[a]=0;list=0;cycle_end=0;word_n_down();}system(pause);return0;9}staticvoidsetSky(){for(intb=0;bREAL;b++){for(intc=0;cCOL-1;c++){sky_ground[b][c]='';}sky_ground[b][COL-1]='\0';}for(intd=ROW-5;dROW;d++){for(inte=0;eCOL-1;e++){sky_ground[d][e]='#';}sky_ground[d][COL-1]='\0';}}10staticvoiddisplay(){gotoxy(0,0);for(intf=0;fROW;f++){printf(%s,sky_ground[f]);}}intrandom(intnum){return(rand()%num);}intcheck_last_row(){for(intg=0;gCOL;g++){if(sky_ground[23][g]=='')return1;}return0;11}voidword_n_down(){for(inth=0;hNUM;h++){begin[h]=random(ROW-5);position[h]=random(COL-2);word[h]=random(26)+'A';speed[h]=random(SPEED)+1;}while(1){if(cycle_end=NUM)break;test=list-1;if(test0)test=0;if(check_last_row()){system(pause);exit(0);12}for(inti=0;iNUM;i++)word_one_down(begin[i],position[i],speed[i],word[i],&word_end[i]);list++;display();Sleep(200);}}intword_one_down(intbegin,intposition,intspeed,intword,int*word_end){if((*word_end)==0){if(begin+list*speed=ROW)return0;sky_ground[begin+test*speed][position]='';if(begin+list*speed=19){for(intz=19;zROW;z++){if(sky_ground[z][position]=='#')13{sky_ground[z][position]='';*word_end=1;cycle_end++;break;}}}else{sky_ground[begin+list*speed][position]=word;}}return0;}voidgotoxy(intx,inty){COORDcoord;coord.X=x;coord.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);14}3、系统运行结果15六设计总结经过一个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。虽然设计时完成了,但是我觉得其中还是由一些不足之处:1.警告句。程序中缺少一些警告句,例如:“是否真的删除(y/n)?”。2.重名的情况。由于考虑的不周全,没有设计遇到重名的情况该怎么处理。3.选择单一。我们设计的程序中,只设计了按名字选择,进行操作,忽略了重名的情况。短短的一周课程设计结束了,但是这段时间里,我又学到了更多C知识,如:对象数组,string类,文件流等,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。,也看到了团队精神和互帮互助的重要性。这一点会让我终生受益。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。16七教师评语评阅教师:评阅时间: