Java俄罗斯方块毕业论文正文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章绪论
1.1 游戏的历史
游戏是人类生活的重要组成部分,从第一个电子游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。
1.1.1 从头谈起
真正的电子游戏机产生于20世纪70年代。
1971年,麻省理工学院的学生Nolan Bushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。
这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。
但是最后他在电子游戏的发展上取得了非凡的成就。
上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。
在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。
这个程序被公认为是最早的电脑游戏程序。
1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。
这个游戏获得了第一作,它代表了当时电脑技术的最高水平。
1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。
20世纪80年代IBM PC兼容机的出现打破了Apple公司的垄断地位。
到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。
由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。
游戏产业也逐渐发展成熟。
1.1.2 图形硬件的革命
图形硬件的飞速发展是近些年来的事情,部分原因是来自工业方面的压力,例如在军事和医疗方面对于实时图形的需求很强烈,而交互娱乐产业也极大的推动了图形硬件的发展。
技术上的因素同样也推动着图形硬件的发展,许多图形算法可以很容易地表达为并行方式,这样硬件执行的效率变得很高。
摩乐定律也起了作用,越来越多的晶体管可以集成到一块单独的芯片上。
在所谓的GPU(图形处理器)概念出现以前,特殊的图形硬件只出现在诸如SGI和E&S系统里面,这些硬件价格太昂贵,不过这些公司提供了第一代基于硬件的顶点变换和纹理映射的解决方案。
1.2游戏的意义与内涵
游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦”。
因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。
1.2.1 游戏的组成要素
“游戏”,最简单的定义,就是一种供人们娱乐休闲的快乐元素。
从更专业的角度形容, “游戏”是具有特定行为模式、规则条件、身心娱乐及输赢的一种行为表现。
这种行为表现具备以下4个要素。
行为模式:“游戏”最简单的要素就是游戏有特定的流程模式,这种流程模式贯穿于整个游戏的行为,用户必须依照它的模式流程来执行。
倘若一种游戏没有了特定的行为模式,那么就没有执行的行为;在没有执行的行为之后,这个游戏也玩不下去了。
举个例子来说,如果猜拳游戏没有了剪刀、石头、布等行为模式,那么这还能叫做“猜拳游戏”吗?所以不管游戏的流程有多么复杂还是多么简单,一定要有特定的行为模式。
条件规则:当游戏有了一定的行为模式后,接着就必须制定出一系列的条件规则。
简单来说,这些游戏的条件规则就是大家必须去遵守的游戏行为守则,只要是大家一致以为的游戏行为,在游戏中,玩家就必须遵守它,如果不遵守这种游戏行为,那么就失去了公平性。
如同一种简单的球赛,打球的英文解释可以用PLAY GAME来加以说明,按照英文字面上的解释,它就是执行游戏的行为,而球赛必须有一定的条件规则,并且参与者都要必须去遵守它,不能遵守它就叫作“犯规”。
所以不管是什么游戏,它都会具备一组规则条件,在游戏进行的时候才会有足够的公平性。
娱乐身心:一种游戏所带来的娱乐性,关键就在于为玩家所带来的刺激感,这也是游戏的精华所在。
简单来说,不管是很多人玩的游戏,还是一个人玩的单机游戏,游戏本身就会存在它的娱乐和刺激性,使得玩家们想要去玩它。
输赢:其实针对游戏而言,输赢是所有游戏的最终目的。
一个没有输赢的游戏,也就没有了它存在的意义,如同我们常常接触到的猜拳游戏,说穿了最终目的就是为了分出胜负而己。
一般而言,游戏又可以分为动态和静态两种形态。
动态的游戏必须配合肢体动作,如猜拳游戏;而静态游戏则是较偏向思考的行为,如同纸上游戏。
然而不管是动态或是静态游戏,只要具备上述4项组成要素,都可以将它称为“游戏”。
1.3 俄罗斯方块游戏
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。
但是经过时代的变迁,当初简单却变化无穷的俄罗斯方块游戏如今却已失去了它的市场,究其原因,主要是因为游戏硬件以及技术的革新使得优秀的游戏接
二连三地推出,而俄罗斯方块游戏作为一款形式、内容过于简单的游戏势必经受不住时间的冲击的。
现在作者将改写这个固定的游戏模式,通过增加一系列的新功能,开发出一种全新的俄罗斯方块游戏,使游戏用户重新燃起对俄罗斯方块游戏的热爱。
第2章可行性研究
2.1 设计目的
综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。
2.2 可行性研究前提
基本需求:系统开发的总体任务是实现游戏的可操作性、美观性、及时性,及适当的功能扩展。
主要开发目标:采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏,并通过此次软件开发过程全面提高自身的综合素质。
可行性研究所采用的方法和步骤:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。
利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个有一定可玩性的游戏软件。
评价尺度:本游戏尽量追求游戏操作的合理性及正确性,但是仍不排除会出现一些偶然性的错误;同时游戏也尽量追求界面的美观性及功能的丰富性,但是基于时间的关系,可能会有极少数的拓展功能不能实现。
2.3 可行性分析
管理可行性:本游戏设计的目的只在于提高自身实践水平,并不对外发布,因此完全具有管理可行性。
经济可行性:由于本游戏的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台电脑便可,所以不用考虑到经济问题。
技术可行性:可用与本游戏的编程语言有VB,VC,Java,Delphi等,考虑到用于编写程序的困难度,和对语言的了解程度,选择JAVA作为编程语言。
需要对图形界面设计、事件处理、多媒体、网络编程等有一定了解。
社会可行性:本游戏的开发作为毕业课程设计以巩固先前所学的知识,以个人为单位,仅供个人平常娱乐所用,无须考虑有可能造成的社会影响,不用考虑到法律、版权等的社会因素,所以在这方面是完全可行的。
2.4 结论
综上所述,本游戏软件的技术成熟、完备。
各方面均无重大问题,因此本游戏软件可开始着手编写
第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.2.6 网络对战需求
本游戏,具备网络对战功能,所以要求玩家能够看到对方的游戏信息。
3.3 运行环境及系统性能的需求
本游戏对运行环境及系统性能的需求如表3.1所示:
3.4 接口需求
本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。
3.5 方案论证
可用于较好地实现俄罗斯方块的语言有C++、VB、JAVA,所以客观上说来,可用Jave,VB和C++这三种语言编写俄罗斯方块程序。
下面结合自身实际情况分别论述三种语言的优缺点并从中选择一种适合的编写语言。
3.6.1 VB的特点
VB是完全中文化的环境使用,语句生成器和快速提示帮助使用户不必记忆成千上万的属性和方法,在较短的时间内就能开发出功能强大的应用程序。
Internet应用程序的开发功能更加强大和容易,支持动态HTML技术的应用程序。
种类繁多,功能强大的多媒体控件,能帮助用户在较短的时间内用较少的语句编写出图文声像并茂的多媒体程序。
能对多种数据库进行读写操作。
它所提供的可
视化数据管理器能帮助用户构造多种类型的数据库。
用户自定义类型可以作为参数或作为公共属性和方法的返回值,函数可以返回数组变量,动态数组可以赋值,文件系统对象,按名调用,增强创建对象函数和StrConv函数。
应用程序安装向导能帮助用户自动生成具有一定功能的应用程序,加快了程序的开发速度。
3.6.2 C++的特点
C++是对C语言的扩充,扩充的绝大部分来自著名语言中的最佳特性:从SIMULA 67中吸取了类,从ALGOL 68中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了Ada的类属和Clu的模块特点,从BCPL中吸取异常处理,从BCPL中吸取了用//表示注释。
C++保持了C的紧凑、灵活、高效和易移植强的优点,它对数据抽象的支持主要在于类概念和机制,对面向对象风范的支持主要通过虚拟函数。
C++既有数据抽象和面向对象能力,语言运行性能高多,加上C语言的普及,而从C至C++的过渡较为平滑,以及C++与C的兼容程度可使数据巨大的C程序能方便地在C++环境中重用。
尽管C++当初的设计本意是帮助管理大型程序,但其用途并不仅限于此。
C++的面向对象的特性可有效地用于实际的程序设计工作。
C++常常用于设计编辑器、数据库、个人文件系统以及通讯程序等。
而且,由于C++共享C的效率,所以用C++可以构成很多高性能的系统软件。
3.6.3 Java的特点
Java是定义位于网络计算的计算机语言,它几乎所有的特点也是围绕着这一中心展开的并为之服务的,这些特点使得Java语言特别适全于用来开发网络上的应用程序;另外,作为一种面世较晚的语言,Java也集中体现和充分利用了若于当代软件技术新成果,如面向对象、多线程等,这些也都在它的特点中有所反映。
平台无关性:如前所述,Java语言独特的运行机制使得它具有良好的可移植性,利用Java,开发人员可以编写出与具体平台无关、普遍适用的应用程序,大大降低了开发、维护和管理的开销。
面向对象:Java是纯面向对象的编程语言。
面向对象技术较好地适应了当今软件开发过程中新出现的种种传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维护量增大经及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。
面向对象技术的核心是以更接近人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。
多线程机制:多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领域。
多程序技术允许同一个程序有两个执行线索,即同时做两件事情,满足了一些复杂软件的需求。
Java不但内置多线程功能,而且提供语言级的多线程支持,即定义了一些用于建立、管理多线程的类和方法,使得开发具有多线程功能的程序变得简单、容易和有效。
简单易学:如前所述,衍生自C++的Java语言,出于安全稳定性的考虑,去除了C++中不容不得易理解和掌握的部分,如最典型的指针操作等,降低了学习的难度;同时Java还有一个特点就是它的基本语法部分与C语言几乎一模一样。
这样,无论是学过Java再学C,还是已经掌握了C语言再业学Java,都会感到易于入门。
3.6.方案选择
面向对象是一种认识世界的方法,是一种程序设计方法。
面向对象的观点认为,客观世界是由各种各样的实体,即对象组成的。
每种对象都有自己的内部状态和运动规律,不同对象间的相互联系和相互作用就构成了各种不同的系统,并进而构成整个客观世界。
按照这样的思想设计程序,就是面向对象的程序设计。
面向对象的程序设计吸取了结构化程序设计的先进思想,并把它们同几个支持用户用新方法进行程序设计的有力概念结合在一起。
所有面向对象的程序设计语言一般都包含三个概念:封装、多态性和继承性。
这种方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。
面向对象的程序设计,是通过数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用作样板,在需要时再建立其副本。
C++和Java在面向对象这方面比VB要强,所以我排除了用VB做的可能性。
但是C++主观上在校期间学校并没有这方面的授课内容,虽然自学了一些内容,对C++也有一定了解,但是若用C++实现,必定是基于windows应用程序的Visual C++设计,对于windows编程,我还有待提高,而我对JAVA的掌握,相对而言,比较熟悉,综合考虑,决定采用Java语言编写俄罗斯方块。
第4章概要设计
4.1 游戏设计所要遵循的规范
一个良好的程序,在编写之前,必须要制定各种编写规范,以便组内各成员协调工作。
当然,本游戏只是一个小程序,过多的规范制定显得没有必要,但是,也必须制定一个对于变量的命名规则,这有利于设计出一个可读性高的程序。
本程序变量的命名规则为:
·所有变量一律使用相应的英文单词命名
·如果同一类中需要创建多个同一类型,功能相似的变量,变量的前缀应使用统一的英文单词,后缀为下划线“_”加数字。
比如,从JButton对象创建开始按钮,可以命名为:startbutton。
再如,创建多个道具按钮,可以命名为toolbutton_1,toolbutton_2等等。
·方法命名尽量使用能够描述本方法功能的英文单词
比如,游戏初始化可以用gameinitial。
·类名字命名也应当使用能够描述本类功能的英文单词。
如方块类,可以用class block。
4.2 游戏总体设计分析
Java为纯面向对象(Object-Oriented,OO)的程序语言,它的诸多优点在此就不作论述了。
从面向对象的观念出发,本程序主要可分为以下几个模块:
●客户端GUI模块
●方块及地图数据模块
●音频文件播放模块
●道具使用模块
●网络传输模块
分析对象的技巧在于它的功能的扩展性及维护效率。
试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。
4.3 各模块的算法设计
4.3.1客户端接口的设计
“客户端控制器”是指游戏界面上显示游戏相关信息及排布游戏控件的面板。
游戏客户端控制器上集合了游戏的各种事件处理,包括游戏定时控制,键盘
控制,道具控制,音乐播放,选择网络对战等各种控制命令。
本模块是程序的主模块,其它四个模块都由本模块进行控制。
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组件都实现了可存取性接口,提供对可存取性的支持,使得辅助
功能如屏幕阅读器、语音识别系统,能十分方便地从swing组件中得到信息。
·MVC体系结构
Swing组件设置三个通讯对象:模型、视图和控件,并将模型与视图奋力开来,这样可以方便用户直接通过模型管理数据,实现基于一种模型的多种视图处理。
基于swing组件的优点,结合本程序的设计目标,程序的界面将使用swing 组件实现。
4.3.2方块及地图数据模块的设计
这是俄罗斯方块游戏最基本的功能模块,本游戏的设计思想是只要有客户端控制器及方块地图数据模块,就能实现游戏的基本功能。
本模块其实可以分开为方块和地图两个模块,但考虑到二者联系紧密,需要共享数据结构,属于公共耦合,耦合性过高,将二者分开也有悖于作者设计的游戏算法,增加了程序的编写难度,故把它们并作了一个对象。
1.方块数据
方块数据存储了七种不同形态的方块,以及每个方块的四种形态,可用一个7x4x4x4的四维数组表示,例如,定义一个四维数组block[7][4][4][4],数组block的第一维表示七种不同形态的方块,第二维代表方块的四种不同翻转状态。
数组的第三维和第四维代表某一种形态的方块的某一状态。
假定,block[0][0][i][j]的值如以下:
1,1,0,0
0,1,0,0
0,1,0,0
0,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,1
0,0,0,1
0,0,0,1
0,0,0,1
当以上数据模式所代表的方块处在游戏的左边界区,并且发生翻转时,方块可能翻出游戏地图外,在这种情况下,就发生了游戏地图数组越界,JAVA异常处理系统会抛出ArrayIndexOutOfBoundsException,为避免这种情况的发生,游戏地图数组应当适当增大,故本游戏将地图数组长度和宽度各扩大了三个单位,定义成为28x18模式的数组。
3.建立游戏的坐标系统
俄罗斯方块,最终是要将方块绘到游戏地图中,如何确定方块在地图上的位
置,就需要一个方块数组与游戏地图数组的映射关系。
建立一个合理的坐标系统,对于游戏的设计有莫大的方便。
结合JAVA的坐标系统,综合游戏设计上的考虑,本程序最终确定了将游戏地图的左上角坐标表示为(0,0),同样,方块在游戏地图中表示为记录方块左上角在游戏地图中的坐标。
4.对方块数据和游戏数据的操作
确定了方块数据与地图数据的映射关系,对方块和游戏数据的操作就变得简便了。
对方块的操作包括方块的左移、右移、下移等,当方块左移时,只需将方块数组左上角的坐标往左方向移动一个单位即可,同理,方块右移、下移时,只需将坐标往右、往下移动一个单位。
如果以X代表方块左上角的横坐标,以Y代表纵坐标,方块左移,执行的操作是X--,方块右移,执行的操作是X++,方块下落,执行的操作是Y++。
5.游戏绘图
俄罗斯方块具有七种不同形态的方块,而方块又分别有正在下落和已经落下固定两种不同状态,如何在游戏地图中实现静态和动态地绘制出七种不同形态的方块,具有一定的挑战性。
经过反复思考论证,本游戏决定采用不同的绘制模式来分别实现绘制动态和静态方块。
·遍历方块数组绘制动态方块
假定调用Graphics类中的fill3DRect(int x,int y,int width,int height,Boolean raised)方法绘制方块,再假定方块数组左上角在地图中的坐标为x和y,则绘制动态方块可采用如下方式实现。
for(int i=0;i<=3;i++)
for(int j=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,则可以认为这行被方块填满,需要进行消行,然后再继续往下判断下一行,直到所有满行被消除为止。