俄罗斯方块C课程设计报告.pdf

上传人:叶*** 文档编号:36133322 上传时间:2022-08-25 格式:PDF 页数:17 大小:315.49KB
返回 下载 相关 举报
俄罗斯方块C课程设计报告.pdf_第1页
第1页 / 共17页
俄罗斯方块C课程设计报告.pdf_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《俄罗斯方块C课程设计报告.pdf》由会员分享,可在线阅读,更多相关《俄罗斯方块C课程设计报告.pdf(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1一、一、题目题目利用 C+编写俄罗斯方块游戏,是俄罗斯游戏能够在 MicrosoftVisualC+6.0 上运行该游戏。二、二、实验目的实验目的一方面通过对程序算法的设计和分析提高我们对问题进行文字论述和文字表达的能力并且培养我们进行知识综合,软件开发和软件的调试技术,开发较大程序的能力。另一方面培养了我们相互合作的精神并培养了我们的创新意识。三、三、需求分析需求分析功能需求功能需求随机给出不同的形状下落填充给定的区域,若填满一条便消掉,记分,设计不同的游戏难度, 即方块下落的速度不同, 若在游戏中各形状填满了给定区域,为输者。方块及各种变换需求方块及各种变换需求本游戏需要有 7 种方块,

2、而每种方块还可以进行旋转。每种方块每行每列最多只有 4 个小方块。可以将它们放在一个 n*m 的区域内,该区域可以看作是有许多个等面积小方块构成的区域,而这些区域的状态只有两种,被方块占据或空闲。因此,对于整个游戏区域的空间是占据或空闲,可以用一位数来标识。对于 7 种方块和它们旋转后的形态我们可以用不同的标识进行标记。对于旋转,游戏中所有方块都是按照逆时针旋转的规则进行的, 而且在旋转过程中它们不会因为旋转而下降, 总会保持在同一高度。 任何方块经过一个旋转周期还会变回原型。操作的需求操作的需求向上键产生方块旋转操作,方块并非任何情况都能旋转,如果旋转后与小方格矩阵显示的方块有冲突或超出边界

3、时,均不能发生旋转。因此首先要判断是否有足够的空间进行旋转。然后选择是否旋转。向下键产生方块加速下落操作,如果方块已经到达游戏区域底部或者已经有其他方块遮挡,则方块停止下降。向左键产生下落方块左移操作。首先要判断此方块是否能够发生左移,当越界或被其他显示方块阻挡时,则不能左移。向右键2产生下落方块右移操作。首先要判断此方块是否能够发生右移,当越界或被其他显示方块阻挡时,则不能右移。四、四、详细设计详细设计主要功能设计主要功能设计根据分析, 俄罗斯方块这个程序一共要实现如下几个功能, 开始游戏 (F8) 、游戏的暂停继续(S)和退出游戏(Q)。其中游戏控制最为主要和重要,它控制着整个游戏的画面和

4、有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。程序流程图程序流程图根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应 Esc 按键,提示是否退出程序。3游戏界面游戏界面俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的

5、绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读4到的数据显示“” ,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。生成方块生成方块本程序中生成的方块有 7 种形状,每一种方块以 shapeindex 标记,在程序运行生成方块时,调用 shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数 make(),将先产生的赋给游戏当前方块, 第二个赋给预览图方块。 以后每次产生一

6、个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。方块变形方块变形俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下“”键,程序判断可以变形后,根据当前方块的形状序号shapeindex和变化形状序号changeindex调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。方块显示方块显示以上方块的操作都是数据层面的操作, 而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是 d

7、raw()函数的作用。把当前运动的方块对应节点存储在一个 4*4 数组里, 变形和生成方块的过程就是更新该数组数据的过程。然后在 draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“”组成方块。5障碍判断障碍判断障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、 变形。当方块下落遇到下面有方块或者到达下边界则应停止下落并记录数据,存入背景数据数组。变形时应判断这个变形是否可以进行,如果有障碍则不能变形。例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。 所有这些判断都由 meet()函数进行, 根据是否有障碍返回 1 或 0,再由其他

8、函数接收执行相应操作。消行计分消行计分游戏玩家拼满一行后,程序消去满行,并计分。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。分数达到一定程度,等级提升,分数暂定为每 1000 升一级。暂停退出暂停退出游戏的友好性在于能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。本程序可以在用户需要的时候响应 Esc 按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择。程序调试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是

9、界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下, 根据按键实现位移和变形。 当方块满一行后, 可以消除该行,同时记录分数和等级。按下 Esc 键红色提示信息正常显示,可以响应 Y,N 键决定是否退出游戏软件使用说明软件使用说明打开俄罗斯方块游戏后,通过控制方向区域的“” 、 “” 、 “” 、 “”来控制, “”键代表变形转换, “” 、 “” 、 “右”均代表方向键, “Q”代表退出游戏键。若想暂停游戏,可通过“S”键,当初来询问框是,可不做选择,则可达到暂停的效果6五、五、实验结果实验结果六、六、经验

10、和教训经验和教训通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其7次在实践中遇到问题去探索和学习,更增加了新知识。在程序设计编写过程中两个类的数据交换是个比较麻烦的过程, 这个类的定义过程中要用到另一个类做参数类型,而在后一个类中亦需要第一个类做参数类型,出现了互相调用的情况。编译提示未定义,只好在两个类外定义函数负责两个类函数的数据交换。实践证明达到了预期的目的,积累了经验。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用 MFC 用 C+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。通过这次的学习设计,我发现我还有许许多多的不足的地方,比如 c

11、+的程序设计,源代码的书写等等,刚开始我发现我的问题后,十分紧张,感觉很绝望,没有别人的帮助,自己动手设计曾经自己想都没想过的东西,虽然很兴奋,但想想自己无从下手,原来的兴奋劲一下子都没了,很忙然。但是,通过与王老师的交流,经过老师的耐心讲解,我慢慢感到希望又重生了,于是我通过上网查找资料,进图书馆查找书籍等,终于知道了俄罗斯方块游戏的设计概念,终于知道了设计的方法,于是,渐渐地我的游戏设计理念诞生了。通过几个礼拜的设计,我的游戏渐渐初见成效了,当我把回车键摁下的一刹那,我十分激动,眼前的既熟悉又陌生的游戏出现在了我的面前,看着自己设计的童年时代经常玩的游戏,我感慨万千。通过这次设计,我学会了

12、很多东西,例如通过网络资料来寻求帮助,自己改正错误,加强了我自己的自己动手能力,对今后的学习和生活有很大的帮助,有助于以后的课程设计顺利完成。七、七、工作日志工作日志周次月日实验、实习项目、课程设计名称实验、实习、课程设计具体地点时数作业或实验、实习报告19.3确定课题,把题目都看遍机房3无19.4确定课题,把题目都看遍机房3无19.5确定课题,把题目都看遍,最终确定题目机房3初步计划报告19.6查找资料,确定方法机房3需求分析报告19.7查找资料,确定方法机房3程序流程图、代码29.10程序修改、改进机房3程序流程图、代码29.11程序修改、改进机房3程序流程图、代码29.12程序编写、调试

13、机房3程序流程图、代码29.13程序联调机房测试程序报告29.14答辩,提交报告机房心得总结8八、八、参考书籍、网址参考书籍、网址1杨永国.Visual C+ 6.0 实用教程.北京:清华大学出版社.2004 年2唐俊明.Visual C+ 6.0 编程实例与技巧.北京:高等教育出版,20023曹向东 张国海 C+语言程序设计 机械工业出版社 20034浦滨C+游戏编程从入门到精通 科学出版社 20065段钢 编著 加密与解密(第三版).电子工业出版社.2009 年 8 月6潘锦平.软件系统开发技术.西安:西安电子科技大学出版社, 1997 年九、九、源程序代码(详细的注释)源程序代码(详细的

14、注释)#include #include #include #include #include class Consolepublic:Console()hStdOutput = INVALID_HANDLE_VALUE;hStdError= INVALID_HANDLE_VALUE;bool Open( void )hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );hStdError= GetStdHandle( STD_ERROR_HANDLE);returnINVALID_HANDLE_VALUE!=hStdOutput&INVALID_HAN

15、DLE_VALUE!=hStdError;inline bool SetTitle( char* title ) / 设置标题return TRUE=SetConsoleTitle(title);bool RemoveCursor( void )/ 去处光标CONSOLE_CURSOR_INFO cci;if( !GetConsoleCursorInfo( hStdOutput, &cci ) ) return false;cci.bVisible = false;if( !SetConsoleCursorInfo( hStdOutput, &cci ) ) return false;if(

16、!GetConsoleCursorInfo( hStdError,&cci ) ) return false;cci.bVisible = false;9if( !SetConsoleCursorInfo( hStdError,&cci ) ) return false;return true;bool SetWindowRect( short x, short y ) / 设置窗体尺寸SMALL_RECT wrt = 0, 0, x, y ;if( !SetConsoleWindowInfo( hStdOutput, TRUE, &wrt ) ) return false;if( !SetC

17、onsoleWindowInfo( hStdError,TRUE, &wrt ) ) return false;return true;bool SetBufSize( short x, short y ) / 设置缓冲尺寸COORD coord = x, y ;if( !SetConsoleScreenBufferSize( hStdOutput, coord ) ) return false;if( !SetConsoleScreenBufferSize( hStdError,coord ) ) return false;return true;bool GotoXY( short x,

18、short y ) / 移动光标COORD coord = x, y ;if( !SetConsoleCursorPosition( hStdOutput, coord ) ) return false;if( !SetConsoleCursorPosition( hStdError,coord ) ) return false;return true;bool SetColor( WORD color ) / 设置前景色/背景色if( !SetConsoleTextAttribute( hStdOutput, color ) ) return false;if( !SetConsoleTex

19、tAttribute( hStdError,color ) ) return false;return true;bool OutputString( const char* pstr, size_t len=0 ) / 输出字符串DWORD n = 0;return TRUE=WriteConsole( hStdOutput, pstr, len?len:strlen(pstr), &n,NULL );bool OutputStringNoMove( short x, short y, const char* pstr, size_t len=0 ) / 输出字符串COORD coord =

20、 x, y ;DWORD n = 0;returnTRUE=WriteConsoleOutputCharacter(hStdOutput,pstr,len?len:strlen(pstr), coord, &n );10private:HANDLE hStdOutput;HANDLE hStdError;const char bg = Begin: F8 Sleep Quit 0 00000;const char bk7444 = 0,1,1,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,1,0,0 , 0,1,0,0 , 0,0,0,0 , 0,

21、1,1,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,1,0,0 , 0,1,0,0 , 0,0,0,0 , 1,1,0,0 , 0,1,1,0 , 0,0,0,0 , 0,0,0,0 , 0,1,0,0 , 1,1,0,0 , 1,0,0,0 , 0,0,0,0 , 1,1,0,0 , 0,1,1,0 , 0,0,0,0 , 0,0,0,0 , 0,1,0,0 , 1,1,0,0 , 1,0,0,0 , 0,0,0,0 ,11 1,1,1,0 , 1,0,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,0,0,0 ,

22、1,1,0,0 , 0,0,0,0 , 0,0,1,0 , 1,1,1,0 , 0,0,0,0 , 0,0,0,0 , 1,1,0,0 , 0,1,0,0 , 0,1,0,0 , 0,0,0,0 , 1,1,1,0 , 0,0,1,0 , 0,0,0,0 , 0,0,0,0 , 1,1,0,0 , 1,0,0,0 , 1,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,1,1,0 , 0,0,0,0 , 0,0,0,0 , 0,1,0,0 , 0,1,0,0 , 1,1,0,0 , 0,0,0,0 , 1,1,0,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 ,

23、1,1,0,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 , 1,1,0,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 , 1,1,0,0 , 1,1,0,0 , 0,0,0,0 , 0,0,0,0 , 0,1,0,0 , 1,1,1,0 , 0,0,0,0 , 0,0,0,0 , 0,1,0,0 , 1,1,0,0 , 0,1,0,0 , 0,0,0,0 , 1,1,1,0 , 0,1,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,1,0,0 , 1,0,0,0 , 0,0,0,0 , 1,1,1,1 , 0,0,0,0 ,

24、0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,0,0,0 , 1,0,0,0 , 1,0,0,0 , 1,1,1,1 , 0,0,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,0,0,0 , 1,0,0,0 , 1,0,0,0 ;constWORDCOLOR_A=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;/运动中的颜色constWORDCOLOR_B=FOREGROUND_RED;/ 固定不动的颜色constWORDCOLOR_C=FOREGROUND_GREEN|FOREGROUN

25、D_RED|FOREGROUND_BLUE;/空白处的颜色int score = 0, level = 0;12char data1911 = 0 ;int next = -1;int x=4, y=-2, c=-1, z=0; / x 坐标,坐标,当前方块,方向Console csl; / 定义控制台对象void DrawScoreLevel( void ) / 绘制得分char tmp6;sprintf( tmp, %05d, score );csl.OutputStringNoMove( 31, 19, tmp, 5 );sprintf( tmp, %1d, level );csl.Ou

26、tputStringNoMove( 35, 15, tmp, 1 );void DrawNext( void )/ 绘制 next 框 中的图形for( int i=0; i2; +i )for( int j=0; j4; +j )csl.OutputStringNoMove( 28+j*2, 10+i, bknext0ij=0?:,2 );void DrawOver( void )/ 游戏结束csl.OutputStringNoMove( 28, 10, );csl.OutputStringNoMove( 28, 11, );void Draw( WORD color )for( int i

27、=0; i4; +i )if( y+i= 19 ) continue;for( int j=0; j4; +j )if( bkczij = 1 )csl.SetColor( color );csl.GotoXY( 2+x*2+j*2, 1+y+i );csl.OutputString( , 2 );13bool IsFit( int x, int y, int c, int z ) / 给定的 x,y,c,z 是否可行for( int i=0; i4; +i )for( int j=0; j4; +j )if( bkczij=1 )if( y+i =19 | x+j=11 | datay+ix

28、+j=1 ) return false;return true;void RemoveRow( void ) / 消行const char FULLLINE = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;int linecount = 0;for( int i=0; i19; +i )if( 0 = memcmp( datai, FULLLINE, 11 ) )+linecount;for( int m=0; m1; -n )datanm = datan-1m;csl.SetColor( datanm=1?COLOR_B:COLOR_C );csl.GotoXY( 2+

29、m*2, 1+n );csl.OutputString( , 2 );data0m = 0;csl.OutputStringNoMove( 2+m*2, 1, , 2 );char data1911 = 0 ;if( linecount = 0 ) return;int _score = 0;switch( linecount )14case 1: _score =100; break;case 2: _score =300; break;case 3: _score =700; break;case 4: _score = 1500;break;score += _score;if( sco

30、re 99999 ) score = 99999;level = score/10000;DrawScoreLevel();void MoveTrans( void )/ 逆时针翻转if( IsFit( x, y, c, (z+1)%4 ) )Draw( COLOR_C );z=(z+1)%4;Draw( COLOR_A);void MoveLeft( void )/ 向左移if( IsFit( x-1, y, c, z ) )Draw( COLOR_C );-x;Draw( COLOR_A);void MoveRight( void )/ 向右移if( IsFit( x+1, y, c, z

31、 ) )Draw( COLOR_C );+x;Draw( COLOR_A);void MoveDown( void )/ 向下移if( IsFit( x, y+1, c, z ) )15Draw( COLOR_C );+y;Draw( COLOR_A);else if( y != -2 ) / 触底Draw( COLOR_B );for( int i=0; i4; +i )if( y+i0 ) continue;for( int j=0; j4; +j )if( bkczij = 1 )datay+ix+j = 1;RemoveRow();x=4, y=-2, c=next, z=0;next

32、 = rand()%7;DrawNext();else / 游戏结束DrawOver();void MessageDeal( void )int cycle = 9 - level;for( ; ; )for( int i=0; icycle; +i )if( _kbhit() )switch( _getch() )16case Q:case q: / 退出return;break;case S: / 暂停case s:for( ; ; )switch( _getch() )case Q:case q: / 退出return;case S:case s:goto LABLE_CONTINUE;

33、break;LABLE_CONTINUE:break;case 0 xe0: / switch( _getch() )case 0 x4B: / MoveLeft();break;case 0 x50: / MoveDown();break;case 0 x4d: / MoveRight();break; / 变形case 0 x48:MoveTrans();default:break;break;default:break;17Sleep( 55 );MoveDown();int main()csl.Open();csl.SetTitle( 俄罗斯方块 );/ 设置标题csl.RemoveC

34、ursor();/ 去处光标csl.SetWindowRect( 38-1, 21-1 );/ 设置窗体尺寸csl.SetBufSize( 38, 21 );/ 设置缓冲尺寸csl.OutputStringNoMove( 0,0,bg );/ 输出背景字符srand( time(0) );/ 设置随机种子next = rand()%7;DrawNext();for( char c = (char)_getch(); c!=B&c!=b; c=(char)_getch() ) / 开始 Begin;x=4, y=-2, c=next, z=0;next = rand()%7;DrawNext();MessageDeal();return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 公文通知

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁