基于安卓的俄罗斯方块游戏-论文_第1页
基于安卓的俄罗斯方块游戏-论文_第2页
基于安卓的俄罗斯方块游戏-论文_第3页
基于安卓的俄罗斯方块游戏-论文_第4页
基于安卓的俄罗斯方块游戏-论文_第5页
已阅读5页,还剩29页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计题目:基于Android俄罗斯方块游戏的设计与实现姓名:〔宋体小三居中〕学号:〔班级+学号〕〔字号同上〕学院:〔字号同上〕专业:〔字号同上〕同组人:〔字号同上〕指导教师:〔字号同上〕协助指导教师:〔字号同上〕〔阿拉伯数字〕年月日〔宋体小三居中〕摘要随着移动平台的崛起,越来越多的传统PC软件被移植到移动平台,比方ipad,iphone,Android等智能终端设备,在这些平台中,Android占领着最大的市场份额,所以为Android用户开发满足日常使用的软件成为了现在的一大热门。本次设计选用了时下比拟热门的Android平台来作为开发技术,实现了一个俄罗斯游戏系统,用户可以使用本系统来玩俄罗游戏。本论文将逐步介绍基于Android平台的俄罗斯游戏系统的开发背景和意义,接着详细介绍了俄罗斯游戏系统的分析、设计与实现过程,最后对本论文做了总结。关键字:Android、俄罗斯游戏、SQLite、ABSTRACTWiththeriseofmobileplatforms,moreandmoretraditionalPCsoftwareisportedtomobileplatforms,suchasiPad,iPhone,Androidandothersmartterminalequipment,tooccupythelargestmarketshareintheseplatforms,Android,developedforAndroidusersmeettheday-to-dayuseofthesoftwarehasbecomeafavorite.ThedesignselectionofthemorepopularnowadaysAndroidplatformasthedevelopmentoftechnology,aRussiangamesystem,theusercanusethesystemtoplaytheRussiangame.Thisthesisisastep-by-stepintroductiontothebackgroundandsignificanceofthedevelopmentoftheRussiangamesystembasedontheAndroidplatform,andthendetailsthetheRussiangamesystemanalysis,designandimplementationprocess,andfinallythepapersummarized.Keywords:Android,Russiangame,SQLite,phone目录摘要2ABSTRACT3目录41引言51.1课题研究背景51.2国内外研究现状61.3课题研究方法和研究路线71.4论文的组织结构72关键技术介绍92.1什么是Android92.2Android系统架构简介92.1.1应用程序(APPLICATIONS)102.2.2应用程序框架(APPLICATIONFRAMEWORK)102.3.3Android运行时(RUNTIME)102.3.4系统库(LIBRARIES)102.3.5Linux112.3SQLite数据库113系统分析123.1概述12系统分析的原那么12系统分析的方法12系统性能要求分析123.2系统可行性分析133.3系统算法功能需求143.4系统算法与流程分析154系统设计174.1系统设计目标174.2系统功能模块设计174.3工程文件结构设计185系统编码开发215.1系统主界面215.2游戏主界面215.3排行榜界面开发225.4声音控制实现236系统测试246.1测试的重要性246.2测试的目的257总结和展望26结束语27致谢28参考文献29附录301引言1.1课题研究背景Android是Google开发的基于Linux平台的开源操作系统。它包括操作系统、用户界面和应用程序—移动工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Google与开放联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达电和T-Mobile在内的30多家技术和无线应用的领军企业组成。Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动软件平台,在移动产业内形成一个开放式的生态系统。作为谷歌企业战略的重要组成局部,Android将进一步推进“随时随地为每个人提供信息〞这一企业目标的实现。全球为数众多的移动用户正在使用各种基于Android的。谷歌的目标是让〔移动通讯〕不依赖于设备甚至平台。出于这个目的,Android将补充,而不会替代谷歌长期以来奉行的移动开展战略:通过与全球各地的制造商和移动运营商结成合作伙伴,开发既有用又有吸引力的移动效劳,并推广这些产品。1.2国内外研究现状游戏产业在随着网络的开展有了长足的开展。游戏最早起源于纯文字的交互游戏MUD;MUD是英文Multi-userDungeons的缩写。纯文字交互顾名思义是一纯文字的形式来进行游戏。即所有的场景描述、物品的样子、所有人的行动、时间的描述都是用文字的方式表达的。总之文字MUD是一个很需要想象力的游戏形式需要从文字转化成玩家自己脑海中的现实场景。随着电子元器件的开展电子产品迅速开展。掌上游戏机和电视游戏机在80年代和90年代风行一时此时由苏联人AlexPajitnov制作的游戏俄罗斯方块在掌上游戏机和电视游戏机上流行其造成的轰动和经济价值成为游戏史上的大事。俄罗斯方块是个老幼皆宜的小游戏它实现由四块正方形的色块组成然后存储在一个数组的四个元素中计算机随机产生不同七种类型的方块根据计算机时钟控制它在一定的时间不停的产生用户根据键盘的四个方向键控制翻转、向左、向右和向下操作控制键的实现是由键盘的方向键的消息函数实现。然后程序根据这七种方块堆叠成各种不同的模型。俄罗斯方块游戏是一个比拟经典的游戏根据软件工程有关的标准以合理的开发原那么设计出俄罗斯方块游戏并给人们的生活带来唯美的艺术享受和健康愉快的补充。我希望通过探索去实现它从实践和实际的工程中提高自己的编程能力。俄罗斯方块是一款风行全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值在游戏史上是非常巨大的。这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的。最终经过各种改进,俄罗斯方块的第一个PC版本诞生了,他们给这个游戏取了一个源于希腊文字的名字“四〞〔tetra〕——Tetris,即现在的“俄罗斯方块〞。这种将不断掉落的各种形状的方块摆满一行将之消除的游戏,不仅风行了当时的俄罗斯,甚至到现在依然以其不退的热度席卷着全球。众多的游戏开发者也纷纷效仿制作出了各种新版本,因此也使“俄罗斯方块〞这款老少皆宜的游戏变得越来越趣味横生。对一般用户来说,它的规那么简单,容易上手,且游戏过程变化无穷,而在一些联众网络游戏中,更有一些独有的魅力――有单机作战、双人单机对战和双人网络对战三种游戏模式,三种模式都是在一行堆满后就可以消掉,最前方块堆积至窗口顶端,即告负,用户可任选一种模式进行游戏。其中单人模式是一种玩积分的游戏,如果积分高的话,还可以存入高分榜上。而双人单机对战模式那么是两个人在同一台机器上进行对战游戏,双人网络对战模式那么需要两人首先进行网络连接,然后才能进行对战游戏,后两种模式在游戏过程中如果自己一次消去两行以上的话,就可以送给对方使对方的行数增长,让你尽情体会对战的趣味。另外,网络对战模式还具备网络聊天功能,让你在游戏过程中还能体验到聊天的乐趣,同时也给用户提供了一个展现自己高超技艺的场所。1.3课题研究方法和研究路线本课题研究方法主要采取调查法、比照法和文献分析法。通过考察当前教学大纲、教学方案等信息,整理相关的文档。研究路线:1.列出总体框架结构,建立大模块,再细分各小模块,建立模块与模块之间的联系。2.根据自己学过的并能熟练运用的设计软件,确定开发工具,拟定采用VisualStudio作为前台开发工具,设计前台用户与管理人员的操作界面。3.以SQLServer应用软件建立后台数据库效劳层,合理地处理好各数据之间的关系,发挥出SQLServer的功能。4.确定关键技术,即运用ADO.NET访问SQLServer数据库,把前台用户操作界面层与后台数据库效劳层有效的联系起来,使得整个系统完整,让用户用起来更简洁方便。1.4论文的组织结构本文详细介绍了基于C#的教师教学管理信息系统开发之日常课程管理系统的设计、开发的全过程。从开始到程序设计的实现,将在一下的几章中予以介绍:第1章绪论,这一章主要是对本次毕业设计所开发的系统进行问题的定义,通过问题的定义明白需要做些什么,并且对开发内容简单的介绍了一下;同时本章还对课题的研究背景与研究意义进行分析,对开发本系统的可行性分析还有对论文各章内容的简要介绍。第2章相关技术介绍,正对本次设计,对涉及到的理论知识和用到的开发工具做相关阐述。第3章系统分析,主要介绍了本系统需要实现的功能模块和本系统的数据库设计、界面的详细设计等。第4章系统详细设计,主要介绍了本系统的整个设计过程、设计思路以及设计中应该注意的问题。第5章系统实现,主要介绍了本设计的实现环境和实现的核心代码。第6章系统测试,介绍了软件测试的重要性以及测试的相关方法,还结合本系统给出测试用例。最后:致谢、参考文献。2关键技术介绍2.1什么是AndroidAndroid是首个基于Linux平台的开源操作系统,该平台由操作系统中间件,用户界面和应用软件组成号称是首个为移动终端打造的真正开放和完整的软件。Android一词的本义指“机器人〞,2003年美国有一家以Android为名的小公司成立,开发平台。Google收购Android之后,于07年11月5日发布了开源的Android平台——一款包括操作系统〔基于Linux内核〕、中间件和关键应用的平台,并组建了开放联盟(OpenHandsetAlliance),包括Google、中国移动、T-Mobile、宏达、高通、摩托罗拉等领军企业。2023年9月22日,美国运营商T-MobileUSA在纽约正式发布第一款Google——T-MobileG1。该款为宏达电制造,是世界上第一部使用Android操作系统的。2.2Android系统架构简介从软件分层的角度来看,Android平台由应用程序,应用程序框架,Android运行时,库以及Linux内核共5局部构成。如图6.1所示。图6.1整体结构2.1.1应用程序(APPLICATIONS)Android平台默认包含了一系列核心应用程序,包括电子邮件、短信、日历、地图、浏览器、联系人管理程序等,这些程序都以java程序语言编写,你也可以用自己便携的应用程序来替换Android提供的应用程序,这个替换的机制实际是由应用程序框架来保证的。如图6.2所示。图6.2应用层2.2.2应用程序框架(APPLICATIONFRAMEWORK)应用程序框架是我们进行Android开发的根底应用程序框架层包含了视图系统,内容提供器,窗口管理器,活动管理器,通知管理器,位置管理器,资源管理器,管理器和包管理器9大局部。如图6.3所示。图6.3中间件层2.3.3Android运行时(RUNTIME)Android虽然采取Java程序语言来编写应用程序,但不使用J2ME执行Java程序,而是用Android自有的Android运行时〔RunTime〕.Android运行时包括核心库和Dalvik虚拟机两局部。如图6.4所示。图6.4核心库,虚拟机2.3.4系统库(LIBRARIES)应用程序框架是贴近于应用程序的软件组件效劳,而更底层那么是Android的函数库,这一局部是应用程序框架的支撑,其架构如图6.5所示。图6.5 系统库2.3.5LinuxAndroid平台是开放,采用Linux内核那么是Android平台开放性的根底。Android平台中的操作系统采用了Linux2.6版的内核,它包括了显示驱动、摄像头驱动、Flash内存驱动、Binder〔IPC〕驱动、键盘驱动、wifi驱动、Audio驱动以及电源管理局部。Linux内核层为我们在软件层和硬件层建立了一个抽象层,使得应用程序开发人员无需关心硬件细节。对于的开发商而言,如果想要Android平台运行到自己的硬件平台上就必须通过对Linux层进行修改,通常要做的工作就是为自己的硬件便携驱动程序。2.3SQLite数据库Android采用SQLite这个轻量级数据库工具来管理数据;SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比方Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。至今已经有12个年头,SQLite也迎来了一个版本SQLite3已经发布。SQLite实现了多数的SQL-92标准,包括事务,就是代表原子性、一致性、隔离性和持久性的〔ACID〕,触发器和多数的复杂查询。不进行类型检查。你可以把字符串插入到整数列中。例如,某些用户发现这是使数据库更加有用的创新,特别是与无类型的脚本语言一起使用的时候。其他用户认为这是主要的缺点。多个进程或线程可以同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入;否那么会写入失败并得到一个错误信息〔或者会自动重试一段时间,而这重试时间的长短是可以设置的〕。程序设计者还提供了一个叫做sqlite3的独立程序用来查询和管理SQLite数据库文件。SQLite的用户可以把这个程序当作如何写SQLite应用程序的例如。3系统分析3.1概述系统分析是在总体规划的指导下,对某个或假设干个子系统进行深入仔细地调查研究,确定新系统逻辑功能的过程。这一阶段的主要任务是由系统分析员了解每个业务流程,工作流程,广阔用户的需求,运用系统开发理论、开发方法和开发技术设计出一个计算机化的信息系统。系统分析的原那么在系统分析中存在很多困难,为了克服困难,做好分析工作,在进行系统分析时应遵循系统分析的原那么,这样才能保证分析工作能够顺利进行,系统分析的原那么有:1.逻辑设计与物理设计分开的原那么2.面向用户的原那么3.结构化分析的原那么通过实际调查并分析交流后,分析俄罗斯方块游戏系统的具体的要求,确定本系统的逻辑功能,以满足用户的各项要求,完成相应的各项功能,提高系统的实用水平。在近期目标完成后,该系统应该有很强的扩充性,便于在此根底上进行扩充式开发,为以后的开展及扩充打好根底。系统分析的方法该系统采用以抽象和分解为手段,并且采用结构化分析方法进行系统分析,根据实际调查研究,对系统进行自顶向下的逐层分解,逐步细分,逐步求精,建立新系统的逻辑模型,这个逻辑模型将尽可能防止使用计算机术语,让其尽可能的简单化、通俗化,便于设计者和浏览者的沟通与交流经验。结构化分析方法的根本思想是该系统采用结构化分析方法,以抽象和分解为手段,对系统进行自顶向下的逐层分解,逐步细分,逐步求精,从而到达易于理解的目的。3.1.3系统性能要求分析为了保证系统能够长期、平安、稳定、可靠的运行,系统应满足以下性能要求:(1)系统处理的准确性与及时性:系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,充分考虑当前和将来可能承受的工作量,使系统的处理能力和相应时间能够满足信息处理的要求。(2)系统的可扩充性及可维护性,系统的开发过程中,应该充分考虑以后的可扩充性相当于升级。当今企业对系统的可维护性也有了相当高的关注。例如添加新功能。所以本系统采用了CS开发模式,大幅提高了系统的可扩展性及可维护性。(3)系统的可兼容性,考虑到目前Android版本众多、设备众多,所以设计出的程序必需要求可以兼容各个主流版本。(4)系统的可靠性,可靠性是保证系统正常工作及抗故障、抗干扰的能力,它包括:保证系统正常工作的能力;对系统故障的预防、检测以及自动纠错的能力;出现故障时,保证系统不发生崩溃,并使系统重新恢复、重新启动的能力等.平安性是保证合法用户能够正确使用信息系统,并防止非法用户访问信息系统的能力.适应性是信息系统对外部环境和需求变化的适应能力.3.2系统可行性分析可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要到达这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是对进行了一次较大压缩简化后的系统进行分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。系统的可行性分析主要包括经济上的可行性,技术上的可行性,操作上的可行性和法律上的可行性。经济可行性目标系统开发经济需求的比拟低,加上具有成熟的Android平台以及十分普及设备,所以在软硬件的支出上十分有限。而且,目标系统并是十分的复杂,开发的周期较短,人员经济支出有限。当系统开发成后,通过测试和、试运行和实际应用后,将很大程度上提高移动公交查询系统的科学性和高效性,在为人们带来便利的同时,也为系统的进一步推广、创新创造了条件,这带来的经济回报将远超过支出,并且最重要的一点是通过该系统的开发,可以使我们进一步理解软件工程思想和软件开发流程,为从事软件开发工作打下很好的根底,从长远利益来考虑,本课题的设计开发还是具有相当大的经济可行性的。技术可行性本系统使用Android技术进行开发,开展到现在,Android已经算是一个较成熟的平台了,现在有越来越多的企业及技术人员选择它作为开发平台。因此,在技术上.NET是完全可以胜任这个平台的开发。Android开发平台是由谷歌与开放联盟合作开发的一个开放、自由的移动终端平台,它由操作系统、中间件、应用软件三局部组成。该平台备有完善的程序开发环境,包括模拟器、除错工具、程序执行所耗用存储器、性能评介等功能。操作可行性本系统用户只要有一台Android,就可以使用了,系统是由的操作都是用户熟悉的选择框或者按钮等等。所有的操作通过就可以完成,,用户不需培训,只要稍微提示一下即可。因此,在操作使用上,本系统简单、方便,易于使用户接受,因而是十分可行的[3]。⑷法律可行性由于本系统是在相关法律法规下实施完成的,所以不存在任何法律问题,在法律上是完全可行的。综合考虑经济、技术、操作和法律等方面的因素,该系统可以立即开始进行。3.3系统算法功能需求对于俄罗斯方块,其功能描述如下:1.游戏区域上方不断地出现预定义形状的方块,下坠方块可以通过旋转改变其显示形状,并且不断地往下坠,直到它接触到游戏区域底部或者其他之前已经累叠起的下坠方块。2.当一个下坠方块到达游戏区域底部或者接触到其他之前已经累叠起的下坠方块后,其位置那么确定下来并占有该空间的位置区域。当游戏区域的某一行被下坠方块完全填充,那么消除该行的所有下坠方块,垒在其上的方块将按照一定的算法掉下代替改行空间。3.游戏的结束是以下坠方块的顶部到达游戏区域顶部作为判断依据。4.另外,在游戏区域产生一个新的方块的一瞬间,立即产生下一个下坠方块的形状并在提示区域的左上方有预先提示。同时,在游戏界面的右下方,将显示玩家所得的分数和游戏的级别。每当游戏玩家成功消除一行方块时,将按照一定的算法计算出所得分数,并修改游戏状态区域的分数的数值,到达一定的分数将修改游戏的级别。功能需求如表格3-1所示:功能简介顺时针旋转顺时针旋转转块逆时针旋转逆时针旋转转块绘制转块指定画板上绘制转块擦除矩形指定画板上擦除矩形左移动左移动转块右移动右移动转块下移动下移动转块丢下砖块在画板上丢下砖块计分根据玩家消去的行数计分表3-1系统功能需求游戏界面需求,良好的用户界面有提示显示和分数显示。将整体界面分为三局部,左侧半局部用来存放俄罗斯方块是游戏的活动区用户操作的图形变化在这个主界面区完成。右上侧局部显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。右侧下半局部用来显示用户的分数和当前等级以便让用户有成就感增加可玩性。3.4系统算法与流程分析对于方块在某一瞬间的位置标识我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置也就是说用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,如图3-2:图3-2并且在编号过程中对于同一列的方块实行从上到下进行编号方块表示方法即四个小方块的坐标设定,其中一个方块是原点坐标为(0,0)右侧方块坐标(1,0),下面的方块坐标(0,1)以此类推。从开始判断是否到底底部,到达那么做销行操作,然后生成下一个下坠物将新的下坠物代替旧的下一个下坠物,将旧的下坠物当做当前的下坠物下到底部判断是否做销行操作,然后判断游戏是否结束,未结束那么继续新一轮的生产方块,假设方块到达了顶部,占满了空间那么游戏结束。流程图如图3-3所示显示方块于屏幕中显示方块于屏幕中检查方块在屏幕上是否有阻碍发生游戏开始游戏结束产生控制方块下降的执行信息1检查满行。2删除满行。3重新装载方块。移动方块方块移动时是否有阻碍接受按钮的控制信息方块是否无法下移是否否是否是图3-3游戏规那么流程图4系统设计4.1系统设计目标在系统分析的根底上,设计出能满足预定目标的系统的过程。系统设计内容主要包括:确定设计方针和方法,将系统分解为假设干子系统,确定各子系统的目标、功能及其相互关系,决定对子系统的管理体制和控制方式,对各子系统进行技术设计和评价,对全系统进行技术设计和评价等。本系统是设计目标是建立一个基于Android的俄罗斯方块游戏软件,根本可以的满足人们对游戏的需求,系统具有上手简单、操作方便快捷的特点。用户界面友好、操作简单,每一步骤的操作都经过精心的设计,将复杂的统计运算过程隐藏于简单的操作之下,系统的设计能降低使用前的培训、实施和使用中的维护时间。通过合理而先进的网络设计及软、硬件的优化选型,足可保证系统的可靠性与容错性。系统以用户需求为目标,以方便用户为原那么,处处为使用者着想。4.2系统功能模块设计本系游戏分主界面、游戏界面、帮助界面和排行榜界面,而游戏模块中又可以分为游戏规那么控制模块、游戏暂停/开始控制模块等等,系统的功能模块架构设计如图4.1所示:图4.1系统功能模块图4.3工程文件结构设计在程序开发阶段,首先确定“即Android的俄罗斯方块游戏〞的工程名称为Tetris,根据程序模块设计的内容,建立Tetris工程,Tetris工程,的文件结构如图4.2所示:图4.2工程结构图为了使代码文件结构更加清晰,Tetris工程设置了多个命名空间,分别保存了用户界面、数据适配器、常用类库和实体多个包,源代码的名称以及说明如表4.3所示:包名称文件名说明MainActivity.java主界面视图GameActivity.java游戏主界面视图HelpActivity.java操作帮助界面视图RankActivity.java排行榜界面视图RankDatabase.java数据库效劳RefreshHandler.java游戏控制TetrisView.java游戏规那么控制类DrawTool.java绘制类表4.3系统代码结构Android的资源文件保存在/res的子目录中。其中、/res/anim目录中保存的是产生动画效果的XML文件,/res/drawable/目录中保存的是图像文件,/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中保存的是XML格式的数据文件。所有在程序开发阶段可以被调用的资源都保存在这些目录中,具体每个资源文件的用途可以参考表4.4:资源目录文件名说明Drawablebtn_comm_selector.xml按钮资源文件Layoutlayout_main.xml主界面布局文件Layout_help.xml操作帮助文件layout_rank.xml排行榜布局文件menumain_menu.xml文件管理上下文菜单布局文件valuesstyles.xml样式资源文件colors.xml颜色资源文件strings.xml字符串资源文件表4.4资源文件名称及用途5系统编码开发5.1系统主界面该界面为用户一进入俄罗斯游戏系统第一个看到的界面,该界面通过LinearLayout和RelativeLayout等布局组件来实现控件的布局,本界面涉及到的组件包括Button、CheckBox等。该界面主要包括的按钮有继续上次游戏、新游戏、帮助、排行榜和退出等,选择不同的按钮可以进入不同的界面,例如选择“新游戏〞可以开始一个新的游戏。同时该界面也包含了一个声音开关按钮,用户可以通过该按钮来控制是否播放声音。具体的实现效果如图5.1所示:图5.1游戏主界面5.2游戏主界面当用户在系统主界面选择“新游戏〞或“继续上次游戏〞后,系统会自动跳转进入本界面,该界面即为游戏控制界面,玩家可以在本界面玩游戏。游戏规那么是系统上方会不断下落各种形状的方块,玩家不断拼凑组合使方块有规那么地组合起来,并由此获取分数的递增,当分数到达一定要求时,系统会自动把当前等级提高一级,越高级方块下落的速度会也快,游戏的难度也因此会增加。具体的实现效果如图5.2所示:图5.2游戏控制主界面5.3排行榜界面开发在该界面用户也可查看到游戏排行榜信息,排行榜数据是存储到SQLite数据库当中的,SQLite为Android系统自带并完全支持的小型数据库,特别适用于嵌入式设备当中。具体的实现效果如图5.3所示:图5.3排行榜界面5.4声音控制实现为了给玩家移动方块提供声音提醒功能,系统需要实现声音文件的播放,这一过程是通过Android系统提供的MediaPlayer接口来实现的。当一个MediaPlayer对象被刚刚用new操作符创立或是调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于End状态。这两种状态之间是MediaPlayer对象的生命周期。6系统测试6.1测试的重要性软件的测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试学仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶段中都应包含测试,从而检验本阶段的成果是否接近预期的目标,尽可能早的发现错误并加以修正,如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。事实上,对于软件来讲,不管采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。测试是所有工程学科的根本组成单元,是软件开发的重要局部。自有程序设计的那天起测试就一直伴随着。统计说明,在典型的软件开发工程中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总本钱中,用在测试上的开销要占30%到50%。如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的本钱比例也许会有所降低,但实际上维护工作相当于二次开发,乃至屡次开发,其中必定还包含有许多测试工作。在实践中,软件测试的困难常常使人望而却步或敷衍了事,这是由于对测试仍然存在一些不正确的看法和错误的态度,这包括:(1)认为测试工作不如设计和编码那样容易取得进展难以给测试人员某种成就感;(2)以发现软件错误为目标的测试是非建设性的,甚至是破坏性的,测试中发现错位是对责任者工作的一种否认;(3)测试工作枯燥无味,不能引起人们的兴趣;(4)测试工作是艰苦而细致的工作;(5)对自己编写的程序盲目自信,在发现错误后,顾虑别人对自己的开发能力的看法。这些观点对软件测试工作是极为不利的,必须澄清认识、端正态度,才可能提高软件产品的质量。6.2测试的目的如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比拟复杂的局部或是以前出错比拟多的位置。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。在谈到软件测试时,许多人都引用GrenfordJ.Myers在《TheArtofSoftwareTesting》一书中的观点:(1)软件测试是为了发现错误而执行程序的过程;(2)测试是为了证明程序有错,而不是证明程序无错误;(3)一个好的测试用例是在于它能发现至今未发现的错误;(4)一个成功的测试是发现了至今未发现的错误的测试。这种观点可以提醒人们测试要以查找错误为中心,而不是为了演示软件的正确功能。但是仅凭字面意思理解这一观点可能会产生误导,认为发现错误是软件测试的唯一目,查找不出错误的测试就是没有价值的,事实并非如此。首先,测试并不仅仅是为了要找出错误。通过分析错误产生的原因和错误的分布特征,可以帮助工程管理者发现当前所采用的软件过程的缺陷,以便改进。同时,这种分析也能帮助我们设计出有针对性地检测方法,改善测试的有效性。其次,没有发现错误的测试也是有价值的,完整的测试是评定测试质量的一种方法。7总结和展望本系统较完整的实现了基于Android的俄罗斯方块游戏系统的设计与实现根本功能。完成了根本的俄罗斯游戏控制功能。从本系统的开发过程中,我受益匪浅。首先,我认识到了代码标准的重要性,特别是在一些大型工程中,用到的函数可能有数百个,如果编写的代码不标准会给后期的检查带来极大的麻烦。而且完整的代码测试也非常重要,有些错误可能在很久以后才能发现。其次,我意识到了软件设计的重要性,原来接触的工程往往是快速开发类型的,几乎不需要在软件的逻辑设计上花费太多时间,往往可以边开发边进行下一步的设计。但是这一次我意识到做软件设计很重要,当初一个设计没注意,可能造成后来的编码大面积的返工。最后就是调试方法的重要性,系统的调试过程要比开发过程繁琐的多。每个操作、每次向效劳器提交请求,其实都包括了很多小段代码的执行,如果不能够采用正确的调试方法,就很难找出程序中的错误。系统开发过程中主要遇到了以下问题:忽略了每次向效劳器提交请求后客户端页面都将重新加载的情况,以致无法将预期的数据提交到效劳器。与当今市场上已有的系统相比,本系统没有做到像它们一样适合各种各样的用户,而只是适合小型企业用户,适用范围较为局限,这是本系统的有待改进之处。结束语这次毕业设计的时间虽然不算太长,但使我对很多东西有了更深刻的认识。总结如下:·查阅资料和阅读相关文献的重要性。·向老师和同学请教的重要性。·勤动手的重要性,在以前我总是有“只学不练〞的倾向,导致动手能力得不到提高,在这次的一次次编写代码、调试代码的过程中,我才明白“代码不是写出来的,是调出来的〞的道理。·对待任何事情都要有耐心和恒心,遇到问题要冷静地思考,积极找出症结所在,逐个解决。转眼本科生阶段就要划上句号了。通过这次毕业设计,我更深刻的认识到了教学实践在大学课程中的重要性,同时也觉察到了自己在学习方面存在的缺乏之处,在以后的学习中我会努力改进这些缺乏、不断提高自己的动手实践能力。如果想让本系统应用起来,可能功能还有所欠缺,还有待完善,有些功能还没有实现,可能本系统还达不到商业的水平。但是毕竟是一个毕业设计,时间和本人的知识面都很有限,不过我相信只要不断地锻炼自己的实际开发能力及动手能力,积极的吸收最新技术,不断摸索不断改进,不断发现问题,解决问题,那么一切困难都会将会迎刃而解,系统功能肯定可以更完善,稳定性可以跟好,效率可以更高的。致谢毕业设计终于完成了,想起过去的几个月里,首先我要地感谢我的导师吴许俊老师,在这几个月中对我的悉心关心和指导才让我如此顺利的完成了毕业设计。在我论文写作期间给予我许多珍贵的意见和建议。在设计之初我对IPv6过渡技术是不懂的,但他仍给我们认真和耐心的讲解,从实验的配置到完成都是他陪着我们度过的。他作风严谨、学识渊博、兢兢业业和一丝不苟的态度让我深有感触。在此,我向他表示崇高的敬意和衷心的感谢。其次,我要衷心感谢和我一个组的其他同学,正是有他们的帮助和指导才使我能够顺利的完成设计。在我大学期间我也要感谢我的同学,他们不但是我学习的朋友,更是我生活上伴我风雨同舟的同伴。只有有了这么多的老师和同学的帮助才能帮我完成毕业论文才能给我人生中最重要四年一个圆满的结局。最后,我要感谢我的父母,这么年来他们一直给我鼓励和支持。参考文献[1]刘仙艳;移动终端开放平台—Android[J];信息通信技术;2023(4)[2]张仕成;基于GoogleAndroid平台的应用程序开发与研究[J];电脑知识与技术;2023(5);59-62[3]公磊,周聪;基于Android的移动终端应用程序开发与研究[J];计算机与现代化;2023(8);85-89[4]ShaneConder;AndroidWirelessApplicationDevelopment[M];Boston:Addison-Wesley,2023[5]HasemanChris;AndroidEssentials[M];Apress:theExpert’sVoice;2023[6]杨丰富;Android应用开发揭秘[M];北京:机械工业出版社;2023[7]张利国,代闻,龚海平;Android移动开发案例详解[M];北京:人民邮电出版社;2023[8]叶达峰;Eclipse编程技术与实例[M];北京:人民邮电出版社;2006[9]ShaneCondor,LaurenDecry;Android移动应用开发从入门到精通[M];北京:人民邮电出版社;2023[10]马越;Android的架构与应用[D];北京:中国地质大学(北京)硕士学位论文;2023:9-20附录packagecom.miebo.android.tetris.activity;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.Properties;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.os.Message;importandroid.util.Log;importandroid.view.KeyEvent;importandroid.view.View;importcom.miebo.android.tetris.other.Court;importcom.miebo.android.tetris.other.DrawTool;importcom.miebo.android.tetris.other.ResourceStore;publicclassTetrisViewextendsViewimplementsRunnable{ publicfinalstaticintSCREEN_WIDTH=320; publicfinalstaticintSCREEN_HEIGHT=455; finalintSTATE_MENU=0; finalintSTATE_PLAY=1; finalintSTATE_PAUSE=2; finalintSTATE_OVER=3; publicstaticfinalintMAX_LEVEL=6; publicstaticfinalStringTAG="TetrisView"; publicstaticfinalStringDATAFILE="save.dt"; intmGamestate=STATE_PLAY; intmScore=0; intmSpeed=1; intmDeLine=0; booleanmIsCombo=false;// booleanmIsPaused=false; booleanmIsVoice=true; longmMoveDelay=600; longmLastMove=0; //intmAtPause=OPTION_RESUME; privateContextmContext=null; privatefinalPaintmPaint=newPaint(); RefreshHandlermRefreshHandler=null; //RefreshHandlermRefreshHandler=null; TileViewmCurrentTile=null; TileViewmNextTile=null; CourtmCourt=null; ResourceStoremResourceStore=null; MusicPlayermMPlayer=null; publicTetrisView(Contextcontext){ super(context); init(context); } protectedvoidinit(Contextcontext){ mContext=context; mCurrentTile=newTileView(context); Log.i("tetris","mCurrentTilebuiled"); mNextTile=newTileView(context); mCourt=newCourt(context); mRefreshHandler=newRefreshHandler(this); mResourceStore=newResourceStore(context); mMPlayer=newMusicPlayer(context); setLevel(1); mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); setFocusable(true); newThread(this).start(); } publicvoidlogic(){ switch(mGamestate){ caseSTATE_MENU: // mGamestate=STATE_PLAY; break; caseSTATE_PLAY: //startGame(); playGame(); break; caseSTATE_PAUSE: //if(mAtPause==OPTION_RESUME) //{ //mIsPaused=false; //mGamestate=STATE_PLAY; //break; //} //if(mPusedChoose=) break; caseSTATE_OVER: //startGame(); //mGamestate=STATE_PLAY; break; default: } } publicvoidstartGame(){ mGamestate=STATE_PLAY; mCourt.clearCourt(); mCurrentTile=newTileView(mContext); mNextTile=newTileView(mContext); //mSpeed=speedchoosed //mScore //mLine setLevel(1); mScore=0; mDeLine=0; mIsPaused=false; mIsCombo=false; playGame(); } publicvoidplayGame(){ longnow=System.currentTimeMillis(); if(now-mLastMove>mMoveDelay){ if(mIsPaused){ return; } if(mIsCombo){ mCourt.placeTile(mCurrentTile); ////// mMPlayer.playMoveVoice(); if(mCourt.isGameOver()){ mGamestate=STATE_OVER; return; } intline=mCourt.removeLines(); if(line>0){ mMPlayer.playBombVoice(); } mDeLine+=line; countScore(line); mCurrentTile=mNextTile; mNextTile=newTileView(mContext); mIsCombo=false; } moveDown(); mLastMove=now; } } privatevoidcountScore(intline){ switch(line){ case1: mScore+=100; break; case2: mScore+=300; break; case3: mScore+=600; break; case4: mScore+=1000; break; default: } if(mScore>=2000&&mScore<4000){ setLevel(2); }elseif(mScore>=4000&&mScore<6000){ setLevel(3); }elseif(mScore>=6000&&mScore<8000){ setLevel(4); }elseif(mScore>=8000&&mScore<10000){ setLevel(5); }elseif(mScore>=10000){ setLevel(6); } } @Override protectedvoidonDraw(Canvascanvas){ switch(mGamestate){ caseSTATE_MENU: paintMenu(canvas); break; caseSTATE_PLAY: paintGame(canvas); break; caseSTATE_PAUSE: paintPause(canvas); break; caseSTATE_OVER: paintOver(canvas); break; default: } } publicbooleanisGameOver(){ returnmCourt.isGameOver(); } @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){ switch(keyCode){ caseKeyEvent.KEYCODE_DPAD_UP: if(mGamestate==STATE_PLAY){ if(!mIsPaused){ rotate(); mMPlayer.playMoveVoice(); } }elseif(mGamestate==STATE_PAUSE){ }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_DPAD_DOWN: if(mGamestate==STATE_PLAY){ if(!mIsPaused){ moveDown(); mMPlayer.playMoveVoice(); } }elseif(mGamestate==STATE_PAUSE){ }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_DPAD_LEFT: if(mGamestate==STATE_PLAY){ if(!mIsPaused){ moveLeft(); mMPlayer.playMoveVoice(); } }elseif(mGamestate==STATE_PAUSE){ }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_DPAD_RIGHT: if(mGamestate==STATE_PLAY){ if(!mIsPaused){ moveRight(); mMPlayer.playMoveVoice(); } }elseif(mGamestate==STATE_PAUSE){ }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_ENTER: caseKeyEvent.KEYCODE_DPAD_CENTER: if(mGamestate==STATE_PLAY){ if(!mIsPaused){ fastDrop(); mMPlayer.playMoveVoice(); } }elseif(mGamestate==STATE_PAUSE){ }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_S: if(mGamestate==STATE_PLAY){ mIsPaused=true; }elseif(mGamestate==STATE_PAUSE){ mIsPaused=false; }elseif(mGamestate==STATE_MENU){ } break; caseKeyEvent.KEYCODE_SPACE: mIsPaused=!mIsPaused; if(mIsPaused){ mRefreshHandler.pause(); }else{ mRefreshHandler.resume(); } break; default: ; } returnsuper.onKeyDown(keyCode,event); } privatevoidrotate(){ //check if(!mIsCombo) mCurrentTile.rotateOnCourt(mCourt); } privatevoidmoveDown(){ if(!mIsCombo){ if(!mCurrentTile.moveDownOnCourt(mCourt)) mIsCombo=true; } } privatevoidmoveLeft(){ if(!mIsCombo){ mCurrentTile.moveLeftOnCourt(mCourt); } } privatevoidmoveRight(){ if(!mIsCombo){ mCurrentTile.moveRightOnCourt(mCourt); } } privatevoidfastDrop(){ if(!mIsCombo){ mCurrentTile.fastDropOnCourt(mCourt); mIsCombo=true; } } privatevoidpaintMenu(Canvascanvas){ /* *DrawTool.paintImage(canvas,mResourceStore.getMenuBackground(),0, *0);DrawTool.paintImage(canvas,mResourceStore.getMenu(),0, *SCREEN_HEIGHT/2-mResourceStore.getMenu().getHeight()/2); */ } privatevoidpaintGame(Canvascanvas){ mCourt.paintCourt(canvas); mCurrentTile.paintTile(canvas); //mNextTile.paintTile(canvas); mPaint.setTextSize(20); paintNextTile(canvas); paintSpeed(canvas); paintScore(canvas); paintDeLine(canvas); } privatevoidpaintNextTile(Canvascanvas){ inti,j; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(mNextTile.mTile[i][j]!=0){ DrawTool.paintImage( canvas, mResourceStore.getBlock(mNextTile.getColor()-1), (int)(Court.BEGIN_DRAW_X +getBlockDistance(Court.COURT_WIDTH)+getBlockDistance((float)(i+0.5))), (int)(getBlockDistance((float)(j+0.5)))); } } } } privatevoidpaintSpeed(Canvascanvas){ mPaint.setColor(Color.BLUE); canvas.drawText("等级:",getBlockDistance(Court.COURT_WIDTH) +getRightMarginToCourt(),getBlockDistance(9),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mSpeed), getBlockDistance(Court.COURT_WIDTH)+2 *getRightMarginToCourt(),getBlockDistance(11),mPaint); } privatevoidpaintScore(Canvascanvas){ mPaint.setColor(Color.BLUE); canvas.drawText("得分:",getBlockDistance(Court.COURT_WIDTH) +getRightMarginToCourt(),getBlockDistance(13),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mScore), getBlockDistance(Court.COURT_WIDTH)+2 *getRightMarginToCourt(),getBlockDistance(15),mPaint); } privatevoidpaintDeLine(Canvascanvas){ mPaint.setColor(Color.BLUE); canvas.drawText("消去行数:",getBlockDistance(Court.COURT_WIDTH) +getRightMarginToCourt(),getBlockDistance(17),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mDeLine), getBlockDistance(Court.COURT_WIDTH)+2 *getRightMarginToCourt(),getBlockDistance(19),mPaint); } privatefloatgetBlockDistance(floatblockNum){ returnblockNum*Court.BLOCK_WIDTH; } privatefloatgetRightMarginToCourt(){ return(float)10.0; } privatevoidpaintPause(Canvascanvas){ } privatevoidpaintOver(Canvascanvas){ paintGame(canvas); Paintpaint=newPaint(); paint.setTextSize(40); paint.setAntiAlias(true); paint.setARGB(0xe0,0xff,0x00,0x00); canvas.drawText("GameOver",getBlockDistance(1), getBlockDistance(Court.COURT_HEIGHT/2-2),paint); //DrawTool.paintImage(canvas,mResourceStore.getGameover(),0,SCREEN_HEIGHT/2 //-mResourceStore.getGameover().getHeight()/2); } @Override publicvoidrun(){ //TODOAuto-generatedmethodstub while(!Thread.currentThread().isInterrupted()){ Messagems=newMessage(); ms.what=RefreshHandler.MESSAGE_REFRESH; this.mRefreshHandler.sendMessage(ms); try{ Thread.sleep(/*RefreshHandler.DELAY_MILLIS*/mMoveDelay); }catch(InterruptedExceptione){ Thread.currentThread().interrupt(); } } } publicvoidsetLevel(intlevel){ mSpeed=level; mMoveDelay=(long)(600*(1.0-mSpeed/7.0)); } publicvoidsetVoice(booleanisVoice){ mIsVoice=isVoice; mMPlayer.setMute(!mIsVoice); } publicvoidrestoreGame(){ Propertiespro=newProperties(); try{ FileInputStreamin=mContext.openFileInput(DATAFILE); pro.load(in); in.close(); }catch(IOExceptione){ Log.i(TAG,"fileopenfailedinrestoreGame()"); return; } mGamestate=Integer.valueOf(pro.get("gamestate").toString()); mSpeed=Integer.valueOf(pro.get("speed").toString()); setLevel(mSpeed); mScore=Integer.valueOf(pro.get("score").toString()); mDeLine=Integer.valueOf(pr

温馨提示

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

评论

0/150

提交评论