ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:26.93KB ,
资源ID:5286300      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5286300.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(俄罗斯方块实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

俄罗斯方块实验报告.docx

1、俄罗斯方块实验报告程序设计实践报告(2012/2013学年第2学期)题 目: 俄罗斯方块游戏设计专 业学 生 姓 名班 级 学 号指 导 教 师指 导 单 位 软件工程系日 期 2013.03.27-成绩评定参考标准:程序设计实践环节评分为五级制,即:优秀、良好、中等、及格、不及格。根据程序设计实践过程中学生以下表现评定:学习态度是否端正、实验课前准备是否充分、是否实现课题要求的功能、算法设计是否合理、程序设计语言使用是否熟练、用户界面设计是否科学、程序设计实践报告完成情况(包括:内容是否详实、文字表达是否流畅、格式是否符合规范、程序注释是否具体)、答辩表现、考勤等。教师签名:2013年3月2

2、7日简短评语评分等级-俄罗斯方块游戏设计一、课题内容和要求本程序的主要任务就是编写简单的俄罗斯方块游戏,要求设计比较美观和健全的游戏界面,可以实现方块预览、方块的控制、显示更新、分数更新以及帮助等基本功能,减少程序本身的错误,增强游戏的可操作性。程序的设计将结合一些有关C语言图形界面设计的内容,该部分是之前没有接触过的,要求利用这次机会,比较简约地了解相关内容及其简单应用。本程序的实现是选用WindowsXP/7操作系统 以及 MicrosoftVisualStudio2008C+为编译器,用C语言完成程序设计的实践。使用Win32控制台应用程序,最终在DOS界面下形成程序的主界面。二、概要设

3、计struct /此结构体数表是打印各个方块的依据 /是该程序设计的灵魂intvary_x4;intvary_y4;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,

4、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; /控制方块的下落速度constintnum

5、ber=0,2,3,5,7,11,15; /对应方块的类型编号本程序的主体部分是由多个函数的循环多层调用来实现的,主要由以下的九个函数构成:-voidPrintNext(intpkind)/该函数控制“下一个图形预览”中的方块样式,是整个程序的“引导者”、“开拓者”,将引导程序的动态实现,将决定着下面几个函数的调用voidStraightFall(intdepth)/该函数控制方块的降落,是在整个程序中发挥着至关重要的作用,是整个动态过程的“纽带”将具体分功能的实现连串起来。voidChoiceDirection(int*prev_count)/该函数实现键盘对小方块的控制,在小方块降落的过程

6、中要时刻“监视”,因此,在函数中,每当一些变量发生变化时,即要调用该函数voidRevolve(int*prev_count)/该函数控制方块的旋转。该函数必须依附于,即每次有键盘的按动时,都要检验是否按了“”如果按了,立即执行该函数,实行方块的翻转voidLevelMove()/该函数控制方块的移动方向。该函数类似于第四个函数,也是依附于voidGetDepth(int*pdepth)/该函数可以得到小方块已累积的高度,从而判断小方块是否已经落下。该函数是一个在多处都需要调用的函数voidCheckBoundary()/该函数可以控制、防止方块越过边界。一旦可能越过边界,则之前的方向控制无效

7、,在方块左右移动、变化形状时都需要调用该函数voidCheckFull(int*pscore)/检验是否有一行完全被覆盖,若有一行全部被排满的,即刻整体下移。在函数的最后,立刻调用该函数voidGameOver()/即当depth 为0时,游戏结束,显示动态结束画面。在函数的最开始,立刻调用该函数-程序流程图大致如下:初始化界面在“下一个图新预览”内产生随即类型的方块在方块累积主界面产生方块是判断depth是否为0否是判断是否触动按键是判断触碰了何种按键否否根据按键进行相应的操作判断游戏是否结束判断并防止方块运动越界继续降落直至触底 判断并进行消行操作说明:该程序的流程图略显复杂,但其实质,依

8、旧是顺序、选择、循环的使用,唯一复杂的就是循环的主体不再是简单的程序语句而是比较复杂的函数,这样就会使得程序的-结构比较冗杂,但如果把流程图画出来,就会清晰地看到问题依旧是很简单。四、关键源码for(i=0;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+)boardij.having=0;gotoxy(4+2*i,j+3);puts();Sleep

9、(5);voidRevolve(int*prev_count) /控制方块的旋转,该函数是整个程序中最难的一部分代码inti;before.x=current.x;before.y=current.y;(*prev_count)+;(*prev_count)%=connectionpri_kind.sum;current.x=current.x+connectionpri_kind.connection_x*prev_count;current.y=current.y+connectionpri_kind.connection_y*prev_count;CheckBoundary(); /调用

10、检验边界函数,防止方块在旋转过程中越出程序界面for(i=0;i16|m31)current.x=current.x-connectionpri_kind.connection_x*prev_count;current.y=current.y-connectionpri_kind.connection_y*prev_count;revolve=0;(*prev_count)-;before.x=current.x;before.y=current.y;return;color(back); /用背景色把旋转前的方块覆盖for(i=0;i2)gotoxy(before.x+varykind.va

11、ry_xi,before.y+varykind.vary_yi);puts();kind=numberpri_kind+*prev_count;color(colpri_kind); /打印旋转后的新的方块for(i=0;i2)gotoxy(current.x+varykind.vary_xi,current.y+varykind.vary_yi);puts();Sleep(speedrank); /根据等级来决定旋转、下落的速度before.x=current.x;before.y=current.y;intmain() /主函数是将一切子函数连串在一起的工具srand(unsignedlo

12、ng)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(); /打印程序的边界

13、和基本框架以及其中的文字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=

14、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+varykind.vary_xi)/2;intn=current.y-3+varykind.vary_yi;boardmn.having=1;boardmn.color=colpri_kind;-CheckFull(&score); /检验是否有满行的

15、出现,若有,整体下呀,并加分kind=pkind;return0;五、测试数据及其结果分析程序正式运行前所给的提示信息这是程序主界面,由PrintGarphy()打印生成-程序主界面运行过程中的程序界面-这是游戏结束时,动态界面的一瞬间截图-六、程序设计实践中的关键技术难题以及解决办法【问题1】在左右方向改变方块的位置时,若一直按住左键或右键,会出现方块部分或整体越过程序界面的现象。【分析】在程序中层已经定义和调用了函数voidGetdepth() 用来计算已经累计的高度,并由depth的值是否为0来判断是否游戏结束,是否方块已经降落。因此,在程序中还应当定义另一个函数,用来判断是否方块越界,

16、并在其变换和左右移动时调用,以防止方块的越界。【解决方法】在主程序中定义一个新的函数voidCheckBoundary(),其定义如下:voidCheckBoundary()inti,n,m;for(i=0;i4;i+)m=current.x+varykind.vary_xi;if(m36)current.x+=(m4?2:-2);i=0;for(i=0;i4;i+)m=(current.x+varykind.vary_xi-4)/2;n=current.y+varykind.vary_yi-3;if(n31|boardmn.having)if(level=1)current.x+=2;els

17、eif(level=2)current.x-=2;level=0;break;-【问题2】在程序的调用中,发现程序每一次运行,“最高分”都会从0开始记。即使我把HighScore设为全局变量,依旧是出现该问题。【分析】程序的每一次运行,都会把每一个变量初始化。尽管全局变量的作用域是从变量定一开始一直到程序结束,然而,依旧不是“永久”,随着程序的结束而覆灭。因而,解决的办法就是,及时的把最高分写到计算机的文件中,来求得“永久”的保存。【解决方法】在程序中添加以下代码,一旦有新的最高分生成,则立刻写入文件C:els.txt.FILE*fp=fopen(C:els.txt,r)fscanf(fp,%

18、d,&t);fclose(fp);if(*pscoret)fp=fopen(C:els.txt,w);fprintf(fp,%d,*pscore);fclose(fp);color(43);gotoxy(51,16);printf(%d,*pscore);fclose(fp);七、总结与展望两周的编程实践,对于自身编程水平是个不小的提高。实践是认识的来源、实践是认识发展的动力,第一次接触实践课,让我深刻感受到了实践出真知的道理。因此,在以后的学习中,要树立实践的意识,提高把理论知识上升为实践的能力。做成事情的前提是有一个合理可行的规划。在本次程序设计实践的开始阶段,由于编译器的选择问题(即Vi

19、sualC和TurboC),项目几乎停滞不前,导致许多时间白白浪费。因此在以后的实践中,要在任务正式开展之前,就要做好充分的规划,避免手忙脚乱。适当的借鉴和对案例的充分分析加之对书本、互联网等工具的充分使用,才能把一项比较庞大的工程做好。在这次的程序设计中,我在互联网上找到了至少30个有关俄罗斯方块的例子,其中能够无差错运行的少之又少。本人花费了很大的功夫仔细地研究了那六七个案例,体悟它们程序实现的方法,找到之间的区别和相同之处。在阅读每一个程序时,多多少少都会有不完全理解甚至是根本看不懂的地方,这个时候,书本网络就-是一个极好的工具。在两周的时间里,除了思考和面对电脑,剩余的时间几乎就在图书

20、馆里找资料,在追求知识的过程中,也有了许多新的发现。独立的思考是一切成功的基础。把一切的感知和灵感都要归咎与自己的思考。每一个案例的分析都是我独立思考的结果,以后的学习生活中都要善于思考、勤于思考。分部编写各个函数,并对其逐一进行测试,化大为小,是本次实践的一大收获,是编写较复杂程序的有效方法。这样有利于条理的清晰,避免错误。合作与交流是成功的捷径。与同课题的同学合作甚至是与不同课题同学的交流,都会让我产生思想的火花,在困惑自己许久的问题上带来突破。在程序中,本人很想再编写一个计时器,用来计量游戏已经运行的时间,几经尝试都没有成功。初步猜想,可能需要多线程的控制,下一步在这个问题上力求有所突破

21、。-源代码:/*Copyright(C)2013,ZhangXu,NanjingUniversityofPostsandTelecommunications*Allrightsreserved.*当前版本:1.2.1*作 者:ZhangXu*完成日期:2013年3月29日*/#include#include#include#includeconstintback=34;constintcol=11,15,12,12,10,10,9; /用数组记录不同方块的颜色constintspeed=0,12,9,6,3,1; /用数组记录不同的降落速度constintnumber=0,2,3,5,7,11

22、,15;intkind;intpri_kind;intrank=1; /等级状态标记,由此确定下落的速度intrevolve=0;intlevel=0;struct-intx;inty;current,before;structintx;inty;intcolor;boolhaving;board1732;structintvary_x4;intvary_y4;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,

23、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,;structintsum;intconnection_x5;-intconnection_y5;conn

24、ection=2,-2,2,0,1,1,0,0,2,2,-2,0,0,2,-2,2,0,0,4,-2,0,4,-2,0,0,-1,1,4,-4,2,-2,4,0,0,-1,1,4,-2,2,0,0,0,0,0,0,;voidgotoxy(intx,inty) /光标位置确定函数COORDpos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);voidcolor(intb) /该函数的调用可以决定输出内容的颜色HANDLEhConsole=GetStdHandle(STD_OUTPUT_H

25、ANDLE);SetConsoleTextAttribute(hConsole,b);voidPrintGarphy()color(1593); /初始化控制台窗口,获取窗口句柄,设置边框颜色inti,j;gotoxy(2,2); /确定光标从第二行第二列开始,以下开始打印边框-for(i=0;i28;i+)printf();gotoxy(2,35);for(i=0;i28;i+)printf();for(i=0;i33;i+)gotoxy(2,3+i);printf();for(i=0;i33;i+)gotoxy(38,3+i);if(i=7|i=18)printf();elseprintf();for(i=0;i33;i+)gotoxy(56,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1