464520933毕业设计(论文)俄罗斯方块游戏程序设计

上传人:沈*** 文档编号:82084073 上传时间:2022-04-28 格式:DOC 页数:42 大小:266.50KB
收藏 版权申诉 举报 下载
464520933毕业设计(论文)俄罗斯方块游戏程序设计_第1页
第1页 / 共42页
464520933毕业设计(论文)俄罗斯方块游戏程序设计_第2页
第2页 / 共42页
464520933毕业设计(论文)俄罗斯方块游戏程序设计_第3页
第3页 / 共42页
资源描述:

《464520933毕业设计(论文)俄罗斯方块游戏程序设计》由会员分享,可在线阅读,更多相关《464520933毕业设计(论文)俄罗斯方块游戏程序设计(42页珍藏版)》请在装配图网上搜索。

1、大连大学本科毕业设计 俄罗斯方块游戏程序设计1 中文摘要 游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。 随着越来越多的人接触计算机开始,人们对游戏的要求也越来越高,网络游戏占据着计算机游戏非常大的市场,但是很多人同时也特别喜欢玩单机游戏,单机游戏(ConsoleGame),指仅使用一台计算机或者其它游戏平台就可以独立运行的电子游戏。区别于网络游戏,它不需要专门的服务器便可以正常运转游戏,部分也可以通过局域网或者战网进行多人对战。游戏玩家

2、不连入互联网即可在自己的电脑上玩的游戏,模式多为人机对战。为其不能连入互联网而互动性稍显差了一些,但以通过局域网的连接进行多人对战,而不需要专门服务器也可以正常运行的游戏。所以一个好的单机游戏会受到世界上非常多人的追捧。 俄罗斯方块游戏是一款风靡全球的电视游戏机和掌上游戏机游戏,目前在QQ游戏和很多的游戏平台上都能见到俄罗斯方块的身影。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众

3、又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在联众俄罗斯方块中,更有一些联众网络游戏所独有的魅力有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。而它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。无可争议,俄罗斯方块是有史以来最伟大的游戏之一它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物俄罗斯方块举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观某些与坠落的玩

4、具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似俄罗斯方块触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。1.1 电子游戏及其分类 电子游戏,也就是运行在家用电脑、家用电子游戏机或是掌中宝游戏机及街机上的电子游戏程序。电子游戏是一种结合剧情故事、美术、音乐、动画、程序等技术于一身的互动型娱乐软件,涉及到多个行业。 从电子游戏的分类来看,有着多种分类方式。传统的游戏分类是按照游戏类型,将其分为即时战略游戏、第一人称射击游戏、角色扮演游戏、策略型游戏等类别。根据游戏运行平台的不同,可将电子游戏分为游戏机游戏、单机版PC

5、游戏、互动电视游戏、在线游戏和手机游戏。1.2 电子游戏发展现状1.2.1电子游戏在国外的发展现状 真正的电子游戏机产生于20世纪70年代。1971年,麻省理工学院的学生Nolan Bushnell设计了世界上的黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏的发展上取得了非凡的成就。可以说时至今日,电子游戏仍然是外国的天下。1.2.2 电子游戏在国内的发展现状 与电子游戏发达的国家相比,我国在电子游戏方面还存在比较大的差距。目前,我国游戏市场正处于发展阶段,但市场上的游戏软件主要来自日本、美国、韩国等地,但由本土游戏制作人开发创作的游戏正

6、在高速增加,国产原创的游戏即将成为游戏的主流。 2 可行性研究2.1 设计目的 综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。2.2 可行性研究前提 基本需求:系统开发的总体任务是实现游戏的可操作性、美观性、及时性。开发过程遵循软件工程师规范,可采用结构化或面向对象分析设计方法。主要实现windows的GUI程序开发,对游戏中的图形图像进行键盘控制。游戏者可以通过上下左右键来对游戏进行操作。 主要开发目标:采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏

7、,实现windows的GUI程序开发,并通过此次软件开发过程全面提高自身的综合素质。 条件假定和限制:由于本软件目前是我的初次版本,可能还存在一些问题。如果该软件提高版本,本软件需要根据游戏者得要求进行一步的修改。 可行性研究所采用的方法和步骤:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。 评价尺度:由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。2.3 可行性分析 技术可行性:开发本游戏的编程语言有多种,考虑到自身对语言的掌握程度,JAVA 语言

8、进行游戏的开发,采用JAVA GUI 编程来实现界面以及事件的控制。 经济可行性:本游戏的开发旨在完成毕业设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台能运行相应JAVA 程序的电脑便可,所以不用考虑到经济问题。 社会可行性:本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,这方面是完全可行的。3 需求分析3.1 游戏需求 俄罗斯方块游戏由28种不同状态的方块随机产生,方块定时下移,下落的时候玩家下、左、右控制键来控制方块的移动,由上控制键来控制方块的翻转,以便玩家可以得到合适的形状和

9、位置落下。如果方块落下后能完全填满一层,则这一层消去,并且给玩家加分,若是方块把所有的显示方框的窗口填满,则游戏失败。游戏功能需求如下:游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景、方块用的颜色可以根据喜好来自己设定,在一定的区域内运动和变形,落下后的障碍物可以用不同颜色显示,这样看起来会有一定的美感。游戏形状需求:用数组作为存储方块28 种状态的数据结构,即长条形、Z 字形、反Z 形、田字形、7 字形、反7 形、T 字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。键盘处理事件需求:方块下落时,可通过键盘方向键(上、下、左、右键)对该

10、方块进行向上(变形),向下(加速)、向左、向右移动。鼠标处理事件需求:通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换的显示,以及游戏帮助等功能。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。3.2 接口控制 本游戏通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。3.3 方案论证 学校现已开设的课程有C语言、C+,java,自己本身自学了Java,通过网上以及图书馆的资料,知道可以通过C,C+,VB,Delphi,Java实现俄罗斯方块游戏的设计。下面简单介绍下Java的优点:3.

11、3.1 Java的优点(1) 安全性 Java 是一种安全的网络编程语言,不支持指针类型,一切对内存的访问都必须通过对象的实例来实现。这样能够防止他人使用欺骗手段访问对象的私有成员,也能够避免在指针操作中易产生的错误。此外,Java 的安全性体现在多个层次上:在编译层,有语法检查;在解释层,有字节码校验器,可进行代码段格式测试和规则检查、访问权限和类型转换合法性检查、操作数堆栈的上溢和下溢检测、代码参数类型合法性检查等;在平台层上,通过配置策略,可设定访问资源域,无须区分本地或远程。(2) 可移植性 Java 具备有很好的移植性,这主要得益于它与平台无关的特性。同时,Java 的类库中也实现了

12、与平台无关的接口,这使得这些类库也能移植。同时,Java 编译器主要是由Java 本身来实现的,Java 的运行系统(解释器)由标准C 语言实现,因而整个Java系统都具有可移植性。(3) 多线程机制 Java 具有多线程机制,这使得应用程序能够并行地执行。它的同步机制也保证了对共享数据的共享操作,而且线程具有优先级的机制,有助于分别使用不同线程完成特定行为,也提高了交互的实时响应能力。Java 的多线程技术使网上实时交互实现很容易,从而为解决网上大数量的客户访问提供了技术基础。(4) 跨平台 通常,在Windows 下编写的程序是不能直接拿到UNIX 上运行的,因为程序的执行最终必须转换成为

13、计算机硬件的机器指令来执行,专门为某种计算机硬件和操作系统编写的程序是不能够直接放到其他类型的计算机硬件上执行的,至少要做移植工作。要想让程序能够在不同的计算机上运行,就要求程序设计语言能够跨越各种软件和硬件平台,而Java 恰恰满足了这一需求。Java 编译器能够产生一种与计算机体系结构无关的字节指令,只要安装了Java 虚拟机,Java 就可以在相应的处理机上执行。3.3.2 方案的选择 面向对象的程序设计吸取了结构化程序设计的先进思想,并把它们同几个支持用户用新方法进行程序设计的有力概念结合在一起。 所有面向对象的程序设计语言一般都包含三个概念:封装、多态性和继承性。 这种方法要求语言必

14、须具备抽象、封装、继承和多态性这几个关键要素。 面向对象的程序设计,是通过数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用作样板,在需要时再建立其副本。C+和Java在面向对象这方面比VB要强,所以我排除了用VB做的可能性。但是C+为了与C语言兼容,其是包含了些面向过程的成分;Java除了C+中非面向过程的部分,其程序编写过程就是设计、实现类,定义其属性、行为的过程。还有Java特有的“沙箱”机制是其安全性的保障,同时它去除了C+中易造成的错误指针,增加了自动内存管理等措施,保证了Java程序运行的可靠性。 所以经过再三比较了三种语言后,决定采用Jav

15、a语言编写俄罗斯方块。3.4 软硬件需求操作系统Windows98/me/2000/XP/2003内存容量64MB显卡要求8M声卡要求支持DirectX 8.0 声卡交互工具键盘/鼠标CPU奔腾133以上光驱8倍速以上硬盘空间400MB显示器VGA以上显示器开发及运行软件JDK1.5以上版本4 概要设计4.1 游戏设计所要遵循的规范一个良好的程序,在编写之前,必须要制定各种编写规范,以便组内各成员协调工作。当然,本游戏只是一个小程序,过多的规范制定显得没有必要,但是,也必须制定一个对于变量的命名规则,这有利于设计出一个可读性高的程序。本程序变量的命名规则为:所有变量一律使用相应的英文单词命名如

16、果同一类中需要创建多个同一类型,功能相似的变量,变量的前缀应使用统一的英文单词,后缀为下划线“_”加数字。比如,从JButton对象创建开始按钮,可以命名为:startbutton。再如,创建多个道具按钮,可以命名为toolbutton_1,toolbutton_2等等。方法命名尽量使用能够描述本方法功能的英文单词比如,游戏初始化可以用gameinitial。类名字命名也应当使用能够描述本类功能的英文单词。如方块类,可以用class block。4.2 游戏总体设计分析Java为纯面向对象(Object-Oriented,OO)的程序语言,它的诸多优点在此就不作论述了。从面向对象的观念出发,本

17、程序主要可分为以下几个模块: 1 客户端GUI模块2 方块及地图数据模块3 音频文件播放模块4 道具使用模块4.3 系统流程结构设计ShapeFactory图形工厂ControllerGamePanel处理按键事件 生产 触发按键事件 Shape定时下落显示处理逻辑Ground4.4 功能模块图的设计4.4.1 模型层功能模块图设计下落产生障碍生产图形图形障碍物图形工厂4.4.2 视图层功能模块图设计游戏面板GamePanel障碍物显示方块显示4.4.3 控制层功能模块图设计中央控制器Controller 类处理按键和鼠标事件显示面板显示图形和障碍物图形工厂生产图形4.4.4 俄罗斯方块流程图

18、开始到达底部销行操作生成下一个下坠物下一个下降单位将新生的下坠物代替旧的“下一个下坠物”将旧的“下一个下坠物”用作当前下坠物到达底部销行操作游戏结束游戏结束处理结束开始4.4.5 旋转方块控制线程工作图随机休眠一定时间休眠时间结束休眠一定时间检测现有方块是否已经落下 否 否 是得到新方块 游戏是否结束方块是否已经落下 是结束 否 是休眠一定时间旋转方块5 详细设计5.1 运用的各种类Shape类Void moveLeft(); /左移Void moveRidgt(); /右移Void moveDown(); /下移Void rotatel(); /旋转(变形)Void drawMe(); /显

19、示Ground 类Void accept(Shape); /接受图形,把图形变成障碍物Void drawMe(); /显示游戏显示面板 GamePanel 类Void display(); /显示Shape Factory 类(图形工厂)Shape getShape(); /生产出不同形状的图形5.2 图形的产生 通过图形工厂类ShapeFactory 的getShape(ShapeListener listener)方法随机产生方块的某种状态,这里运用了工厂设计模式,这种设计模式是为了实现高内聚低耦合而存在的,这种设计模式的通俗解释就是:想要一个产品,需要让工厂给生产一个,要告诉工厂要生产什

20、么产品,就把需要生产的这个产品当做参数传给工厂类的生产产品的方法,然后根据传进来的产品,而决定工厂人生产什么产品,产生出来产品后,最后要返回要的这个东西。随机产生一个数随机数Z字形一字形反Z7字形倒T形田字形反7字5.3 方块的翻转与移动 方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变方块数据第二维turnstate的值,然后重新绘制方块即可。但是,这里边也会出现一个问题,这何种时候,方块不能再翻转和移动。5.3.1 方块的移动 很显然,当方块移动到地图的左右边界处,或者落下去后,不能再继续移动;另一种情况就是,当方块要移动的方

21、向被其他方块挡住时,方块不能再移动。 确定方块移动的规则后,接下来就是如何将这种规则用算法表示的问题了。比如,当方块移动的左边界处时,方块不能再继续往左移动了,这个时候,肯定有一个条件成立,那就是方块的横坐标必定是小于或者等于零的。 如果方块的横坐标等于0,方块就不能再移动,那么方块数组的第一列至少有一个值为1,这种情况比较简单,但是,如果方块数组的第一列全为0时,也就是说,当方块数组有1的那列碰到边界时,方块才不能移动,这个时候,首次出现1的那列的横坐标为0,而方块数组的横坐标肯定已经小于0了。 假定我们以x记录方块数组的横坐标,以j记录方块不能移动时,方块数组中首次出现1的那列,当方块不能

22、移动时,x+j的值必定是等于0的。 同理,当方块到达右边界不能移动时,我们可以从方块数组的右边开始检测,记录下首先出现1的那列的值,这个时候,x+j一定是等于14的。 当方块落下后,方块同样不能再移动。这又分为两种情况,一种是要坠下的地方还没有方块,这个时候,只要可以记录下方块数组中最后出现1的那一行,假定那是第i行,这样,只要y+i等于24,就可以认定方块已经落到游戏地图的底部,不能再继续下落。 当要方块下边或者左右有方块时,可以确定下边有方块的那一格在游戏地图中的纵坐标是横坐标或纵坐标是x+j+1或者y+i+1,假定那一格的纵坐标坐标或者横坐标为y或x,那么游戏地图数组中x+j+1y或者x

23、y+i+1这个元素的值必定是2。 综合以上几种情况,我们可以列出方块移动条件判定表,如表5.1所示:表 5.1 方块移动条件判定表12345678条件是否有阻隔TTTTTTTFx+j=0|gameareay+ix+j+1=2TFTTTFTx+j=14|gameareay+ix+j-1=2FTFTFTTy+i=24|gameareay+i+1x+j=2FFFFTTT动作左移动右移动下移动5.3.2 方块的翻转 大多数的俄罗斯方块游戏的翻转判定条件都比较简单,即方块处在边界处时就不能再翻转,因为这种时候翻转会发生数组越界错误。试想一下,当方块移动到边界处,甚至还没有到边界处时,就不能再翻转了,无疑

24、会给操作带来大大地不方便性。 方块翻转的另一个问题就是,当方块下落过程中,左右两边都有方块,周围的空间不能再容许它翻转,往往很多游戏没有注意到这一点,这就导致,方块翻转之后把原来存在的方块给挤掉了,这个问题本质上也是翻转越界。 为了解决以上问题,游戏设计中应该增加一个对于方块能否翻转的判定以及翻转越界纠正功能。1方块翻转判定 如上所述,在两种情况下一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。 第一种情况好办,只要参考方块落下去后不能够再移动的判定即可。 对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转,否则,不能翻转。 这里面又出现一个棘手

25、的问题,因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,然后根据当前的blocktype和turnstate值,选择哪种判定条件进行判定,但是这样做未免过于麻烦。 根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只有能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转;对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田子型的方块只要没有落下,就一直能够翻转;而其它五种形态的方块,又

26、有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。 所以,方块翻转的判定,要分三种情况。第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。 何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为

27、只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。 可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。 方块数组在游戏地图中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。 假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图

28、的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。 所以,如果以上空间有空格子,方块就能够翻转。 据此,我们可以列出方块翻转的条件判定表,如图:12345678所有条件落下TFFFFFFF田字形方块T 长条形方块1x4形态TT4x1形态T其它五种方块2x3形态TT3x2形态T第y行, x、x+3列空TF第y、y+1行x、x+2列空TF所有动作翻转不能翻转2翻转越界纠正由上述判定表可以看出,只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间。比如,

29、一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了。 同样,方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。所有条件落下TFFFFFFFFFF田字形方块T

30、 长条形方块1x4形态TTTT4x1形态T其它五种方块2x3形态TTTT3x2形态第y行, x、x+3列空TFFF第y、y+1行x、x+2列空TFFF另一边有足够空间TFTF所有动作翻转不能翻转翻转越界纠正 结合上述判定表,可以列出方块翻转-越界纠正判定表,如表5.3所示:表5.3 方块翻转-越界纠正判定表方块翻转处理的流程图如图5.12所示:接收到翻转信息方块是否落下不能翻转否是翻转后是否有足够空间不能翻转否是翻转后是否越界否直接翻转翻转越界纠正是结束结束图5.12 方块翻转处理流程图5.3.3 满行消除JAVA图形类中提供了一个方法,copyArea(int x, int y, int w

31、idth, int height, int dx, int dy),这个方法的作用是将组建的某一区域复制到由dx和dy指定的水平距离和垂直距离所在的区域。利用这个方法,可以消除满行。那么,当方块落下去后,如何判断有行需要消除。如概要设计中所述,游戏地图中有方块的区域可以用1表示,当方块落下去后,判断某一行是否全部为1,如果全为1,即表示这一行已满,需要消除,这个时候,就可以利用copyArea这个方法将这一行消去了。消去一行后,要继续向下检测,如果下一行是满行,消除,否则再往下检测,一直将落下的方块所占的行数全部检测完为止。假定,以竖直状态落下一个长条形的方块,很显然,方块一共占据了四行。这时

32、候,应该从长条形的方块占据的第一行开始检测,不管期间是否有消行,都必须将长条形的方块所占据的四行全部检测完为止。并且记录下消去的行数,方块消行完成后,增加相应积分。但是,这里面又会遇到一个问题,因为并不是所有方块所占的行数都一样,方块落下后到底该检测多少行呢?考虑到方块落下后最多占据四行,以及计算机运算的高速性,可以设定每一次方块落下后都往下检测四行。方块消行的流程图:方块落下是否有消行否检测第一行检测第二行消去该行是是否有消行消去该行检测第三行是否有消行检测第四行消去该行否是消去该行是否有消行否是统计所消行数,增加相应积分结束开始5.4 游戏控制处理图形触发的 shapeMovedDown

33、(图形下落) 事件 将会重新显示public void shapeMovedDown(Shape s) / TODO Auto-generated method stubif (playing & ground != null & shape != null)gamePanel.redisplay(ground, shape);开始一个新游戏public void newGame() playing = true;ground.init();ground.addGroundListener(this);Global.CURRENT_SPEED = Global.DEFAULT_SPEED;sh

34、ape = shapeFactory.getShape(this);if (playing)gamePanel.redisplay(ground, shape);if (gameInfoLabel != null)gameInfoLabel.setText(this.getNewInfo();for (GameListener l : listeners)l.gameStart();停止当前游戏public void stopGame() if (shape = null)return;playing = false;for (GameListener l : listeners)l.game

35、Over();暂停游戏public void pauseGame() if (shape = null)return;shape.setPause(true);for (GameListener l : listeners)l.gamePause();继续游戏public void continueGame() shape.setPause(false);for (GameListener l : listeners)l.gameContinue();5.5 游戏显示5.5.1 游戏显示界面5.5.2 开始暂停控制菜单5.5.3 调整背景颜色障碍物颜色菜单6 系统测试6.1 测试的意义及注意事

36、项软件测试是软件工程中及其重要的一个环节,目的是保证软件的质量。测试的好坏将直接影响软件的好坏,进行测试可以找出其中的错误及不足加以改进,从而得到一个高效、可靠的系统。进行软件测试主要作用有以下几点: 1软件测试是为了发现程序中的错误而执行程序的过程。 2好的软件测试方案是极可能发现尚未发生错误的方法。 3程序的测试是发现了至今尚未发现的错误。软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关的人员和那些分析人

37、员很容易找出错误所在。在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现会浪费很多的时间来修改。6.2 游戏界面菜单选项的功能测试(1) “控制”菜单测试点击“游戏”􀃆“开始”输出:游戏开始结果:正常点击“游戏”􀃆“结束”输出:弹出游戏结束提示框结果:正常(3) “变换”菜单测试点击“变换”􀃆“改变方块”输出:在游戏面板中显示随机产生的某种方块结果:正常6.3 按键事件的功能测试(1) 方块移动测试游戏过程中,点击“左、右、下”方向键输出:方块正常移动,不会移出边界结果:正常(2) 方块反转测试游戏过程中,点击向上方向键

38、输出:方块无边界和障碍物阻挡的情况下可反转结果:正常6.4 方块堆砌与消行测试(1) 当方块下落到最底面或与障碍物接触时输出:方块成功堆砌在底部结果:正常(2) 当出现满行现象时输出:所有满行被消除,方块依次下移结果:正常6.5 测试结果分析 经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。设计心得经过一个月的努力,本游戏的开发工作至此告一段落,游戏能够正确运行,虽然说本游戏还只是一个初级产品,但是比起很多俄罗斯方块游戏,它的功能算是比非常丰富的,界面也具有一定的美观度,可以说取得了初步性的成功。这一个月来,我学到了很多东西。先

39、前,对于JAVA,基本上还停留在理论阶段,但是通过这一个月的努力,完成了代码超过数千行的俄罗斯方块游戏,在JAVA学习方面,我能够感觉到自己的进步。当然,在这期间,我也遇到了不少问题,如方块的绘制上,曾出现过太闪烁,刷新不彻底等问题。还有,图像截屏传输时编译器总是提示端口号已经被占用,经过检查,原来是我每次截屏发送图像数据时,都重新构造端口号,这是因为变量定义的错误,将变量定义成全局变量,问题就解决了。总得来说,大的问题没有遇到,遇到的都是一些逻辑、算法上以及变量定义的错误问题,通过程序测试,这些问题都很容易地解决了。 回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件

40、,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时,我又从中学到了许多东西。但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,有些功能还不能够完全的实现,如不能把要装载的方块提前显示出来。因此做得不是很好,界面的设计及整体的布局还比较简单,没有突出特色出来,这也可能是我这个系统的不足之处。致 谢毕业设计是大学里的最后一堂课,从开始进入课题研究到论文顺利完成的两个月的时间里,我经历了大学期间最为难忘的一段时光。在这段时间里,我学到了很多以前不曾接触的东西,这两个月经历对我未来的人生都会有

41、很大的帮助和影响。首先衷心感谢我的指导老师龚志伟老师给予我的无微不至的关怀和细心的指导。在设计过程中龚老师为我们提出了许多宝贵的意见和建议,在此我要由衷的向龚老师致以最衷心的感谢和深深的敬意。在此过程中同学们也给予我很大帮助,感谢我的同学们。在我遇到的一个又一个问题时同学们都热心的帮助我,帮我分析和我探讨,提出了许多解决问题的好方法和建议,使我最终解决了一个又一个问题,感谢我的同学们。由于我的学识有限,加之时间仓促,文中不免有错误和待改,不足之处,真诚欢迎各位师长、同学提出宝贵意见。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利!参考文献1 王树伟 著,Visual C+游戏编程基础,

42、北京:电子工业出版社,2005年。2荣钦科技编著.Visual C+游戏设计.北京:科海电子出版社。3 刘新. 清华大学出版社.Java开发技术大全.2009-02-014 阎宏, 电子工业出版社.Java与模式. 2002-10-015王晓东 .电子工业出版社 .计算机算法设计与分析.2007-056 徐立 、孙计安.清华大学出版社 .Java应用于开发案例教程.2005-077 薛为民 夏文红 解仑.清华大学出版社.北京交通大学出版社.Java应用教程.2005-098 彭波.机械工业出版社.数据结构及算法.2008-019雍俊海 .清华大学出版社.Java程序设计.20004-0810

43、robert lafore. 中国电力出版社. Java数据结构和算法.2007-0611赵满来. 清华大学出版社.可视化java gui程序设计-基于eclipse ve开发环境.2010-1112肖刚. 清华大学出版社.java gui程序设计.1998-1113 罗伟坚著.Visual C+经典游戏程序设计M.北京:人民邮电出版社,2006.214 朱福喜著. Java 程序设计技巧与开发实例M.北京:人民邮电出版社,2004.215 赵东跃著.俄罗斯方块编程M.电脑编程技巧与维护,1998 年第六期16 陆惠恩著. 实用软件工程M.北京:清华大学出版社,2006.517 黄复贤著.俄罗

44、斯方块游戏的敏捷设计与开发M. 电脑编程技巧与维护,2005.418 (美)Bruce Eckel 著,陈昊天译.Java 编程思想M.北京:机械工业出版社,2007.619 高凌琴,陈青华著. 俄罗斯方块游戏关键技术探讨M.信息技术与信息化研究探讨,2008 年第附录:package cn.tetris.controller;import java.awt.Font;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.HashSet;import java.util.Set;impo

45、rt javax.swing.JLabel;import cn.tetris.entities.Ground;import cn.tetris.entities.Shape;import cn.tetris.entities.ShapeFactory;import cn.tetris.listener.GameListener;import cn.tetris.listener.GroundListener;import cn.tetris.listener.ShapeListener;import cn.tetris.util.Global;import cn.tetris.view.Gam

46、ePanel;/* * 控制器 * 控制Ground, Snake, Food * 负责游戏的逻辑 * 处理按键事件 * * * version 1.0, 03/03/11 * * author 张龙飞 * */public class Controller extends KeyAdapter implements ShapeListener,GroundListener protected Set listeners = new HashSet();/* * 图形工厂 * */protected ShapeFactory shapeFactory;protected Shape shape

47、;protected Ground ground;protected GamePanel gamePanel;/游戏面板protected JLabel gameInfoLabel;/游戏信息标签/* * 当前的游戏状态 */protected boolean playing;/* * 控制器 * param shapeFactory * param ground * param gamePanel */public Controller(ShapeFactory shapeFactory, Ground ground,GamePanel gamePanel) super();this.sha

48、peFactory = shapeFactory;this.ground = ground;this.gamePanel = gamePanel;/* * 多接受一个 JTextComponent, 可以给在这个组件上显示提示信息 * * param shapeFactory * param ground * param gamePanel * param gameInfoLabel */public Controller(ShapeFactory shapeFactory, Ground ground,GamePanel gamePanel, JLabel gameInfoLabel) th

49、is(shapeFactory, ground, gamePanel);this.setGameInfoLabel(gameInfoLabel);/* * 处理键盘按键 * LEFT: 向左移动 * RIGHT:向右移动 * DOWN: 向下移动 * UP: 变形 * PAGE UP: 加快速度 * PAGE DOWN: 减慢速度 * Y: 重新开始游戏 * ENTER: 暂停/继续 */Overridepublic void keyPressed(KeyEvent e) if (e.getKeyCode() != KeyEvent.VK_Y & !playing)return;switch

50、(e.getKeyCode() /* * 方向左 */case KeyEvent.VK_LEFT:if (isPausingGame() this.continueGame();shape.setSwift(false);if (isPlaying() & ground.isMoveable(shape, Shape.LEFT)shape.moveLeft();break;/* * 方向右 */case KeyEvent.VK_RIGHT:if (isPausingGame() this.continueGame();shape.setSwift(false);if (isPlaying()

51、& ground.isMoveable(shape, Shape.RIGHT)shape.moveRight();break;/* * 方向上 */case KeyEvent.VK_UP:if (isPlaying() if (!shape.isPause() if (ground.isMoveable(shape, Shape.ROTATE) shape.setSwift(false);shape.rotate(); else if (ground.isMoveable(shape, Shape.UP)shape.moveUp();else shape.die();shape = shape

52、Factory.getShape(this);break;/* * 方向下 */case KeyEvent.VK_DOWN:if (isPausingGame() this.continueGame();if (isPlaying() & isShapeMoveDownable(shape)shape.moveDown();break;/* * PAGE UP */case KeyEvent.VK_PAGE_UP:shape.speedUp();break;/* * PAGE DOWN */case KeyEvent.VK_PAGE_DOWN:shape.speedDown();break;/

53、* * 反引号,换一个图形 */case KeyEvent.VK_BACK_QUOTE:if (isPlaying() shape.die();shape = shapeFactory.getShape(this);break;case KeyEvent.VK_ENTER:if (isPausingGame()this.continueGame();elsethis.pauseGame();break;case KeyEvent.VK_Y:if (!isPlaying()newGame();break;case KeyEvent.VK_SPACE:if (isPlaying() & !isPa

54、usingGame()shape.setSwift(true);break;/* * 重新显示 */gamePanel.redisplay(ground, shape);if (gameInfoLabel != null)gameInfoLabel.setText(this.getNewInfo();/* * 询问一下图形是否可以下落,如果不能下落了,就会让图形变成障碍物 * 这个方法是同步的 */public synchronized boolean isShapeMoveDownable(Shape s) if (shape = null)return true;if (!playing | shape != s)return fals

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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