版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附件1: 攀枝花学院学生课程设计(论文)题 目: 俄罗斯方块 学生姓名: 陈小蝶 学 号: 201310804005 所在院(系): 数学与计算机学院 专 业: 2013级软件工程 班 级: 软件工程1班 指 导 教 师: 张会 职称: 2014年6 月 23日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书题目俄罗斯方块1、课程设计的目的通过本课程设计使学生能够较全面的掌握面向对象程序设计的有关概念和开发方法,以便能较全面地理解、掌握和综合运用所学的知识,提高自身的编程能力。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)实现一个俄罗斯游戏,要求:(1)尽量使用图形用户界面方
2、式实现(不作硬性要求)(2)可以实现人机对战,自动判断胜负(3)界面美观3、主要参考文献4、课程设计工作进度计划序号时间(天)内容安排备注11分析设计准备周一22编程调试阶段周至周三31编写课程设计报告周四41考核周五总计5(天)指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日注:任务书由指导教师填写。附件3: 课程设计(论文)指导教师成绩评定表题目名称评分项目分值得分评价内涵工作表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03
3、课题工作量7按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07计算及计算机应用能力5具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。08对计算或实验结果的分析能力(综合分析能
4、力、技术经济分析能力)10具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度5符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新10对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日 摘 要 近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序采用全世界最金典的游戏俄罗斯方块作为背景,程序设置了鼠标和键盘两个选择
5、方式,游戏运行时随着等级的提高而速度加快,这需要玩家快速操作。因此,本程序主要意义是为高手玩家提供训练平台。其次也可为刚踏入游戏领域的新手们,提供一个很好的锻炼机会。 本次课程设计主要解决利用visual c+设计实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。对于每个俄罗斯方块各自的形态变化改变到下一个形态利用数组来实现,在程序设计中,采用win32机制来实现,并且直接从架构的其中一个类对象中继承下来,将它完善而变成有某功能特性的物件对象。关键词 俄罗斯方块 数据结构 算法 数组 visual c+ 目 录摘 要一、 绪论2 1.1 课题背景2二、课程设计的要求与目的32.
6、1 课程设计的要求32.2课程设计的目的3三、程序需求分析3.1 功能需求3.2方块及各种变化需求3.3操作需求 3.31 向上键 3.32向下键 3.33向右键.四、程序流程图 4.1 主要功能设计 4.2 程序流程图 4.3 游戏界面 4.4生成方块 4.5 方块变形 4.6 方块显示 4.7 障碍判断 4.8 消行记分 4.9 暂停退出 4.10 软件使用说明五、源程序代码5.1 源程序代码六、程序结果 6.1 程序结果参考文献致 谢56 第一章 绪论 俄罗斯方块是个老幼皆宜的小游戏,是经久不衰的一款游戏,自从它诞生那天起就一直深受人们的喜爱。几乎每个人都玩过这个游戏,也是人们接触最多的
7、一款游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停得产生,用户根据键盘的四个方向翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键消息函数实现)。然后程序根据这七种方块堆叠成各种不停得模型。1.1游戏的背景 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾造成的轰动与造成的经济价值可言说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人alex pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶饭不思不想的那个俄罗斯方块时代。 俄罗斯方块最
8、早还是出现在pc机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对于一般用户来说,它的规则简单,容易上手,且u、游戏过程变化无穷,俄罗斯方块游戏现在基本上是每个手机必备的游戏,种类千变万化,多种多样。第二章 课程设计的目的与要求2.1课程设计的目的 本课程是一个综合性的实践教学环节,其目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本的流程,提高学生的综合应用能力。2.2课程设计的要求要求用vc+编写与
9、实现俄罗斯方块。要求包括系统的需求分析;系统总框图及每个模块的设计分析;算法的设计与实现;游戏的内部实现;游戏区域绘画的实现;系统存在的问题及错误处理;列出所有定义的函数及说明;附上源程序;第三章 程序需求分析3.1 功能需求随机给出不同的形状下落填充给定的区域,若填满一条便消掉,记分,设计不同的游戏难度,即方块下落的速度不同,若在游戏中各形状填满了给定区域为输者。3.2 方块及各种变换需求本游戏需要七种方块,而每种方块还可以进行旋转。每种方块每行每列最多只有4个小方块。可以将它们放在一个n*m的区域内,该区域可以看做是有许多个等面积小方块构成的区域,而这些区域的状态只有两种,被方块占据或空闲
10、。因此,对于整个游戏区域的空间是被占据或空闲,可以用一位数来标识。对于七种方块和它们旋转后的形态我们可以用不同的标识进行标记。对于旋转,游戏中所有方块都是按照逆时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度。任何方块经过一个旋转周期还会变回原型。3.3 操作需求 3.31 向上键 产生方块旋转操作,方块并非任何情况都能旋转,如果旋转后与小方块矩阵显示的方块有冲突或超出边界是,均不发生旋转。因此首先要判断是否有足够的空间进行旋转。然后是旋转是否旋转。3.32 向下键产生方块加速下落操作,如果方块已经达到游戏区域底部或者有其他方块遮挡,则方块停止下降。3.33 向
11、右键产生下落方块右移操作。首先要判断此方块是否能够发生右移,当越界或被其他显示方块阻挡时,则不能右移。第四章 详细设计4.1 主要功能设计 根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏(f8)、游戏的暂停继续(s)和退出游戏(q)。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。4.2 程序流程图 根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根
12、据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应esc按键,提示是否退出程序。 4.3 游戏界面 俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。 游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。 4.4 生成方块 本程序中生成的方块
13、有7种形状,每一种方块以shapeindex标记,在程序运行生成方块时,调用shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数make(),将先产生的赋给游戏当前方块,第二个赋给预览图方块。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。 4.5 方块变形 俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下“”键,程序判断可以变
14、形后,根据当前方块的形状序号shapeindex和变化形状序号changeindex调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。4.6 方块显示以上方块的操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是draw()函数的作用。把当前运动的方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。然后在draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“”组成方块。 4.7 障碍判断障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、变形。当方块下落遇到下面有方
15、块或者到达下边界则应停止下落并记录数据,存入背景数据数组。变形时应判断这个变形是否可以进行,如果有障碍则不能变形。例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。所有这些判断都由meet()函数进行,根据是否有障碍返回1或0,再由其他函数接收执行相应操作。4.8 消行计分 游戏玩家拼满一行后,程序消去满行,并计分。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。分数达到一定程度,等级提升,分数暂定为每1000升一级。4.9 暂停退出游戏的友好性在于
16、能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。本程序可以在用户需要的时候响应esc按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择。程序调试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。当方块满一行后,可以消除该行,同时记录分数和等级。按下esc键红色提示信息正常显示,可以响应y,n键决定是否退出游戏4.10 软件使用说明 打开俄罗斯方块游戏后,通过控制方向区域的“
17、”、“”、“”、“”来控制,“”键代表变形转换,“”、“”、“右”均代表方向键,“q”代表退出游戏键。若想暂停游戏,可通过“s”键,当初来询问框是,可不做选择,则可达到暂停的效果第五章 源代码源程序代码(详细的注释) #include #include #include #include #include class consolepublic: console() hstdoutput = invalid_handle_value; hstderror = invalid_handle_value; bool open( void ) hstdoutput = getstdhandle( s
18、td_output_handle ); hstderror = getstdhandle( std_error_handle ); return invalid_handle_value!=hstdoutput & invalid_handle_value!=hstderror; inline bool settitle( char* title ) / 设置标题 return true=setconsoletitle(title); bool removecursor( void ) / 去处光标 console_cursor_info cci; if( !getconsolecursori
19、nfo( hstdoutput, &cci ) ) return false; cci.bvisible = false; if( !setconsolecursorinfo( hstdoutput, &cci ) ) return false; if( !getconsolecursorinfo( hstderror, &cci ) ) return false; cci.bvisible = false; if( !setconsolecursorinfo( hstderror, &cci ) ) return false; return true; bool setwindowrect(
20、 short x, short y ) / 设置窗体尺寸 small_rect wrt = 0, 0, x, y ; if( !setconsolewindowinfo( hstdoutput, true, &wrt ) ) return false; if( !setconsolewindowinfo( hstderror, true, &wrt ) ) return false; return true; bool setbufsize( short x, short y ) / 设置缓冲尺寸 coord coord = x, y ; if( !setconsolescreenbuffer
21、size( hstdoutput, coord ) ) return false; if( !setconsolescreenbuffersize( hstderror, coord ) ) return false; return true; bool gotoxy( short x, short y ) / 移动光标 coord coord = x, y ; if( !setconsolecursorposition( hstdoutput, coord ) ) return false; if( !setconsolecursorposition( hstderror, coord )
22、) return false; return true; bool setcolor( word color ) / 设置前景色/背景色 if( !setconsoletextattribute( hstdoutput, color ) ) return false; if( !setconsoletextattribute( hstderror, color ) ) return false; return true; bool outputstring( const char* pstr, size_t len=0 ) / 输出字符串 dword n = 0; return true=wr
23、iteconsole( hstdoutput, pstr, len?len:strlen(pstr), &n, null ); bool outputstringnomove( short x, short y, const char* pstr, size_t len=0 ) / 输出字符串 coord coord = x, y ; dword n = 0; return true=writeconsoleoutputcharacter( hstdoutput, pstr, len?len:strlen(pstr), coord, &n ); private: handle hstdoutp
24、ut; 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,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
25、,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 , 1,1,1,0 , 1,0,0,0 , 0,0,0,0 , 0,0,0,0 , 1,0,0,0 , 1,0,0,0 , 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
26、,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 , 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
27、,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 , 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
28、,0,0 ;const word color_a = foreground_green|foreground_red|foreground_intensity; / 运动中的颜色const word color_b = foreground_red; / 固定不动的颜色const word color_c = foreground_green|foreground_red|foreground_blue; / 空白处的颜色int score = 0, level = 0;char data1911 = 0 ;int next = -1;int x=4, y=-2, c=-1, z=0; / x
29、坐标,坐标,当前方块,方向console csl; / 定义控制台对象void drawscorelevel( void ) / 绘制得分 char tmp6; sprintf( tmp, %05d, score ); csl.outputstringnomove( 31, 19, tmp, 5 ); sprintf( tmp, %1d, level ); csl.outputstringnomove( 35, 15, tmp, 1 );void drawnext( void ) / 绘制 next框 中的图形 for( int i=0; i2; +i ) for( int j=0; j4;
30、+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=0; i4; +i ) if( y+i= 19 ) continue; for( int j=0; j4; +j ) if( bkczij = 1 ) csl.setcolor( color ); csl.g
31、otoxy( 2+x*2+j*2, 1+y+i ); csl.outputstring( , 2 ); bool 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+j=1 ) return false; return true;void removerow( void ) / 消行 const char fullline = 1, 1, 1, 1, 1,
32、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+m*2, 1+n ); csl.outputstring( , 2 ); data0m = 0; csl.outputstringnomove( 2+m*2, 1, , 2 )
33、; char data1911 = 0 ;if( linecount = 0 ) return; int _score = 0; switch( linecount ) case 1: _score = 100; break; case 2: _score = 300; break; case 3: _score = 700; break; case 4: _score = 1500;break; score += _score; if( score 99999 ) score = 99999; level = score/10000; drawscorelevel();void movetr
34、ans( 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 ) ) draw( color_c ); +x; draw( color_a ); void movedown( void ) / 向下移 if( isfit( x, y+1, c, z ) ) draw( 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+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 道路景观设施承诺书
- 烟草产品收款流程
- 印刷厂门窗施工合同协议书
- 健身房墙面装修合同协议
- 可持续发展成品油市场管理办法
- 基坑降水施工合同:文物保护工程
- 广告公司合同管理方案
- 建筑公司工程车辆司机聘用合同
- 通信设备维护服务合同
- 流行病的特征
- 二年级《看图写话》教学设计
- 中国的算筹PPT课件
- 《骨盆重要性》PPT课件.ppt
- WHO癌痛的三阶梯止痛的原则
- 尼古拉的三个问题(课堂PPT)
- 山西经济出版社小学第二册四年级信息技术第一单元活动教案
- 高等电力系统分析
- 深圳牛津版英语最新八年级(上) 课文 (带翻译)
- 城市污水处理厂污泥综合处置利用制砖项目可行性研究报告
- 16食品科学与工程2班 吴志宏 年产3000吨茶油工厂设计 定稿
- 近年国内电梯事故案例介绍
评论
0/150
提交评论