• 350.08 KB
  • 2022-04-22 13:35:09 发布

俄罗斯方块游戏开发与设计毕业论文.doc

  • 41页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'俄罗斯方块游戏开发与设计毕业论文第1章绪论1.1游戏的历史游戏是人类生活的重要组成部分,从第一个电子游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。1.1.1从头谈起真正的电子游戏机产生于20世纪70年代。1971年,麻省理工学院的学生NolanBushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏的发展上取得了非凡的成就。上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。这个程序被公认为是最早的电脑游戏程序。1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。这个游戏获得了第一作,它代表了当时电脑技术的最高水平。1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。20世纪80年代IBMPC兼容机的出现打破了Apple公司的垄断地位。到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。游戏产业也逐渐发展成熟。1.1.2图形硬件的革命图形硬件的飞速发展是近些年来的事情,部分原因是来自工业方面的压力,例如在军事和医疗方面对于实时图形的需求很强烈,而交互娱乐产业也极大的推动了图形硬件的发展。技术上的因素同样也推动着图形硬件的发展,许多图形算法可以很容易地表达为并行方式,这样硬件执行的效率变得很高。摩乐定律也起了作用,越来越多的晶体管可以集成到一块单独的芯片上。在所谓的GPU(图形处理器)概念出现以前,特殊的图形硬件只出现在诸如SGI和E&S系统里面,这些硬件价格太昂贵,不过这些公司提供了第一代基于硬件的顶点变换和纹理映射的解决方案。 1.2游戏的意义与内涵游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦”。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。1.2.1游戏的组成要素“游戏”,最简单的定义,就是一种供人们娱乐休闲的快乐元素。从更专业的角度形容,“游戏”是具有特定行为模式、规则条件、身心娱乐及输赢的一种行为表现。这种行为表现具备以下4个要素。行为模式:“游戏”最简单的要素就是游戏有特定的流程模式,这种流程模式贯穿于整个游戏的行为,用户必须依照它的模式流程来执行。倘若一种游戏没有了特定的行为模式,那么就没有执行的行为;在没有执行的行为之后,这个游戏也玩不下去了。举个例子来说,如果猜拳游戏没有了剪刀、石头、布等行为模式,那么这还能叫做“猜拳游戏”吗?所以不管游戏的流程有多么复杂还是多么简单,一定要有特定的行为模式。条件规则:当游戏有了一定的行为模式后,接着就必须制定出一系列的条件规则。简单来说,这些游戏的条件规则就是大家必须去遵守的游戏行为守则,只要是大家一致以为的游戏行为,在游戏中,玩家就必须遵守它,如果不遵守这种游戏行为,那么就失去了公平性。如同一种简单的球赛,打球的英文解释可以用PLAYGAME来加以说明,按照英文字面上的解释,它就是执行游戏的行为,而球赛必须有一定的条件规则,并且参与者都要必须去遵守它,不能遵守它就叫作“犯规”。所以不管是什么游戏,它都会具备一组规则条件,在游戏进行的时候才会有足够的公平性。娱乐身心:一种游戏所带来的娱乐性,关键就在于为玩家所带来的刺激感,这也是游戏的精华所在。简单来说,不管是很多人玩的游戏,还是一个人玩的单机游戏,游戏本身就会存在它的娱乐和刺激性,使得玩家们想要去玩它。输赢:其实针对游戏而言,输赢是所有游戏的最终目的。一个没有输赢的游戏,也就没有了它存在的意义,如同我们常常接触到的猜拳游戏,说穿了最终目的就是为了分出胜负而己。一般而言,游戏又可以分为动态和静态两种形态。动态的游戏必须配合肢体动作,如猜拳游戏;而静态游戏则是较偏向思考的行为,如同纸上游戏。然而不管是动态或是静态游戏,只要具备上述4项组成要素,都可以将它称为“游戏”。1.3俄罗斯方块游戏俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。 但是经过时代的变迁,当初简单却变化无穷的俄罗斯方块游戏如今却已失去了它的市场,究其原因,主要是因为游戏硬件以及技术的革新使得优秀的游戏接二连三地推出,而俄罗斯方块游戏作为一款形式、内容过于简单的游戏势必经受不住时间的冲击的。现在作者将改写这个固定的游戏模式,通过增加一系列的新功能,开发出一种全新的俄罗斯方块游戏,使游戏用户重新燃起对俄罗斯方块游戏的热爱。我是一个饭店的老板,经过一番努力,现在也算是有了一番成就,我也很满足现在的生活。我经常陪我的老婆去外旅游,毕竟日子好了。但是好景不长......以前老婆就说过,男人有钱就变坏,现在竟然也怀疑到我身上了,天天询问我去哪里了,我感到有点不耐烦。但是为了我们的感情,我就一五一十的交代,可是时间长了,次数多了,我就烦了。后来就分居了一段时间,知道她谅解我为止。现在我们又回到了从前,可是可怕的事情发生了,现在我们行房事的时间越来越短了,并且我明显感到bo起不坚了,还比原先短了几厘米,我很苦恼。于是我就去找治疗的方法,后来听我一个比较好的客户说起了马老中医,他还有薇||性是msdf003,说是他的药方对我这种情况很适用。于是我就加了马老中医,听了专家的述说,觉得还可以,就订购了2个疗程的。没想到这一用下来,很真的很不错呢,时间长了不说,bo起也坚挺了,更让我兴奋的是阴经增大了3公分,让我比以前更厉害了.第2章可行性研究2.1设计目的综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。2.2可行性研究前提 基本需求:系统开发的总体任务是实现游戏的可操作性、美观性、及时性,及适当的功能扩展。主要开发目标:采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏,并通过此次软件开发过程全面提高自身的综合素质。可行性研究所采用的方法和步骤:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个有一定可玩性的游戏软件。评价尺度:本游戏尽量追求游戏操作的合理性及正确性,但是仍不排除会出现一些偶然性的错误;同时游戏也尽量追求界面的美观性及功能的丰富性,但是基于时间的关系,可能会有极少数的拓展功能不能实现。2.3可行性分析管理可行性:本游戏设计的目的只在于提高自身实践水平,并不对外发布,因此完全具有管理可行性。经济可行性:由于本游戏的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台电脑便可,所以不用考虑到经济问题。技术可行性:可用与本游戏的编程语言有VB,VC,Java,Delphi等,考虑到用于编写程序的困难度,和对语言的了解程度,选择JAVA作为编程语言。需要对图形界面设计、事件处理、多媒体、网络编程等有一定了解。社会可行性:本游戏的开发作为毕业课程设计以巩固先前所学的知识,以个人为单位,仅供个人平常娱乐所用,无须考虑有可能造成的社会影响,不用考虑到法律、版权等的社会因素,所以在这方面是完全可行的。2.4结论综上所述,本游戏软件的技术成熟、完备。各方面均无重大问题,因此本游戏软件可开始着手编写 沈阳工程学院毕业论文第3章需求分析第3章需求分析3.1引言对软件需求完全理解对于软件开发工作的成功是至关重要的,需求说明的任务是发现、规范的过程,有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相关。3.2游戏功能需求3.2.1游戏界面需求良好的用户界面设计。本游戏主要有三个界面,一是用于主游戏区的游戏画布,用来显示游戏时运动和落下去的方块,二是用于控制游戏的各种控件以及显现游戏信息的一些组件,这是一个面板,三是进行网络对战时用以显示对方游戏信息的面板。3.2.2游戏控制需求方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。3.2.3图形显示需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,一共设置十关,每关方块下落的速度不同,游戏中先结束的一方为本局输家,十关过后,胜出局数多的为赢家。3.2.4音乐播放需求本游戏,应该具备播放背景音乐和发生相应操作时的音效的功能,比如,方块落下、满行消除时的音效。3.2.5道具使用需求 沈阳工程学院毕业论文第3章需求分析本游戏,可以具备几种道具的使用功能,比如,这些道具可以是某些特殊的方块,比如,可以定义一种旋转的方块,也可以定义一种炸弹,能够炸毁一定数量的方块,以增强游戏的趣味性。3.2.6网络对战需求本游戏,具备网络对战功能,所以要求玩家能够看到对方的游戏信息。3.3运行环境及系统性能的需求本游戏对运行环境及系统性能的需求如表3.1所示:表3.1游戏对运行环境及系统性能需求分析表操作系统Windows98/me/2000/XP/2003内存容量64MB显卡要求8M声卡要求支持DirectX8.0声卡交互工具键盘/鼠标CPU奔腾133以上光驱8倍速以上硬盘空间400MB显示器VGA以上显示器开发及运行软件JDK1.5以上版本3.4接口需求本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。3.5方案论证可用于较好地实现俄罗斯方块的语言有C++、VB、JAVA,所以客观上说来,可用Jave,VB和C++这三种语言编写俄罗斯方块程序。下面结合自身实际情况分别论述三种语言的优缺点并从中选择一种适合的编写语言。3.6.1VB的特点VB是完全中文化的环境使用,语句生成器和快速提示帮助使用户不必记忆成千上万的属性和方法,在较短的时间内就能开发出功能强大的应用程序。Internet应用程序的开发功能更加强大和容易,支持动态HTML 沈阳工程学院毕业论文第3章需求分析技术的应用程序。种类繁多,功能强大的多媒体控件,能帮助用户在较短的时间内用较少的语句编写出图文声像并茂的多媒体程序。能对多种数据库进行读写操作。它所提供的可视化数据管理器能帮助用户构造多种类型的数据库。用户自定义类型可以作为参数或作为公共属性和方法的返回值,函数可以返回数组变量,动态数组可以赋值,文件系统对象,按名调用,增强创建对象函数和StrConv函数。应用程序安装向导能帮助用户自动生成具有一定功能的应用程序,加快了程序的开发速度。3.6.2C++的特点C++是对C语言的扩充,扩充的绝大部分来自著名语言中的最佳特性:从SIMULA67中吸取了类,从ALGOL68中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了Ada的类属和Clu的模块特点,从BCPL中吸取异常处理,从BCPL中吸取了用//表示注释。C++保持了C的紧凑、灵活、高效和易移植强的优点,它对数据抽象的支持主要在于类概念和机制,对面向对象风范的支持主要通过虚拟函数。C++既有数据抽象和面向对象能力,语言运行性能高多,加上C语言的普及,而从C至C++的过渡较为平滑,以及C++与C的兼容程度可使数据巨大的C程序能方便地在C++环境中重用。尽管C++当初的设计本意是帮助管理大型程序,但其用途并不仅限于此。C++的面向对象的特性可有效地用于实际的程序设计工作。C++常常用于设计编辑器、数据库、个人文件系统以及通讯程序等。而且,由于C++共享C的效率,所以用C++可以构成很多高性能的系统软件。3.6.3Java的特点Java是定义位于网络计算的计算机语言,它几乎所有的特点也是围绕着这一中心展开的并为之服务的,这些特点使得Java语言特别适全于用来开发网络上的应用程序;另外,作为一种面世较晚的语言,Java也集中体现和充分利用了若于当代软件技术新成果,如面向对象、多线程等,这些也都在它的特点中有所反映。平台无关性:如前所述,Java语言独特的运行机制使得它具有良好的可移植性,利用Java,开发人员可以编写出与具体平台无关、普遍适用的应用程序,大大降低了开发、维护和管理的开销。面向对象:Java是纯面向对象的编程语言。面向对象技术较好地适应了当今软件开发过程中新出现的种种传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维护量增大经及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。面向对象技术的核心是以更接近人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。多线程机制:多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领域。多程序技术允许同一个程序有两个执行线索,即同时做两件事情,满足了一些复杂软件的需求。Java不但内置多线程功能,而且提供语言级的多线程支持,即定义了一些用于建立、管理多线程的类和方法,使得开发具有多线程功能的程序变得简单、容易和有效。 沈阳工程学院毕业论文第3章需求分析简单易学:如前所述,衍生自C++的Java语言,出于安全稳定性的考虑,去除了C++中不容不得易理解和掌握的部分,如最典型的指针操作等,降低了学习的难度;同时 Java还有一个特点就是它的基本语法部分与C语言几乎一模一样。这样,无论是学过Java再学C,还是已经掌握了C语言再业学Java,都会感到易于入门。3.6.方案选择面向对象是一种认识世界的方法,是一种程序设计方法。面向对象的观点认为,客观世界是由各种各样的实体,即对象组成的。每种对象都有自己的内部状态和运动规律,不同对象间的相互联系和相互作用就构成了各种不同的系统,并进而构成整个客观世界。按照这样的思想设计程序,就是面向对象的程序设计。面向对象的程序设计吸取了结构化程序设计的先进思想,并把它们同几个支持用户用新方法进行程序设计的有力概念结合在一起。所有面向对象的程序设计语言一般都包含三个概念:封装、多态性和继承性。这种方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。面向对象的程序设计,是通过数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用作样板,在需要时再建立其副本。C++和Java在面向对象这方面比VB要强,所以我排除了用VB做的可能性。但是C++主观上在校期间学校并没有这方面的授课内容,虽然自学了一些内容,对C++也有一定了解,但是若用C++实现,必定是基于windows应用程序的VisualC++设计,对于windows编程,我还有待提高,而我对JAVA的掌握,相对而言,比较熟悉,综合考虑,决定采用Java语言编写俄罗斯方块。 沈阳工程学院毕业论文第4章概要设计第4章概要设计4.1游戏设计所要遵循的规范一个良好的程序,在编写之前,必须要制定各种编写规范,以便组内各成员协调工作。当然,本游戏只是一个小程序,过多的规范制定显得没有必要,但是,也必须制定一个对于变量的命名规则,这有利于设计出一个可读性高的程序。本程序变量的命名规则为:·所有变量一律使用相应的英文单词命名·如果同一类中需要创建多个同一类型,功能相似的变量,变量的前缀应使用统一的英文单词,后缀为下划线“_”加数字。比如,从JButton对象创建开始按钮,可以命名为:startbutton。再如,创建多个道具按钮,可以命名为toolbutton_1,toolbutton_2等等。·方法命名尽量使用能够描述本方法功能的英文单词比如,游戏初始化可以用gameinitial。·类名字命名也应当使用能够描述本类功能的英文单词。如方块类,可以用classblock。4.2游戏总体设计分析Java为纯面向对象(Object-Oriented,OO)的程序语言,它的诸多优点在此就不作论述了。从面向对象的观念出发,本程序主要可分为以下几个模块:l客户端GUI模块l方块及地图数据模块l音频文件播放模块l道具使用模块l网络传输模块分析对象的技巧在于它的功能的扩展性及维护效率。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。4.3各模块的算法设计4.3.1客户端接口的设计“客户端控制器” 沈阳工程学院毕业论文第4章概要设计是指游戏界面上显示游戏相关信息及排布游戏控件的面板。游戏客户端控制器上集合了游戏的各种事件处理,包括游戏定时控制,键盘控制,道具控制,音乐播放,选择网络对战等各种控制命令。本模块是程序的主模块,其它四个模块都由本模块进行控制。1客户端接口的结构,如图4.1所示:·关客户端控制器程序运行网络对战背景音乐游戏暂停道具使用游戏开始图4.1客户端结构图2客户端接口的实现一个程序,在追求程序性能的同时,应该同时注重GUI的美观度,基于此,本游戏应该采用JAVA中swing组件包,swing组件是一组完全由JAVA语言编写的轻量级组件,没有本地代码,不依赖本机操作系统的支持,所以swing比AWI具有更强的实用性,比起AWI组件,swing组件在美观度和控制性能方面具有如下几方面的优点:·可插入的外观感觉在AWI组件中,犹豫控制组件外形恶对等类与具体平台相关,使得AWI组件总是只有与本机相关的单一的L&F。swing对PL&F的支持改变了单一图形界面的观感,即实现了在任意平台上运行同一个swing程序能有不同恶L&F。变成人员可以在GUI程序设计中加入相应的开关,使得程序运行时可以根据喜好选择不同的L&F,呈现不同个性化界面。·设置边框可以使用相应的方法为swing组件设置一个或多个边框。Swing中提供了各种各样的边框供用户选用,也能够给通过变成人员的组合来设计个性边框。充分利用边框设计,可以协助布局管理器对组件进行合理的布局。·使用图标此特性使得swing组件较之AWI组件具有更强的外观感受。与AWT组件不同,许多swing组件如按钮、标签,不仅可以使用文字,还可以使用图标来加强外观效果。·支持键盘操作在swing组件中,使用Jcomponent类的registerKeyboardAction方法,能使用户通过键盘操作来替代鼠标驱动GUI上swing组件的相应动作。·可存取性支持所有swing 沈阳工程学院毕业论文第4章概要设计组件都实现了可存取性接口,提供对可存取性的支持,使得辅助功能如屏幕阅读器、语音识别系统,能十分方便地从swing组件中得到信息。·MVC体系结构Swing组件设置三个通讯对象:模型、视图和控件,并将模型与视图奋力开来,这样可以方便用户直接通过模型管理数据,实现基于一种模型的多种视图处理。基于swing组件的优点,结合本程序的设计目标,程序的界面将使用swing组件实现。4.3.2方块及地图数据模块的设计这是俄罗斯方块游戏最基本的功能模块,本游戏的设计思想是只要有客户端控制器及方块地图数据模块,就能实现游戏的基本功能。本模块其实可以分开为方块和地图两个模块,但考虑到二者联系紧密,需要共享数据结构,属于公共耦合,耦合性过高,将二者分开也有悖于作者设计的游戏算法,增加了程序的编写难度,故把它们并作了一个对象。1.方块数据方块数据存储了七种不同形态的方块,以及每个方块的四种形态,可用一个7x4x4x4的四维数组表示,例如,定义一个四维数组block[7][4][4][4],数组block的第一维表示七种不同形态的方块,第二维代表方块的四种不同翻转状态。数组的第三维和第四维代表某一种形态的方块的某一状态。假定,block[0][0][i][j]的值如以下:1,1,0,00,1,0,00,1,0,00,0,0,0则,block[0][0][i][j]代表“7”字型的方块。当方块翻转时,只需改变第二维的下标即可,即,block[0][0][i][j]变为block[0][1][i][j]。而如果更改方块形态,就改变数组第一维坐标。2.地图数据本游戏的游戏地图为25x15格,故应当用一个25行15列的二维数组存储游戏地图数据,但是考虑到本游戏嵌入了方块越界自动纠正功能,而方块越界,实际上就是游戏地图数组越界。假定,方块数据有以下数据模式,代表长条形的一种方块:0,0,0,10,0,0,10,0,0,10,0,0,1当以上数据模式所代表的方块处在游戏的左边界区,并且发生翻转时,方块可能翻出游戏地图外,在这种情况下,就发生了游戏地图数组越界,JAVA异常处理系统会抛出ArrayIndexOutOfBoundsException,为避免这种情况的发生,游戏地图数组应当适当增大,故本游戏将地图数组长度和宽度各扩大了三个单位,定义成为28x18模式的数组。3.建立游戏的坐标系统 沈阳工程学院毕业论文第4章概要设计俄罗斯方块,最终是要将方块绘到游戏地图中,如何确定方块在地图上的位置,就需要一个方块数组与游戏地图数组的映射关系。建立一个合理的坐标系统,对于游戏的设计有莫大的方便。结合JAVA的坐标系统,综合游戏设计上的考虑,本程序最终确定了将游戏地图的左上角坐标表示为(0,0),同样,方块在游戏地图中表示为记录方块左上角在游戏地图中的坐标。4.对方块数据和游戏数据的操作确定了方块数据与地图数据的映射关系,对方块和游戏数据的操作就变得简便了。对方块的操作包括方块的左移、右移、下移等,当方块左移时,只需将方块数组左上角的坐标往左方向移动一个单位即可,同理,方块右移、下移时,只需将坐标往右、往下移动一个单位。如果以X代表方块左上角的横坐标,以Y代表纵坐标,方块左移,执行的操作是X--,方块右移,执行的操作是X++,方块下落,执行的操作是Y++。5.游戏绘图俄罗斯方块具有七种不同形态的方块,而方块又分别有正在下落和已经落下固定两种不同状态,如何在游戏地图中实现静态和动态地绘制出七种不同形态的方块,具有一定的挑战性。经过反复思考论证,本游戏决定采用不同的绘制模式来分别实现绘制动态和静态方块。·遍历方块数组绘制动态方块假定调用Graphics类中的fill3DRect(intx,inty,intwidth,intheight,Booleanraised)方法绘制方块,再假定方块数组左上角在地图中的坐标为x和y,则绘制动态方块可采用如下方式实现。for(inti=0;i<=3;i++)for(intj=0;j<=3;j++)if(Block[blocktype][turnstate][i][j]==1)g.fill3DRect((y+j)*width,(x+i)*width,width,width,raised);这种绘制方式的原理是每一次绘制一个单位长度的正方形格子,在将这些格子组合成某一种的形态方块。这里面,某一种形态的方块是由方块数组中的参数i和j决定的,具体是哪种形态的方块,方块的哪一种翻转状态,是由参数blocktype和turnstate决定的。而参数y+j表示的当前格子的左上角在游戏地图中的横坐标,x+i表示的是小格子的纵坐标。·遍历游戏地图数组实现坠下方块的消行绘制当坠下的方块有满行需要重新绘制时,需要进行消行绘制。首先,可用一个数值代表游戏地图数组的某一个区域是否有方块填充,假定这个数值是2,即如果地图数组中某一个元素的值为2,则表示这个元素所代表的地图区域存在方块。进行消行绘制时需要判断地图数组的某一行是否全为2,如果全为2,则可以认为这行被方块填满,需要进行消行,然后再继续往下判断下一行,直到所有满行被消除为止。 沈阳工程学院毕业论文第4章概要设计开始结束否地图数组某一行是否全为2是消去这一行图4.2消行流程图4.3.3音乐播放模块的设计音频文件的播放涉及到IO操作,不管是何种系统,对于IO操作,都是比较慢的,如果当程序运行到需要播放音效时,再从文件中取得音频数据,然后播放,很可能会造成一种“卡”的感觉,影响用户体验。基于此,经过反复论证,本游戏决定采用以剪辑的方式来播放音频文件。JAVA语言中的剪辑Clip,是一种在播放之前就提前加载于内存中的特殊的音频数据流,当需要用时,只需直接从内存中调出即可,省去了IO读取所需的大量时间,而且剪辑播放完毕后,仍旧存储在内存中,对于游戏的背景音乐及音效这类需要反复多次播放的音频,这种方式是非常有用的。单单采用剪辑还是不够的,音频文件的播放,应当另外开启线程来控制,这样既可以更方便地控制音频的播放、暂停等操作,也不会程序执行其它的操作。1.音效播放在游戏开始、暂停,方块落下及消行时添加相应的音效既可以提醒用户发生某种变化,又能增强程序的表现效果。音效,相对来说是比较小的音频文件,对于音效,可选取wav格式的音频文件,不但音频质量好,在系统支持、存储性方面也占有优势。根据多线程及剪辑的思想,首先在程序初始化时应该把音效载入内存,游戏开始后开启一个线程,当满足音效播放的条件时,即播放音效,音效播放完毕后,应当将相应的音频文件的剪辑位置重新置为开始处。2.背景音乐播放同音效的播放,背景音乐的播放也应当采用剪辑的形式,以方便音乐的循环多次播放,同样,背景音乐播放可能是贯穿于整个游戏过程,背景音乐的播放必须采用单独的线程控制,以不影响程序执行其它操作。因为背景音乐采用单独线程播放,这里面会出现一个问题,当用户选择暂停背景音乐播放时,背景音乐播放线程是进入wait状态还是以另一种方式实现暂停?如果背景音乐进入wait 沈阳工程学院毕业论文第4章概要设计状态,则当用户取消暂停播放时,必须再创建一个线程去唤醒它,新建一个线程只是控制背景音乐播放,不免浪费资源,而且也增加程序编写难度。考虑到背景音乐极可能在玩家的整个游戏过程中都处在播放状态,当暂停时,玩家也随时会取消暂停,故而在游戏结束之前,本程序会将背景音乐播放线程一直处在执行状态,如果玩家暂停音乐播放,则让线程转去处理检测玩家是否取消暂停,当检测到暂停取消后,继续播放音乐。4.3.4道具使用模块目前已经存在的俄罗斯方块游戏鲜有能够使用道具的,开发一款能够使用道具功能的俄罗斯方块游戏具有一定挑战度,因为道具的开发不仅涉及到游戏策划等创意性的内容,也与图形图像处理等美工技术息息相关,而作者对美工却是不擅长的,基于此,本游戏最初版本的道具可能只有一个,但是为了将来版本提升的方便,本程序另外预留了三种道具的使用接口。本游戏一共设计了五种道具,旋转方块、炸弹、地雷、仙女、恶魔,这四种道具是程序现今或将来版本提升后要使用到的,暂时,本游戏将只实现旋转方块和炸弹两种道具。1.旋转方块旋转方块是一种增加游戏难度的道具,它本身其实就是方块,和正常的方块的不同之处就在于,正常方块在下落时,如果没有接受到用户的控制命令是不会旋转的,而旋转方块则会不断地旋转下降。这样,用户便很难控制旋转方块下坠到指定的位置。对于旋转方块的定时下落,可以借用方块控制线程,但是旋转方块的定时旋转,则只能依靠另一个线程实现。2.炸弹本游戏定义的炸弹能够像方块一样从地图的顶部坠落,当下坠到地图下部与堆积的方块碰撞时会发生“爆炸”,爆炸将炸毁一定数量的方块。炸弹的视图模型以现成的方块模型为依据,即除了添加的“炸弹”标记,它和七种方块在外形上是没有任何区别的。炸弹,可以看成是一种特殊类型的方块。对于炸弹的杀伤力,有一个规则,如果炸弹能够没入已经坠下的方块中,则可以将这个“炸弹”所占的行数全部炸毁,并增加相应的积分,如果本身已经能够消行,则额外再奖励一倍的积分。否则,炸弹将只炸毁它左右各两个格子范围内的方块。4.3.5网络对战模块目前的俄罗斯方块游戏中,也鲜有具备网络对战功能的,这是因为此类小游戏不具备在网络对战方面的可玩性,当然,如果能够利用道具进行网络对攻,那就另当别论了。就如QQ上的火并俄罗斯方块一样,要实现利用道具进行网络对攻,其中一方玩家必须能够看到他的对手的游戏信息,但这并限于看到对手的道具数量,下一个方块预告。所以,本游戏要求将游戏地图中方块的实时信息远程传输到另一方玩家的显示平台。 沈阳工程学院毕业论文第4章概要设计图像的远程传输首先要求将游戏地图中的方块信息转化为图像资源,然后将图像资源转化成基于某种图片格式的数据流,进行打包发送,在接收端上,再把图像数据从数据包上提取出来,进行解码,生成相应的图像,然后再把图像绘制到游戏画布中。进行网络传输,首先应当选定一种网络传输协议。TCP套接字协议和UDP数据报协议二者中前者传输速率慢,但是提供可靠性保证,准确率高,后者传输速率快,但是并提供可靠性保证。对于游戏的网络对战来说,对网络传输的实时性要求比较高,一方玩家必须能够看到另一方玩家游戏状况的实时信息,这就要求图像的传输速率必须要快,同样因为它的实时性,即使某一次传输错误,后面一帧图像也会马上覆盖前面的图像,人的肉眼基本上不能辨别出这种错误,基于此,本游戏的网络对战传输方式应该采用基于UDP的用户数据报协议。4.4可靠性设计游戏在设计时应当尽量注意降低各个模块之间的耦合性,增强模块的独立性,以便将来需求时进行游戏版本的提升以及相关维护。4.5概要设计评审经过反复论证,上面提出的设计方案,尤其是游戏设计的各个功能模块间的算法确实可行,因此,本游戏可进入详细设计阶段。我今年才30岁,可是我却被男人的痛苦折磨着。哎,我阴jing短小不说,还有点早xie,这让我在老婆面前抬不起头啊,我都kuai崩溃了。加了马老中医的薇||杏msdf003以后,使用马老中医给我开的药方,我也是SI马当活马医了,反正都这样了,试试也不防。,中药penji,没有副作用,我才下定决定一试,买了两个疗程的坚持使用。现在我用完了,我想表达的是我激动的心情,这药好神奇啊,我增大了3公分,早xie也差不多好了,真是救了我啊,太感谢了。 沈阳工程学院毕业论文第5章详细设计第5章详细设计5.1客户端设计客户端是游戏非常重要的一部分,它是所有游戏功能的开关,上面集合了许多的图像用户接口,客户端的实现应该确定一种合理的组织架构。图5.1是客户端的组织结构图:游戏客户端网络对战开关背景音乐开关游戏控制器游戏开关道具控制器游戏定时控制键盘控制音效控制器图5.1客户端的组织架构图游戏客户端采用swing组件开发,并且向其注册监听器,以实现各种控制功能,综合游戏前面的设计,客户端上至少要注册三个监听器,分别是窗口监听器(WindowListener)、动作监听器(ActionListener)、键盘监听器(KeyListener)、选项监听器(ItemListener)。根据初步设计,可以确定客户端上所要用到的Swing组件对象有JFrame对象、JPanel对象,JLabel对象、JButton对象、JMenuBar对象、JMenu对象、JMenuItem对象、JTextField对象、JTextArea对象、JDialog对象、JRadioButton对象、JTabbedPane对象,至少十二个swing组件对象。 沈阳工程学院毕业论文第5章详细设计JFrame用以创建窗体,考虑到本游戏具备单机和网络对战,JFrame对象的大小并不是不变的,在单机游戏和网络对战时,JFrame对象分别会呈现出不同大小,以适应不同的游戏环境需求。在主界面上,可以确定有四个JPanel对象。第一个JPanel对象是用来绘制方块的游戏地图,第二个JPanel对象是用来排列其它各种组件的容器组件,做游戏信息显示面板,可以放在游戏地图的左边,第三个JPanel对象是用来显示NEXT方块的,应该画在第二个JPanel对象上,第三个JPanel对象是当网络对战时,用来绘制另一方玩家游戏地图的绘图面板,放在游戏信息显示面板的右边。可以确定,主界面上,本游戏的按钮有五个,一个“开始游戏”按钮,四个道具按钮,排列在游戏信息显示面板上,可以将“开始游戏”按钮放在顶端,当按下“开始游戏”按钮后,应该改变“开始游戏”按钮的文本内容为“暂停游戏”,按下“暂停游戏”按钮后,再将其文本内容重新设置为“开始游戏”。至于四个道具按钮,可以放在信息显示面板的中部位置。JTextArea对象用来显示游戏时的相关信息,比如网络对战时显示双方玩家的比分等信息。JTextArea应该放在游戏信息面板的底部。JTextField对象至少应该有两个,用来显示双方玩家的分数信息,考虑到对战时的局时设置,还应该增加一个文本框用来计时,计时的文本框最好放在JTextArea对象的上方,这样,两个分数文本框则布置在道具按钮和计时文本框之间。本游戏主界面上的JLabel对象至少应该有四个。首先,应该为NEXT方块画布添加一个标签,然后在四个道具按钮上也应该添加一个道具标签,最后,在两个显示分数的文本框上方也应该添加一个标签最后,在游戏主界面的顶端要添加一个菜单栏,菜单栏上添加几个菜单对象。综合以上信息,可以大概确定本游戏的主界面,如图5.2所示:图5.2游戏界面图 沈阳工程学院毕业论文第5章详细设计5.2音效播放控制模块设计本游戏的音效播放采用剪辑及多线程的方式实现。音频播放需要用到JAVA中的sound包。首先,利用AudioSystem这个音频工厂的getAudioInputstream()方法从音频文件中取得一个音频输入流,其次,从这个音频输入流创建一个Clip,然后打开这个Clip。这样,当需要时,就可以利用Clip中的start()方法播放这个剪辑,重复播放,可以用setFramePosition(0)这个方法将剪辑的位置重新置为0。音效剪辑的播放控制流程图如图5.3所示:开始满足音效播放条件Notify音效播放线程,游戏线程进入wait状态播放音效Notify游戏线程,音效播放线程进入wait状态结束图5.3音效播放流程图5.3背景音乐播放控制模块设计同音效的播放,背景音乐的播放也应当采用剪辑的形式,以方便音乐的循环多次播放,同样,背景音乐播放也要单独的线程进行控制。前面概要设计提出了一个问题。因为背景音乐采用单独线程播放,当用户选择暂停背景音乐播放时,背景音乐播放线程如果以进入wait状态来暂停的话,则当用户取消暂停时必须还需要一个线程来唤醒它,额外增加一个线程的话,不免浪费系统资源,而且也会增加编写的难度。 沈阳工程学院毕业论文第5章详细设计从另一个角度来说,背景音乐极可能在玩家的整个游戏过程中都处在播放状态,当暂停时,玩家也随时会取消暂停,因此,可以让背景音乐线程从游戏开始后就一直处在执行状态,如果用户暂停播放,可以让线程转去循环处理检测用户是否取消暂停,当检测到用户取消暂停时,继续播放音乐。背景音乐播放控制的算法流程如图5.4所示:开始否背景音乐播放控制线程是否接受到恢复信息是否处在暂停状态是否是播放背景音乐接受到暂停信息暂停播放结束图5.4背景音乐播放控制流程图5.4网络对战模块设计如图5.2游戏界面图所示,可以在菜单栏中“游戏”菜单项中添加一个“网络对战”菜单选项,当用户单击“网络对战”菜单选项后,弹出一个对话框,提示用户输入要连接的主机的IP地址,用户输入IP地址后,程序会记录下这个IP地址,当用户开启游戏后,数据传输线程会将数据发送到这个IP地址的指定端口号上。对于实现网络传输的技术,可以用UDP数据报传输方式。首先从AWT包中的Robot创建一个实例,这个类的实例是有关本机屏幕资源的信息,它有一个createScreenCapture()方法,可以用它来创建屏幕上指定坐标位置,指定大小的一副图像。当然,在此之前,我们还需要获得游戏地图所在屏幕的坐标。Component类中提供了一个获取组件屏幕坐标的方法getLocationOnScreen(),我们可以利用这个方法获取组件在屏幕上的坐标,然后把这个坐标赋给一个Point对象,再从Rectangle类中创建一个指定屏幕坐标位置,指定宽和高的矩形,然后就可以用 沈阳工程学院毕业论文第5章详细设计createScreenCapture()创建一副包含游戏地图区域的图像了。创建图像信息以后,可以利用imageio包ImageIO类中的write(RenderedImage im,String formatName,OutputStream output)方法将图像文件写入到一个输出流中,然后可以用toByteArray()从输出流中取得数据,最后就是将数据打包发送了。对于接收端接收到的数据包,可以先从数据包中将图像字节数据提出出来放到一个字节数组中,然后利用Toolkit包中的createImage(byte[]imagedata)方法将图像字节数据转化成图像,最后将图像画到游戏画布中即可。相应的算法流程如图5.5所示:开始开始确定游戏地图在屏幕上的坐标构造一个指定坐标大小的Rectangle对象从指定的端口号接收数据包将Rectangle对象指定的屏幕区域转化为图像资源从数据包中取得字节数据将此图像资源以某种格式写入输出流以此字节数据创建一副图像从输出流获取字节数据将图像绘制到游戏画布中将字节数据打包发送结束结束(a)图像发送流程(b)图像接收流程图5.5图像发送和接收流程图5.5道具模块设计5.5.1旋转方块的设计 沈阳工程学院毕业论文第5章详细设计旋转方块的出现是随机的,而随着游戏级别的提升,每一关出现的旋转方块的数量也会不同,对于七种方块来说,它们在任何一段时间内出现的概率都是一致的,再者,旋转方块需要两个定时器,定时下落和定时旋转。旋转方块的这个性质要求它必须要两个线程才能控制,但是为了充分利用资源,我们可以利用方块控制线程去控制旋转方块定时下落,然后只需再创建一个线程控制它定时旋转即可。确定了两个线程共同控制旋转方块,就会出现一个线程协调工作的问题。如果一个新方块出现的时机正好也是旋转方块出现的时机,程序就会出现紊乱,所以必须保证,在同一时间,正常方块和旋转方块只能出现一个。因为两个线程需要共同控制旋转方块,所以不能用wait()和notify()这两个方法去协调线程,而应当利用其它条件去协调两个线程。首先,游戏开始后,旋转方块控制线程可以随机休眠一定时间(这个休眠时间应该是随着游戏级别的提升而缩短的)。休眠时间结束后,循环检测正常方块是否已经落下,当检测到方块落下后,马上得到一个新方块,然后开启一个循环,在方块没有落下之前让它按一定的时间频率旋转,成为一个旋转方块。对于方块控制线程,在方块落下时应该休眠一定数量的时间,以让旋转方块控制线程有得到旋转方块的机会,如果超出这个休眠时间,旋转方块控制线程还没有得到新方块,则可以认为旋转方块控制线程还处在休眠中,方块控制线程得到一个新方块。相应的算法流程如图5.6和图5.7所示: 沈阳工程学院毕业论文第5章详细设计休眠时间结束随机休眠一定时间检测现有方块是否已经落下是否能够消行方块是否已经落下是否能够消行休眠一定时间否是得到新方块休眠一定时间旋转方块否是游戏是否结束是否能够消行是否开始结束图5.6旋转方块控制线程工作图 沈阳工程学院毕业论文第5章详细设计休眠一定时间,让旋转方块控制线程有得到方块的机会检测方块是否已经落下是否能够消行是休眠时间结束旋转方块控制线程是否得到新方块是否能够消行是否否得到新方块方块下落开始结束图5.7方块控制线程对旋转方块的控制示意图5.5.2炸弹的设计道具的出现是随机的。本游戏中要实现的道具“炸弹”和方块一样,从游戏地图顶部降落,每隔一个时间间隔,会自动降落一格。对于炸弹的控制,可以添加到道具(旋转方块)控制线程中。炸弹控制的算法流程如图5.8所示: 沈阳工程学院毕业论文第5章详细设计休眠时间结束随机休眠一定时间检测现有方块是否已经落下是否能够消行是否能够消行是否能够消行休眠一定时间否是产生一个炸弹炸弹落下否否是否完全没入了方块中炸毁左右各两个格子范围内的方块格子炸毁所占行数的方块,增加相应积分,再额外增加所能消行的相应分数炸毁所占行数的方块,增加相应积分是否是是开始结束图5.8炸弹的算法流程图 沈阳工程学院毕业论文第5章详细设计综合以上信息,道具的详细设计如图5.9所示:随机休眠一定时间检测现有方块是否已经落下是否能够消行是否能够消行是否能够消行休眠一定时间否是产生一个新道具炸弹落下否否是否完全没入了方块中炸毁左右各两个格子范围内的方块格子炸毁所占行数的方块,增加相应积分,再额外增加所能消行的相应分数炸毁所占行数的方块,增加相应积分是否是是新方块是否是炸弹是否能够消行休眠一定时间方块是否已经落下是否能够消行旋转方块否是开始开始图5.9道具的详细设计图 沈阳工程学院毕业论文第5章详细设计5.6主模块——方块与地图模块设计方块与地图模块是游戏中最主要的模块,本模块存储了游戏最重要的两个数据结构——方块四维数组和地图坐标二维数组,以及对这两个数据结构的操作。这些操作就构成了游戏中最基本也是最主要的功能,如得到方块、方块的翻转移动、满行消除等等。本模块中方块的数据结构用一个四维数组存储,数组的第一维代表方块的形态,即是哪一种方块,第二维代表某种方块的一个翻转状态,第三和第四代表的是具体的方块。例如,定义一个四维数组,intblock[blocktype][turnstate][i][j],这就是七种方块、四种状态,一共二十八个方块的模型。当然,这其中,有一些方块的几种翻转状态是一样的,比如,长条形的方块,只有两种翻转状态,田字形的方块,只有一种翻转状态,这些方块在方块数组中存储的多种状态也就是一样的。如何将方块绘制到地图中去,可以说是游戏主模块中最大的难题,有了良好的方块数据结构和地图数据结构,这个难题也就变得简单了。只要得到方块数组在游戏地图中的坐标,然后遍历方块数组,将方块数组中值为1的地方绘上一个单位的正方形格子,方块数组遍历完毕后,也就在地图上绘制出了形状不规则的方块。良好的数据结构让方块的移动,满行消除等操作变得简单。方块的移动和满行消除,涉及到的是对游戏地图数据的操作,例如方块往下移,需要将游戏地图的横坐标也随着往下移动一个单位,往左往右移动也同样如此。方块满行消除,需要遍历游戏地图数组,发现某一行数值全为2,即认为这一行被方块填满,应该消去,行消去之后,应该把这行以上的数据全部向下移动一行,然后再继续往下检测,有满行就消行,再把上面的数据整体往下移动一行,如此重复,直到将所坠下方块占据的行数检测完为止。最后得到的就是消行之后方块的堆积状况和游戏地图数据了。本模块的主流程图如图5.10所示: 沈阳工程学院毕业论文第5章详细设计否是是是否移动方块游戏是否结束方块是否能够移动游戏开始初始化屏幕移动后是否越界否是方块是否已落下否是否是否能够消行是是产生新方块,并产生新的NEXT方块越界自动纠正否计算得分Notify音效播放线程,进入wait状态播放满行消除音效Notify方块控制线程,进入wait状态Notify音效播放线程,进入wait状态播放坠下音效Notify方块控制线程,进入wait状态分数是否达到设定值升级到下一关删除满行接受控制信息开始结束图5.10方块和地图数据模块流程图 沈阳工程学院毕业论文第5章详细设计5.6.1得到方块如图5.10所示,游戏中得到方块分两种,一是当方块落下后得到一个新方块,显示在游戏地图中,接着得到一个NEXT方块,显示在NEXT方块画布中。这里,将要解决的问题就是怎么得到一个新方块,怎么得到一个NEXT方块,又怎么将NEXT方块作为下一个新方块。方块是有模型和颜色的,在得到一个方块前,还得先得到要出现的方块的模型和颜色,然后才能在画布中绘制出指定模型、指定颜色的方块。1.方块的模型每得到一个新方块,都是随机从七种形态的方块中选取一种。由概要设计中可以得出分析,可以定义一个变量,代表新方块的模型。比如定义int型变量blocktype代表方块模型,方块的模型只有七种,所以blocktype的取值也只有七个,可以设定blocktype取值从0到6。即,0<=blocktype<=6那么,当方块落下需要得到新方块时,只需随机得到一个blocktype值,然后再把这个blocktype值赋给方块数组的第一维即可。剩下的问题就是应该怎么随机到一个blocktype?JAVA语言包中的Math类提供了一个换取随机数的方法random(),调用这个方法会产生一个值在0-1之间的双精度浮点数。所以每次要得到新方块时,只需调用一次这个方法,得到一个0-1的双精度浮点数,然后把这个数乘以一个稍大的整数,比如1000,得到的结果除以7,然后取余,最后将余数取整,取整后的结果就是一个大于等于0,小于等于6的blocktype值了。2.方块的颜色如果游戏中只有一种单色的方块,游戏未免显得过于单调,因此本游戏期望能够设计出彩色的方块。对于色彩值的得到,也可以用上面的方法,比如可以预先定义几种颜色,然后随机得到某一个数,这个数代表其中一种颜色,但是这样游戏的色彩还是显得有些单调。本游戏的期望是设计出色彩缤纷的方块,这个色彩缤纷甚至可以是整个游戏中出现的方块颜色都可以不一样。为了达到这个目的,在每次构造一个新方块时,就需要从颜色库中构造一个新颜色。我们知道,颜色其实是由红、绿、蓝三种颜色复合成的,这三种颜色复合时每一种颜色分量的不同,都会产生一种不同视觉效果的颜色。所以,在构造颜色时,我们可以分别给红、绿、蓝随机出一个不同的颜色值。JAVA抽象窗口工具包中提高了Color颜色类,其中有一个构造方法,是通过指定红绿蓝三种颜色分量来构造一个新color,有了这个构造方法,再利用Math类中的random方法,就可以达到“色彩缤纷”的效果了。3.如何得到一个新方块在随机出一个新的blocktype值后,要得到新方块就变得非常简单了,只需要将blocktype值传递给方块数组的第一维,同时把随机出的Color对象也传递过去,这样,就可以用得到的颜色画出指定形状的方块了。4.如何得到NEXT方块同样NEXT方块的形状和颜色也可以用上面的方法,然后在NEXT画布中绘制出得到的方块。剩下的任务就是怎么将现在的NEXT方块变成下一次出现的新方块的问题。 沈阳工程学院毕业论文第5章详细设计既然NEXT方块的blocktype值和color值已经得到,这个问题其实也就不难解决了。在得到新方块时,只需要将NEXT方块的blocktype值赋给新方块的blocktype,将NEXT方块的color值赋给新方块的color,然后再改写NEXT方块的blocktype和color,这个问题就解决了。图5.11是得到方块的算法流程图:绘制NEXT方块游戏开始得到blocktype和color值得到nextblocktype和nextcolor值绘制新方块新方块接受控制信息开始结束图5.11方块生成算法流程图5.6.2方块的翻转与移动方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变方块数据第二维turnstate的值,然后重新绘制方块即可。但是,这里边也会出现一个问题,这何种时候,方块不能再翻转和移动?5.6.2.1方块的移动很显然,当方块移动到地图的左右边界处,或者落下去后,不能再继续移动;另一种情况就是,当方块要移动的方向被其他方块挡住时,方块不能再移动。 沈阳工程学院毕业论文第5章详细设计确定方块移动的规则后,接下来就是如何将这种规则用算法表示的问题了。比如,当方块移动的左边界处时,方块不能再继续往左移动了,这个时候,肯定有一个条件成立,那就是方块的横坐标必定是小于或者等于零的。如果方块的横坐标等于0,方块就不能再移动,那么方块数组的第一列至少有一个值为1,这种情况比较简单,但是,如果方块数组的第一列全为0时,也就是说,当方块数组有1的那列碰到边界时,方块才不能移动,这个时候,首次出现1的那列的横坐标为0,而方块数组的横坐标肯定已经小于0了。假定我们以x记录方块数组的横坐标,以j记录方块不能移动时,方块数组中首次出现1的那列,当方块不能移动时,x+j的值必定是等于0的。同理,当方块到达右边界不能移动时,我们可以从方块数组的右边开始检测,记录下首先出现1的那列的值,这个时候,x+j一定是等于14的。当方块落下后,方块同样不能再移动。这又分为两种情况,一种是要坠下的地方还没有方块,这个时候,只要可以记录下方块数组中最后出现1的那一行,假定那是第i行,这样,只要y+i等于24,就可以认定方块已经落到游戏地图的底部,不能再继续下落。当要方块下边或者左右有方块时,可以确定下边有方块的那一格在游戏地图中的纵坐标是横坐标或纵坐标是x+j+1或者y+i+1,假定那一格的纵坐标坐标或者横坐标为y或x,那么游戏地图数组中[x+j+1][y]或者[x][y+i+1]这个元素的值必定是2。综合以上几种情况,我们可以列出方块移动条件判定表,如表5.1所示:表5.1方块移动条件判定表12345678条件是否有阻隔TTTTTTTFx+j=0||gamearea[y+i][x+j+1]=2TFTTTFTx+j=14||gamearea[y+i][x+j-1]=2FTFTFTTy+i=24||gamearea[y+i+1][x+j]=2FFFFTTT动作左移动√√√右移动√√√√下移动√√√√√5.6.2.2方块的翻转大多数的俄罗斯方块游戏的翻转判定条件都比较简单,即方块处在边界处时就不能再翻转,因为这种时候翻转会发生数组越界错误。试想一下,当方块移动到边界处,甚至还没有到边界处时,就不能再翻转了,无疑会给操作带来大大地不方便性。方块翻转的另一个问题就是,当方块下落过程中,左右两边都有方块,周围的空间不能再容许它翻转,往往很多游戏没有注意到这一点,这就导致,方块翻转之后把原来存在的方块给挤掉了,这个问题本质上也是翻转越界。为了解决以上问题,游戏设计中应该增加一个对于方块能否翻转的判定以及翻转越界纠正功能。1.方块翻转判定 沈阳工程学院毕业论文第5章详细设计如上所述,在两种情况下一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。第一种情况好办,只要参考方块落下去后不能够再移动的判定即可。对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转,否则,不能翻转。这里面又出现一个棘手的问题,因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,然后根据当前的blocktype和turnstate值,选择哪种判定条件进行判定,但是这样做未免过于麻烦。根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只有能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转;对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田子型的方块只要没有落下,就一直能够翻转;而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。所以,方块翻转的判定,要分三种情况。第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。方块数组在游戏地图中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。所以,如果以上空间有空格子,方块就能够翻转。据此,我们可以列出方块翻转的条件判定表,如表5.2所示:表5.2方块翻转条件判定表 沈阳工程学院毕业论文第5章详细设计12345678所有条件落下TFFFFFFF田字形方块T长条形方块1x4形态TT4x1形态T其它五种方块2x3形态TT3x2形态T第y行,x、x+3列空TF第y、y+1行x、x+2列空TF所有动作翻转√√√√√不能翻转√√√2.翻转越界纠正由上述判定表可以看出,只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢?比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了。同样,方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。结合上述判定表,可以列出方块翻转-越界纠正判定表,如表5.3所示: 沈阳工程学院毕业论文第5章详细设计所有条件落下TFFFFFFFFFF田字形方块T长条形方块1x4形态TTTT4x1形态T其它五种方块2x3形态TTTT3x2形态第y行,x、x+3列空TFFF第y、y+1行x、x+2列空TFFF另一边有足够空间TFTF所有动作翻转√√√√√不能翻转√√√√翻转越界纠正√√表5.3方块翻转-越界纠正判定表方块翻转处理的流程图如图5.12所示:接收到翻转信息方块是否落下不能翻转否是翻转后是否有足够空间不能翻转否是翻转后是否越界否直接翻转翻转越界纠正是结束结束图5.12方块翻转处理流程图 沈阳工程学院毕业论文第5章详细设计5.6.3满行消除JAVA图形类中提供了一个方法,copyArea(intx,inty,intwidth,intheight,intdx,intdy),这个方法的作用是将组建的某一区域复制到由dx和dy指定的水平距离和垂直距离所在的区域。利用这个方法,可以消除满行。那么,当方块落下去后,如何判断有行需要消除呢?如概要设计中所述,游戏地图中有方块的区域可以用2表示,当方块落下去后,判断某一行是否全部为2,如果全为2,即表示这一行已满,需要消除,这个时候,就可以利用copyArea这个方法将这一行消去了。消去一行后,要继续向下检测,如果下一行是满行,消除,否则再往下检测,一直将落下的方块所占的行数全部检测完为止。假定,以竖直状态落下一个长条形的方块,很显然,方块一共占据了四行。这时候,应该从长条形的方块占据的第一行开始检测,不管期间是否有消行,都必须将长条形的方块所占据的四行全部检测完为止。并且记录下消去的行数,方块消行完成后,增加相应积分。但是,这里面又会遇到一个问题,因为并不是所有方块所占的行数都一样,方块落下后到底该检测多少行呢?考虑到方块落下后最多占据四行,以及计算机运算的高速性,可以设定每一次方块落下后都往下检测四行。方块消行的流程图如图5.13所示:方块落下是否有消行否检测第一行检测第二行消去该行是是否有消行消去该行检测第三行是否有消行检测第四行消去该行否是消去该行是否有消行否是统计所消行数,增加相应积分结束开始图5.13方块消行流程图 沈阳工程学院毕业论文第5章详细设计5.6.4升入下一关当游戏分数达到一定值后,游戏将会自动进入下一关。升入高一级别的关卡后,游戏难度会随之增加,表现在方块下落的速度会加快,旋转方块出现的几率会提高,在游戏的底部会生成一定数量的小正方形方块。1.升入下一关每一次消行增加得分后,检查游戏的分数是否达到设定的值,如果达到设定值,则游戏关数别提升1,这个时候应该立即结束当前关卡的游戏,提示用户过关信息,当用户确认后,重新初始化游戏,进入下一关进行游戏。2.加快方块下落速度可以用一个变量记录当前游戏的关数,假定定义整型变量level代表游戏的关数,每一次,分数达到设定值后,level要自加1,重新初始化游戏时,应该根据这个level得到新的定时器休眠时间值,方块下落的速度也就随之改变了。3.提升旋转方块出现的几率同样,旋转方块几率的提高也可以用如上方法得到一个新的旋转方块控制线程休眠时间值,旋转方块出现的几率也将随之提高。4.在游戏底部随机生成一定数量的小正方形块障碍物的随机生成也比较容易实现。本游戏的游戏地图是25行x15列,一共25x15个单位格子,可以依据游戏地图大小设定小正方形块的生成规则是,随机生成的小正方形块占据的行数是当前的游戏关卡数,总共生成的小正方形格子的数量是行数x7。就如上面随机生成数值范围0到6的blocktype值,这里应该随机生成数值范围0到14的横坐标值,每一行都应该生成七个这样的横坐标值,一行生成完之后再继续往上一行,直到把所要求的行数全部填充指定数量的随机小方块为止。需要注意的是,每一次随机出0到14的横坐标值时,也应该随机出一个新颜色,用来绘制当前的随机方块,否则,随机出的方块将只有一种颜色,这个颜色将可能是黑色。相应的流程如图5.14所示:开始 沈阳工程学院毕业论文第5章详细设计分数达到设定值Level自加1,结束当前游戏并提示用户已过关用户确认过关根据新的level得到新的定时器值,新的旋转块线程休眠值,随机生成相应数量的小方块格子重新初始化游戏结束图5.14通关流程图 沈阳工程学院毕业论文第6章游戏测试第6章游戏测试6.1测试的意义及注意事项软件测试是软件工程中及其重要的一个环节,目的是保证软件的质量。测试的好坏将直接影响软件的好坏,进行测试可以找出其中的错误及不足加以改进,从而得到一个高效、可靠的系统。进行软件测试主要作用有以下几点:1.软件测试是为了发现程序中的错误而执行程序的过程。2.好的软件测试方案是极可能发现尚未发生错误的方法。3.程序的测试是发现了至今尚未发现的错误。软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关的人员和那些分析人员很容易找出错误所在。在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现会浪费很多的时间来修改。应在以下几方面加以注意:·语法错误语法错误是经常碰到的错误。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致不能继续编写代码。·逻辑错误逻辑错误通常可能是潜在和难以检测的。当有因键入错误或程序逻辑流程引起的逻辑错误,可能会成功运行,但产生的结果却是错的。例如,当本应使用小于符号比较数值,但却使用了大于符号时,那么将返回不正确的结果。·运行时错误运行时错误是在执行过程中指令试图执行不可能的动作而导致的,必须纠正运行时产生的错误,这样才能保证软件运行的可靠性。本游戏在开发过程中采用了多种有效的措施保证软件质量,例如,边界处旋转、游戏翻转越界纠,等等,极大地方便了用户操作,但是系统中通常可能还存在着一些错误和缺陷,因此,游戏必须要经过反复的运行测试,尽最大量将bug减到最少。6.2测试的步骤通常,软件测试的过程可以划分为单元测试、集成测试、确认测试和系统测试,本游戏将以这四个步骤进行测试。1.单元测试单元测试又称为模块测试,是针对软件设计的最小单位—— 沈阳工程学院毕业论文第6章游戏测试程序模块进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。可以应用人工测试和计算机测试两种不同类型的测试方法。单元测试需要从程序的内部结构出发设计测试用例,即采用白盒测试技术。多个模块可以平行独立地进行测试。在这个测试过程中所发现的往往是编码和详细设计中的错误。传统的最小可编译单元通常指模块、函数或子程序等,而在面向对象技术中通常是指类。单元测试的重点是模块接口测试、局部数据结构测试、重要的执行通路测试、出错处理通路测试、边界条件测试。2.集成测试集成测试分为子系统测试和系统测试。子系统测试是把经过测试运行正常的模块放在一起形成子系统后再测试。这个步骤着重测试模块的接口,测试模块之间能否相互斜体哦以及通信时有无问题。系统测试就是把经过测试运行正常的子系统组装成完整的系统后再进行测试。系统测试是测试整个软件和硬件系统,验证系统是否满足规定的要求。这个阶段发现的问题往往是需求说明和软件系统设计时产生的错误。一般,集成测试采用渐增式组装方法组装系统,渐增式组装方式有自顶向下和自底向上两种继承策略。自顶向下集成是从主模块开始,沿着程序的控制层次向下移动,逐渐把哥哥模块结合起来。在把附属于主模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先策略。深度优先策略是先组装在软件结构的一条主控制通路上的所有模块。选取一条主控制通路取决于应用的特点,并且有很大的任意性。而宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。自底向上集成从原子模块开始组装和测试。因为是从底部向上结合模块,总能得到所需的下层模块处理功能,所有不需要存根模块。3.确认测试确认测试是在软件开发过程结束时对软件进行评价,以确认它和软件需求是否一致的过程。确认测试也称验收测试,其目标是验证软件的有效性。4.系统测试系统测试,是将通过确认测试的软件作为真个基于计算机系统的一个元素,与计算硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。系统测试的目的在于与系统的需求定义进行比较,发现软件与系统定义不符合或与之矛盾的地方。系统测试的测试用例应根据需求分析规格说明来设计,并在实际使用环境下运行。6.3测试结果 沈阳工程学院毕业论文第6章游戏测试测试过程中,本游戏发现了一些错误,经过修正,最后本游戏完全能够正常运行。至此,游戏初级版本的开发工作结束。 总结结束经过一个月的努力,本游戏的开发工作至此告一段落,游戏能够正确运行,虽然说本游戏还只是一个初级产品,但是比起很多俄罗斯方块游戏,它的功能算是比非常丰富的,界面也具有一定的美观度,可以说取得了初步性的成功。这一个月来,我学到了很多东西。先前,对于JAVA,基本上还停留在理论阶段,但是通过这一个月的努力,完成了代码超过数千行的俄罗斯方块游戏,在JAVA学习方面,我能够感觉到自己的进步。例如,JAVA是纯面向对象的语言,通过这次的JAVA游戏开发,我深刻体会到了面向对象的编程思想,本游戏中设计的各个模块的独立性比较高,这就是我对面向对象编程思想体会的一个应用。还有,JAVA这门技术,很多要用到的应用程序接口,都被封装在了某个类里边,所以,学习JAVA,就是学会如何去用它已经存在的某个接口,而不是去研究如何实现这个接口。这也造成了JAVA的类库非常庞大,即使是娴熟的JAVA开发人员要记全它的API也是不可能的,而初学者乍看下去总会产生一种望而生畏的心理。这一个月的开发工作,让我对JAVA的类库有了个基本的了解,使我在以后的JAVA开发工作中知道如何去查找自己所需要的API。当然,在这期间,我也遇到了不少问题,如方块的绘制上,曾出现过太闪烁,刷新不彻底等问题。还有,图像截屏传输时编译器总是提示端口号已经被占用,经过检查,原来是我每次截屏发送图像数据时,都重新构造端口号,这是因为变量定义的错误,将变量定义成全局变量,问题就解决了。总得来说,大的问题没有遇到,遇到的都是一些逻辑、算法上以及变量定义的错误问题,通过程序测试,这些问题都很容易地解决了。 致谢毕业设计是大学里的最后一堂课,从开始进入课题研究到论文顺利完成的两个周的时间里,我经历了大学期间最为难忘的一段时光。在这段时间里,我学到了很多以前不曾接触的东西,这两个月经历对我未来的人生都会有很大的帮助和影响。首先衷心感谢我的指导老师姜柳老师给予我的无微不至的关怀和细心的指导。在设计过程中姜老师为我们提出了许多宝贵的意见和建议,在此我要由衷的向姜老师致以最衷心的感谢和深深的敬意。在此过程中同学们也给予我很大帮助,感谢我的同学们。在我遇到的一个又一个问题时同学们都热心的帮助我,帮我分析和我探讨,提出了许多解决问题的好方法和建议,使我最终解决了一个又一个问题,感谢我的同学们。由于我的学识有限,加之时间仓促,文中不免有错误和待改,不足之处,真诚欢迎各位师长、同学提出宝贵意见。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利!'