您好,欢迎访问三七文档
程序设计实践报告(2012/2013学年第2学期)题目:俄罗斯方块游戏设计专业学生姓名班级学号指导教师指导单位软件工程系日期2013.03.27成绩评定参考标准:程序设计实践环节评分为五级制,即:优秀、良好、中等、及格、不及格。根据程序设计实践过程中学生以下表现评定:学习态度是否端正、实验课前准备是否充分、是否实现课题要求的功能、算法设计是否合理、程序设计语言使用是否熟练、用户界面设计是否科学、程序设计实践报告完成情况(包括:内容是否详实、文字表达是否流畅、格式是否符合规范、程序注释是否具体)、答辩表现、考勤等。简短评语教师签名:2013年3月27日评分等级俄罗斯方块游戏设计一、课题内容和要求本程序的主要任务就是编写简单的俄罗斯方块游戏,要求设计比较美观和健全的游戏界面,可以实现方块预览、方块的控制、显示更新、分数更新以及帮助等基本功能,减少程序本身的错误,增强游戏的可操作性。程序的设计将结合一些有关C语言图形界面设计的内容,该部分是之前没有接触过的,要求利用这次机会,比较简约地了解相关内容及其简单应用。本程序的实现是选用WindowsXP/7操作系统以及MicrosoftVisualStudio2008C++为编译器,用C语言完成程序设计的实践。使用Win32控制台应用程序,最终在DOS界面下形成程序的主界面。二、概要设计struct//此结构体数表是打印各个方块的依据{//是该程序设计的灵魂intvary_x[4];intvary_y[4];}vary[]={{{0,2,4,6},{0,0,0,0}},{{0,0,0,0},{0,-1,-2,-3}},{{0,2,2,0},{0,0,-1,-1}},{{0,-2,-2,-4},{0,0,-1,-1}},{{0,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},{0,0,-1,-2}},{{0,2,4,4},{0,0,0,-1}},{{0,-2,-2,-2},{0,0,-1,-2}},{{0,0,2,4},{0,-1,-1,-1}},{{0,0,0,-2},{0,-1,-2,-2}},{{0,2,4,2},{0,0,0,-1}},{{0,0,2,0},{0,-1,-1,-2}},{{0,-2,0,2},{0,-1,-1,-1}},{{0,0,-2,0},{0,-1,-1,-2}},};本程序中关于方块的颜色、运动的速度都采用的数组常量的形式,数组的编号分别对应方块形状的编号,这样就使得“方块形状——方块颜色——运动速度”一一对应起来,更直观和方便地实现动态管理。constintcol[]={11,15,12,12,10,10,9};//控制方块的颜色constintspeed[]={0,12,9,6,3,1};//控制方块的下落速度constintnumber[]={0,2,3,5,7,11,15};//对应方块的类型编号本程序的主体部分是由多个函数的循环多层调用来实现的,主要由以下的九个函数构成:①voidPrintNext(intpkind)//该函数控制“下一个图形预览”中的方块样式,是整个程序的“引导者”、“开拓者”,将引导程序的动态实现,将决定着下面几个函数的调用②voidStraightFall(intdepth)//该函数控制方块的降落,是在整个程序中发挥着至关重要的作用,是整个动态过程的“纽带”将具体分功能的实现连串起来。③voidChoiceDirection(int*prev_count)//该函数实现键盘对小方块的控制,在小方块降落的过程中要时刻“监视”,因此,在②函数中,每当一些变量发生变化时,即要调用该函数④voidRevolve(int**prev_count)//该函数控制方块的旋转。该函数必须依附于③,即每次有键盘的按动时,都要检验是否按了“↑”如果按了,立即执行该函数,实行方块的翻转⑤voidLevelMove()//该函数控制方块的移动方向。该函数类似于第四个函数,也是依附于③⑥voidGetDepth(int*pdepth)//该函数可以得到小方块已累积的高度,从而判断小方块是否已经落下。该函数是一个在多处都需要调用的函数⑦voidCheckBoundary()//该函数可以控制、防止方块越过边界。一旦可能越过边界,则之前的方向控制无效,在方块左右移动、变化形状时都需要调用该函数⑧voidCheckFull(int*pscore)//检验是否有一行完全被覆盖,若有一行全部被排满的,即刻整体下移。在②函数的最后,立刻调用该函数⑨voidGameOver()//即当depth为0时,游戏结束,显示动态结束画面。在②函数的最开始,立刻调用该函数程序流程图大致如下:说明:该程序的流程图略显复杂,但其实质,依旧是顺序、选择、循环的使用,唯一复杂的就是循环的主体不再是简单的程序语句而是比较复杂的函数,这样就会使得程序的结构比较冗杂,但如果把流程图画出来,就会清晰地看到问题依旧是很简单。初始化界面在“下一个图新预览”内产生随即类型的方块在方块累积主界面产生方块判断depth是否为0判断是否触动按键判断触碰了何种按键根据按键进行相应的操作判断并防止方块运动越界继续降落直至触底判断并进行消行操作判断游戏是否结束否是是否否是四、关键源码for(i=0;i4;i++){gotoxy(x+vary[pkind].vary_x[i],y+vary[pkind].vary_y[i]);puts(▆);}//该循环是用来依据上述数表打印各种不同的小方块,是本程序中最基本的语句块voidGameOver()//该函数是用来实现游戏结束后的动画效果{color(391);for(inti=31;i=0;i--)//用两层循环来实现主界面方块的打印for(intj=0;j17;j++){gotoxy(36-j*2,3+i);puts(▆);Sleep(5);//延时函数的调用,使得最终的程序界面更有动感}color(back);for(intj=0;j31;j++)for(inti=0;i17;i++){board[i][j].having=0;gotoxy(4+2*i,j+3);puts(▆);Sleep(5);}}voidRevolve(int**prev_count)//控制方块的旋转,该函数是整个程序中最难的一部分代码{inti;before.x=current.x;before.y=current.y;(**prev_count)++;(**prev_count)%=connection[pri_kind].sum;current.x=current.x+connection[pri_kind].connection_x[**prev_count];current.y=current.y+connection[pri_kind].connection_y[**prev_count];CheckBoundary();//调用检验边界函数,防止方块在旋转过程中越出程序界面for(i=0;i4;i++){intm=(current.x-4+vary[number[pri_kind]+**prev_count].vary_x[i])/2;intn=current.y+vary[number[pri_kind]+**prev_count].vary_y[i]-3;if(board[m][n].having||m16||m0||n31){current.x=current.x-connection[pri_kind].connection_x[**prev_count];current.y=current.y-connection[pri_kind].connection_y[**prev_count];revolve=0;(**prev_count)--;before.x=current.x;before.y=current.y;return;}}color(back);//用背景色把旋转前的方块覆盖for(i=0;i4;i++){if(before.y+vary[kind].vary_y[i]2){gotoxy(before.x+vary[kind].vary_x[i],before.y+vary[kind].vary_y[i]);puts();}}kind=number[pri_kind]+**prev_count;color(col[pri_kind]);//打印旋转后的新的方块for(i=0;i4;i++){if(current.y+vary[kind].vary_y[i]2){gotoxy(current.x+vary[kind].vary_x[i],current.y+vary[kind].vary_y[i]);puts(▆);}}Sleep(speed[rank]);//根据等级来决定旋转、下落的速度before.x=current.x;before.y=current.y;}intmain()//主函数是将一切子函数连串在一起的工具{srand((unsignedlong)time(0));gotoxy(5,5);printf(一切准备就绪,游戏是否开始?\n);gotoxy(4,6);printf(开始游戏请按S键,否则按任意其他键退出。\n);charc;c=getchar();if(c!='S')exit(0);system(CLS);system(color24);//设置背景颜色intscore=0;//检验文件是否能够成功打开FILE*fp=fopen(C:\\els.txt,r);if(fp==NULL){fp=fopen(C:\\els.txt,w);fprintf(fp,%d,score);fclose(fp);}PrintGarphy();//打印程序的边界和基本框架以及其中的文字kind=rand()%7;//随机函数来随机确定方块的形状intdepth;while(1)//是一个无限循环,不断地重复着游戏的过程{intpkind=rand()%7;PrintNext(pkind);current.x=20;//方块初始出现的位置current.y=2;GetDepth(&depth);if(depth==0){GameOver();//当剩余的高度为0时,游戏结束score=0;rank=1;}pri_kind=kind;if(kind==6)kind=15,current.x-=2;elseif(kind==5)kind=11;elseif(kind==4)kind=7;elseif(kind==3)kind=5;elseif(kind==2)kind=3,current.x+=2;elseif(kind==1)kind=2;elsekind=0,current.x-=2;StraightFall(depth);//调用方块下落函数for(inti=0;i4;i++){intm=(current.x-4+vary[kind].vary_x[i])/2;intn=current.y-3+vary[kind].vary_y[i];board[m][n].having=1;board[m][n].color=col[pri_kind];}CheckFull(&score);//检验是否有满行的出现,若有,整体下呀,并加分kind=pkind;}return0;}五、测试数据及其结果分析程序正式运行前所给的提示信息这是程序主界面,由PrintGarphy()打印生成程序主界面运行过程中的程序界面这是游戏结束时,动态界面的一瞬间截图六、
本文标题:俄罗斯方块实验报告
链接地址:https://www.777doc.com/doc-1974365 .html