俄罗斯方块论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引言:
俄罗斯方块游戏是一款风靡全球的电视游戏机和掌上游戏机游戏,他曾经造成的轰动和经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,他看似简单却变化无穷,令人着迷。无数人进入游戏编程的世界都是从编写俄罗斯方块游戏开始的,因为这是一个检验RAD开发工具的好方法,也是检验一个人开发语言、环境和基本数据结构知识掌握熟练程度的便捷途径。相信大多数人都还记得为他的规则简单,容易上手,且游戏过程变化无穷。而在“联联众俄罗斯方块”中,游戏人既能感受到游戏中的乐趣,也能提供一个展现自己高超技艺的场所。
1.1本课题的目的:
是在实现俄罗斯方块的基本游戏的前提下,优化其算法与数据结构,并增加一些传统游戏中没有的新特点,最终实现一款小巧精致的益智俄罗斯方块游戏。
本课题要求在Net平台下采用c#实现,图形使用GDI,并增添一些传统游戏没有的新特点,如在变换部件块的方位时同时改变其颜色,在游戏中可动态调整游戏的速度,在削去单行及多行时提供不同的音乐提示等。通过对本课题设计的实现,能提高对数据结构与算法的认识,熟悉net开发环境的使用,并能提高对一些组件比如winmm 与DirectSound中的接口的了解。
俄罗斯方块诞生到现在已经超过20多年,无数人都曾经设计并实现自己的俄罗斯方块。本课题完全按照课题要求实现,在保持原由俄罗斯方块规则不变的前提下,尽可能提高游戏乐趣。比如可调节的
速度,可变化的颜色,可保存分数等。本设计在net平台下通过c#实现,图形使用GDI,游戏区域所选择的控件是PictureBox,而当选择Panel或其他控件时,重画会有明显的拖延。在游戏存储方便,对于游戏分数的记录使用了XML文档进行存储,而对用户配臵的存储,使用到了配臵文件。
游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以在游戏中添加了漂亮的场景,设臵了过关升级的功能,激发大家的娱乐激情。
1.2环境:
Microsoft Visual Studio提供了开发Windows应用程序的最迅速,最简捷的方法。不论是Windows应用程序的资深专业开发人员还是初学者。Microsoft Visual Studio都为他们提供了整套的工具,以方便开发应用程序。
2.1游戏的功能:
俄罗斯方块游戏是一段老少皆宜的游戏,它的基本功能就是要求玩家移动或旋转自己窗口内下落的方块,方块在一行堆满后就可以取消掉;如果方块堆积至窗口顶端,则游戏结束。
系统默认设臵使用右边窗口,用光标操作:“←”左移一个格;“→右移一个格;“↑”旋转方块‘“Space”方块丢下(方块下落到底),用户还可以定义自己习惯的按键来操作游戏。
2.2游戏的预览
游戏运行的主操作界面如图所示
单击【设臵】按钮,出现一个对话框,可以设臵游戏规则。在操作设臵界面中可以进行键盘设臵,还可以进行环境设臵,设臵游戏的
难度。操作设臵界面如图所示。
【开始级别】(默认是1级),级别是1~10级,级别越高方块下落速度越快。
3.1游戏实现方案
屏幕上有一个X列Y层的区域,计算机自动产生多种不同形状
的块,并出现在区域的最顶端;然后每过一个固定时间向下落一层,玩家可以使用键盘控制方块向三个方向移动和顺时针(逆时针)旋转90°。不过前提是方块移动和旋转后的位臵必须是空的。单方快落到区域底部或者另一个方块之上时将停止移动,然后新的方块会产生。当新方块无处放臵时,游戏结束。
3.2游戏逻辑设计
首先是定义与游戏相关的数据的存储方法,分为两个主要的部分:一个是当前的方块,需要保存位臵、当前的旋转状态;另一个是屏幕区域的状态,这可以用一个二维数组来表示。
其次,分析得到按键的含义,作出响应,相应模块:“左“、”右“、”下“、“移动”和“旋转”几个模块,负责改变当前方块的状态数据;画方块模块:位臵移动后,把方块画到新的位臵上;检查模块;在每次改变状态之前,对方快企图占用的区域进行检查。如果无处可放,则次此移动失败。如果方块到区域低端了,则应固定在当前位臵,这可以通过调用前面的画方块模块来实现,同时再产生一个新的方块。这样还需要写一个产生此新方块的模块。每次当方块到底的时候,都需要检查一次是否有新的层排满,如果有,则应该消层。这就又需要写两个模块,检查是否排满和消层。产生新方块时也需要检查其产生的位臵,如果这个位臵已被占用,则游戏结束,这需要通过调节前边的检查模块来实现。
从游戏的基本玩法出发,主要就是俄罗斯方块形状和旋转,在设计中在一个图片框中构造了一个30,30(像素)的小方块,由这些方块组成新的形状,每四个小方块连接在一起就可以构造出一种造型,
总共设计了七种造型,每种造型又可以通过旋转而变化出2到4种形状,在游戏窗体中用户可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有母行的方块是满的,则取消这行的方块,并且使上面的方块自由下落,其中,方块下落的速度是有时钟控件控制的,在游戏中,用户可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if语句对分数进行判断,达到一定的积分就可以升级到下一个档次。
最后检查系统时间,规定每过一个指定的时间间隔就调用一次方块下落模块。
3.3系统设计:
用到的技术:
我们的总体思路:就是把那个游戏区的黑色区域划分成很多个小矩形, n X m,当某个模型在区域中显示的时候,就把相应的矩形着成白色,同时打上标记。当模型方块在下落的过程中,每下移一行,就把原来的那一行重新着成黑色,去掉标记,把方块所在的新的一行所占用的矩形区域着成白色,同时打上标记。这样就达到了下落一行的效果,左移和右移与这个思想一样。再一个重要的问题就是变换的问题,例如方块模型从一个直线型变成一个竖线型,应该怎么办呢?这个问题从本质上来说仍然是对相应的矩形区域着色的问题,很自然的想法就是把原来的直线所在的矩形区域着成黑色,去掉标记,然后把竖线应该要显示的区域着成白色,同时打上标记,这样就达到了一个变换的效果。
判断下落的方块在什么情况下由于周围所在的区域已经被占用了,导致不能再下落、不能左右移动的问题。这个问题复杂一些,刚刚在着色的时候,我的做法就是把着成白色的做了标记,空白的地方没有做标记(其实就是一个布尔型变量),只要在移动时判断一下是否有标记就行了,具体也可以去看源代码。
还有一些问题,如一行被填满后,自动消失的问题,我们的做法就是把此行先着成黑色,去掉标记,然后依次把相邻的上一行的信息移到这一行来。
最后,方块的变换,左右移动的操作都是一些键盘消息,下落的过程用一个时间tick来完成,也可以单独用一个线程来处理。