《俄罗斯方块实验报告.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块实验报告.docx(50页珍藏版)》请在优知文库上搜索。
1、程序设计实践报告(2012/2013学年第2学期)题目:俄罗斯方块嬉戏设计专业学生姓名班级学号指导教师指导单位软件工程系日.期2013.03.27成果辨定叁考标准I程序设计实践环节评分为五级制,即,优秀、良好、中等、与格、不与格.依据程序设计实践过程中学生以下表现评定:学习看法是否端正、试验课前打算是否充分、是否实现课题要求的功能、算法设计是否合理、程序设计语言运用是否娴熟、用户界面设计是否科学、程序设计实践报告完成状况(包括:内容是否详实、文字表达是否流畅、格式是否符合规范、程序注狎是否详细)、答辩表现、考勤等.筒短评语老师签名,2013年3月27日俄罗斯方块嬉戏设计一、课题内容和要求本程序
2、的主要任务就是编写简洁的俄罗斯方块嬉戏,要求设计比较美观和健全的嬉戏界面,可以实现方块预览、方块的限制、显示更新、分数更新以与帮助等基本功能,削减程序木身的错误,增加嬉戏的可操作性。程序的设计将结合些有关C语言图形界面设计的内容,该部分是之前没有接触过的,要求利用这次机会,比较简约地J解相关内容与其简洁应用。本程序的实现是选用WindowsXP/7操作系统以与MicrosoftVisua1.Studio2008C+为编译器,用C语言完成程序设计的实践。运用Win32限制台应用程序,最终在DoS界面卜形成程序的主界面。二、概要设计struct/此结构体数表是打印各个方块的依据/是该程序设计的灵魂
3、intvaryx4;intvary_y4:vary=U0,2.4,6),(0,0,0,0,(0,0,0.0,0,-1.t-2,-3),0,2,2,0),0,0,-1.,-1.,0,-2,-2,-4,0t0,-,-,U0,0,2,2),(0,-1.,-1.,-2),(0,2,2,4,0,0,-1.,-1.,0,0,-2,-2,0,-1.,-1.,-2,0,0,2,4,0,-1.,0,0),0,0,0,2,(0,-1.,-2,-2,0,0,-2,-4),0,-1,-1,-1),0,2,2,2),O,O,-1.,-2tO,2,4,4,O,O,O,-1.,O,-2,-2,-2fO,0,-1.,-2,O
4、,O,2,4),0,-1,-1,-1),(0,O,0,-2)f(O,-1,-2,-2,0,2,4,2),0,O,0,-1.),0,O,2,OJO,-1.,-1.,-2,(0,-2,O,2),0,-1,-1,-1),0,O,-2,0,(O,-1,-1,-2),本程序中关于方块的颜色、运动的速度都采纳的数组常於的形式,数组的编号分别对应方块形态的编号,这样就使得“方块形态一一方块颜色一一运动速度”一一对应起来,更直观和便利地实现动态管理。constintco1.=1.1.,15,12,12,10,10,9);限制方块的颜色constintspeed=0,12,9,6,3,1);限制方块的卜落速度c
5、onstintnunber=(0,2,3,5,7,11,15):/对应方块的类型编号本程序的主体部分是由多个函数的循环多层调用来实现的,主要由以下的九个函数构成: voidPrintNext(intkind)该函数限制”下一个图形预览”中的方块样式,是整个程序的“引导者”、“开拓者二将引导程序的动态实现,将确定者下面几个函数的调用 voidStraightFa1.1(intdepth)该函数限制方块的着陆,是在整个程序中发挥着至关重要的作用,是整个动态过程的“纽带”将详细分功能的实现连串起来。VoidChoiceDirection(int*rev-count)该函数实现键盘对小方块的限制,在小
6、方块着陆的过程中要时刻“监视”,因此,在函数中,每当些变量发生变更时.,即要调用该函数voidRevo1.ve(int*prev_count)该函数限制方块的旋转。该函数必需依附于,即每次有键盘的按动时,都要检验是否按r“t”假如按r,马上执行该函数,实行方块的翻转VOid1.eve1.MoveO该函数限制方块的移动方向。该函数类似于第四个函数,也是依附于voidGetDepth(int*pdepth)该函数可以得到小方块已累积的高度,从而推断小方块是否已经落下。该函数是个在多处都须要调用的函数VOidCheckBoundary0该函数可以限制、防止方块越过边界。一旦可能越过边界,则之前的方向
7、限制无效,在方块左右移动、变更形态时都须要调用该函数VoidCheckFu1.1(int*pscore)检验是否有一行完全被覆盖,若有一行全部被排满的,即刻整体下移。在函数的最终,马上调用该函数voidGameOverO即当depth为。时,嬉戏结束,显示动态结束画面。在函数的最起先,马上调用该函数程序流程图大致如下:说明:该程序的流程图略显困难,但其实质,照旧是依次、选择、循环的运用,唯一困难的就是循环的主体不再是简洁的程序语句而是比较困难的函数,这样就会使得程序的结构比较冗杂,但假如把流程图画出来,就会清楚地看到问题照旧是很简洁。四、关健源码for(i=0;i=0:i)的打印for(int
8、j=0;j17;j+)(gotoxy(36-j*2,3+i);PUIS(”);S1.cep(5);该函数是用来实现嬉戏结束后的动用两层循环来实现主界面方块/延时函数的调用,使得最终的程序界面更有动感)co1.or(back);for(intj=0:j31;j+)for(inti=0;i17;i+)(boardij.having=0;gotoxy(4+2*i,j+3);PUtS();S1.eep(5):)1voidRevo1.ve(int*prev_COUnt)限制方块的旋转,该函数是整个程序中最难的一部分代码(inti;before,x=current.x;before.current,y;(
9、*prev_count)+:(*pevcount)Vconnectionprikind,sum;current,x=current.x+connectionpri_kind.connection_x*prev_count:current,y=current.y+connectionfprikind1.connectiony*prevcount;CheckBoundaryO:调用检验边界函数,防止方块在旋转过程中越出程序界面for(i=0;i16m31)(current,x=current.-connectionpri-kind.connection_x*prev_count;current,y
10、=current.y-connection1.pri_kind.connection_y*prev_count;revo1.ve=0:(*prevcount);before,x=current.x;before,y=current.y;return:)co1.or(back);用背兔色把旋转前的方块覆盖for(i=0;i2)gotoxy(before,x+vary1.kindJ.vary_xi,before,y+varykind.vary_yi);puts(”);)kind-numberpri_kind+*prev_count:co1.or(co1.pri_kind):/打印旋转后的新的方块f
11、or(i=0:i2)(gotoxy(current,x+varykind.vary_xi,current,y+varykind.vary_yi):PUtSe):)S1.eep(speedrank);依据等级来确定旋转、卜落的速度before,x=current.x;before.y=crrent.y;intmain()主函数是将一切子函数连串在一起的工具(srand(unsigned1.ong)time(0):gotoxy(5,5);Printfr一切打算就绪,嬉戏是否起先?n);gotoxy(4,6);Printf(起先嬉戏请按S键,否则按随意其他键退出。n):charc;c=getchar
12、();if(c!=S)exit(0);system(*,C1.Sa,):/检验systcm(*co1.or24*);设置背景颜色intSeorC=0;文件是否能够胜利打开FI1.E*fp=fopen(Ue1.s.txt,r);ifCfp=NU1.D(fp=fopen(*Ce1.s.txt*,*w*);fprintf(fp,飞d”,score);fc1.ose(fp):)PrintGarphyO;框架以与其中的文字kind=rand()%7;块的形态intdepth;whi1e(1)巾熨若嬉戏的过程(intpkind=rand()%7;PrintNex1.(pkind);current.x=20;始出现的位置current.y=2;Ge1.Dep1.h(&depth);if(depth=O)(GameOverO;为O时,嬉戏结束score=0;rank=1.:/打印程序的边界和基本随机函数来随机确定方是一个无限循环,不断地方块初当剩余的高度pri_kind=kind;if(kind=6)kind=15,current.-=2;e1.seif(kind=5)e1.seif(kind=4)e1.seif(kind=3)e1.seif(kind=2)e1.seif(kind=1.)kind=1.1.:kind