资源描述
-中国矿业大学计算机学院2013 级本科生课程报告课程名称 软件测试 报告时间 2016年7月 学生*李龙 学 号08133202 专 业 计算机科学与技术 任课教师评语任课教师评语对课程根底理论的掌握;对课程知识应用能力的评价;对课程报告相关实验、作品、软件等成果的评价;课程学习态度和上课纪律;课程成果和报告工作量;总体评价和成绩;存在问题等:成 绩: 任课教师签字:2016 年 6 月 25日摘 要本课题是设计开发一款小游戏,由于本人知识的有限,以及客观条件的限制,本人打算开发一个单机版的游戏。本人在手机上玩过贪吃蛇的游戏,曾经为了和别人比赛,苦苦的玩了好屡次,追求高分!后来得知这个小小的游戏是nokia当年很成功的一款手机游戏,许多人都玩过,也很喜欢。现在这款游戏的版本已经开展到第三版了,手机生产厂商继续开发这个游戏,看来这个游戏还是有很大的市场的。Google公司2007年11月5日发布的开源的Android平台一款包括操作系统基于Linu*内核、中间件和关键应用的手机平台,并组建了开放手机联盟(OpenHandsetAlliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业。于是,我决定利用自己大学所学的知识,独立开发这个小游戏。重首先说明了这个贪吃蛇程序所用到的一些类和控件,包括Drawable,Canvas,Thread,等等。介绍了这些类的一般的使用方法,以及本程序是如何使用这些类来进展游戏的开发的。本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供给用软件。这些都将能很好的满足未来人们对手机游戏的需求。吞吃蛇游戏基于Android平台编写,满足一般手机用户的娱乐需求。关键词:Android系统;贪食蛇游戏;手机游戏ABSTRACT.ThistopicisusingjavalanguageontheAndroidplatformmobilephonegamedevelopment,Ilimitedknowledge,andobjectiveconstraints,Iintendtodevelopastand-alonegame.IplayedthegameofSnake,onthephoneonceinordertomatchwithothers,strugglingtoplaymanytimes,thepursuitofhighscores!Laterlearnedthatthislittlegamenokiawasverysuccessfulmobilephonegames,manypeoplehaveplayed,andalsoenjoyed.Versionofthegamehasbeendevelopedtothethirdedition,mobilephonemanufacturerscontinuetodevelopthisgame,itseemsthatthisgameisagreatmarket.Open-sourceAndroidplatform,GooglesreleasedonNovember5,2007-anoperatingsystem(Linu*kernel),middlewareandkeyapplications-basedmobilephoneplatform,andtheformationoftheOpenHandsetAlliance(OpenHandsetAlliance),includingGoogle,ChinaMobile,T-Mobile,HTC,Qualm,MotorolaandotherleadingenterprisesSo,Idecidedtousetheknowledgelearnedinhiscollege,intheinstructorshelp,theindependentdevelopmentofthisgame.Thisarticlefirstdetailssomeofthebasicjavaknowledge,onthisbasisleadstoAndroid,thebasisoftheAndroidanditscharacteristics,andthenintroducestheAndroidfutureprospectsanddevelopment.HighlightsthisSnakeproceduresusedandcontrols,includingtheDrawableCanvas,Thread,andsoon.Describesthegeneraluse,aswellastheprogramishowtousetheseclassestothedevelopmentofthegame.Theagesoftheclassicworkstransplantationinthisprogramtothephoneup,toprovideapplicationsoftwareforthemorepopularhardwareplatforms.Thesewillbewellpositionedtomeetfuturedemandformobilegames.DevourthesnakegamebasedontheAndroidplatform,preparedtomeettheentertainmentneedsofthegeneralmobilephoneusers.Keywords:Androidsystem;Gluttonysnakegame;Mobilegame目录1 背景1.1研究背景随着社会的开展,人们生活的步调日益加快,越来越多的人参加了全球化的世界。人们不再拘泥于一块天地,加班,出差成了现代人不可防止的公务。而此时一款可以随时随地娱乐的游戏成了必需品。贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人。这一款游戏紧紧地抓住了人们的心理,虽然简单,却其乐无穷,在人们不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具1。当前科学技术飞速开展,特别是微电子技术,计算机软件与应用技术的开展,使得人们的日常生活丰富多彩。单片微型计算机(简称单片机)作为微型计算机家族的一员,以其独特的构造,良好的稳定性,廉价的价格在嵌入式领域广泛应用。与传统的PC上设计的贪吃蛇游戏不同,本次作者利用Android平台,java语言编程,实现便携地贪吃蛇游戏1.2工程目的与意义1.2.1开发目的自2007年Google发布Android系统1.0之后,各大手机生产厂商纷纷将目光投向了最具开展潜力的Android系统,并陆续推出了各种品牌的搭载Android系统的智能手机。时隔四年,Android手机在手机市场中占的市场份额正以非常迅猛的速度上升:2010年市场份额:Symbian36.6%、Android25.5%、iPhone16.7、windowsMobile2.8%、linu*2.1%。Nokia的Symbian系统在Android系统的冲击下,正在从手机市场中的王者慢慢被挤下来。在未来的几年内,Android手机必定会占据手机市场的主要份额,所以在这种形式下,Android应用的前景也必定是前景一片大好。1.2.2开发意义现如今,电子商品的硬件支持越来越高端。人们对手机的功能要求不再仅仅局限于接和打了,在这些根本功能的根底上,手机更成了人们日常生活中非常重要的娱乐和休闲工具。许多时候人们都会处于无聊的状态,比方等车的时候、坐长途车的时候.这时假设有一款有意思的游戏来打发时间是再好不过了。由于Android手机具有多任务功能,可以一边听音乐一边玩游戏,是让人们在等车的时候玩上一玩消磨时间的好东东。1.3 手机游戏国内外现状和开展趋势1.3.1 手机游戏国内外现状近年来,网路尤其是无线通信网络在国内迅速普及,网络游戏也得到了高速开展。同样手机的普及,使得手机游戏市场空前开展。国内外巨大的手机使用量,也让商家看到了新的商机,手机游戏市场利润将会十分的丰厚。面对潜力巨大的手机游戏市场,各大游戏开发商、运营商、效劳商以及手机终端厂商等都开场准备应对措施,以便抢占更多的手机市场分额。Nokia、索爱、三星等各大手机厂商开场不断的提升手机的游戏性能,同时采用开放式的手机操作系统,方便用户能够享受到不同的游戏业务4。而国内游戏开发商,如盛大、腾讯、网易等公司,纷纷跻身手机游戏开发商行列。新浪、搜狐等著名的门户,也纷纷涉足手机游戏领域,相继开辟了各自的手机游戏相关栏目,其他一些游戏也都加快了手机游戏开发的脚步。现阶段国内的手机游戏还局限于小型单机游戏和简单的卡牌类网络游戏,而国外已经开场致力于开发能够依靠GPRS定位,或者用户佩戴辅助器械的大型手机游戏。1.3.2 手机游戏的开展趋势每个人都可以随时随地玩手机游戏,虽然手机游戏的价格不贵,但它的使用量巨大,也因此带来巨大的商业价值。手机游戏具有娱乐性和趣味性,而且它的操作简单,易与掌握,是人们日常生活中不可或缺的娱乐方式。伴随着3G、4G时代的到来,手机上网逐渐普及,上网资费进一步下调,使用手机进展娱乐互动的消费者越来越多。随着移动快捷支付系统日趋成熟和盈利模式的逐渐明朗,随着资本对于手机游戏市场的关切,随着业界内各个环节逐渐完善与壮大,手机游戏必将会迎来一个新的开展顶峰6。高科技游戏曾经是任天堂、索尼和微软三足鼎立的天下,由于智能手机的兴起,手机游戏的开展在短短2年里就超越了掌上机及电脑游戏。Pop Cap Games公司针对2500名英美成年人所做的调查显示,有一半以上的受访者至少玩过一次手机游戏。大量平价游戏、更为简化的游戏技术,大大降低了用户玩手机游戏的门槛,在中国手机游戏几乎都是免费下载的。撇开平价手机游戏所带来的商业影响不谈,游戏开发商认为手机游戏其实蕴藏着无限开展机遇。智能手机用户是移动行业中数量增长最快的用户,手机游戏公司们最近的表现也同样势不可挡。操作简易,内容简单的游戏是小型手机游戏的主打产品,但随着电子技术的开展,手机硬件性能的不断提升,手机电池容量更大续航时间更久,以及手机外设的开发,手机游戏也向着流畅舒服的操作,内容丰富的大型游戏制作方向开展。开发大型手机游戏不仅能开拓新的市场,新的商机和利润,也能给用户带来操作、视觉的双重享受。贪吃蛇作为一款操作简单的单机类游戏,在竞争剧烈的手机游戏领域中,近些年来也得到了充分的开展。Nokia在其WP7手机上推出了疯狂贪吃蛇Crazy Snake,虽然操作简单,画面简单,但游戏体验早就不简单了,是一款不能错过的游戏7。Snake的开发商*IMAD又推出了宝石贪吃蛇游戏,这款名为Snake的游戏将贪吃蛇的画面水平推向了一个新的高度。Snake无论是游戏画面还是游戏可玩度都非一般的贪吃蛇游戏所能比较的。在这款游戏中,你的贪吃蛇将会在地下收集文物,但是要及时的避开各种障碍物,以通过各种关卡,获取积分。不仅如此,贪吃蛇游戏还开展出了3D贪吃蛇,现在正在开发的GPRS定位通过用户走动控制的贪吃蛇游戏,将会把贪吃蛇推向新的高度。2方案论证2.1经济可行性分析本系统开发经费并不是很多。个人或者团队都可以按相应时间完成根本功能。假设在根本功能上进而实现界面的美化,则还需要更好的美术人员协助实现。投入:除软件开发本钱外,需要一台安装Windows操作系统和Android虚拟机的中等以上电脑,一部中等配置的装有Android2.3或以上的Android手机。2.2技术可行性分析2.2.1Android平台特性(1)支持组件的重用与替换。意味着我们可以把系统中不喜欢的应用程序换掉,安装我们自己喜欢的程序。(2)Dalvik虚拟机专门为移动设备做了优化。将class文件通过D*工具转换成后缀为.de*的文件来执。Dalvik虚拟机基于存放器,比java虚拟机快。(3)内部集成浏览器基于开源的WebKit引擎。(4)优化的2D和3D图形库。(5)SQLite数据库,用于构造化的数据存储。(6)支持各种多媒体格式:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF。(7)GSM全球通。(8)蓝牙、Wifi无线网络、EDGE(GSM到3G的过渡)。(9)照相机、GPS、指南针和加速度计。(10)丰富的开发环境包括设备模拟器,调式工具,内存及性能分析表和Eclipse集成开发环境插件。Google提供了Android开发包SDK,其中包含大量的类库和开发工具。2.2.2Android应用程序组件如前所述,Android运行在Linu*内核上。Android应用程序是用Java编程语言编写的,它们在一个虚拟机VM中运行。需要注意的是,这个VM并非您想象中的JVM,而是DalvikVirtualMachine,这是一种开源技术。每个Android应用程序都在DalvikVM的一个实例中运行,这个实例驻留在一个由Linu*内核管理的进程中,如以下图2-1所示。如图2-1Android应用程序由一个或多个组件组成。1.活动Activity具有可视UI的应用程序是用活动实现的。当用户从主屏幕或应用程序启动器选择一个应用程序时,就会开场一个动作。2.效劳(Service)效劳应该用于任何需要持续较长时间的应用程序,例如网络监视器或更新检查应用程序。3.内容提供程序(ContentProvider)可以将内容提供程序看作数据库效劳器。内容提供程序的任务是管理对持久数据的访问,例如SQLite数据库。如果应用程序非常简单,则可能不需要创立内容提供程序。如果要构建一个较大的应用程序,或者构建需要为多个活动或应用程序提供数据的应用程序,则可以使用内容提供程序实现数据访问。4.播送接收器(BroadcastReceiver)Android应用程序可用于处理一个数据元素,或者对一个事件例如接收文本消息做出响应。5.视图ViewView是Android中图形用户界面的基类,提供了可视化界面展示。Android的图形界面分为三层:底层是Activity;Activity上面是Window;Window上面是Views。View又可以分为View和ViewGroup。View是根本控件,ViewGroup是布局控件。6.信使IntentIntent是不同组件之间相互导航的纽带,封装了不同组件导航查找的条件。Android应用程序是连同一个AndroidManifest.*ml文件一起部署到设备的。AndroidManifest.*ml包含必要的配置信息,以便将它适当地安装到设备。它包括必需的类名和应用程序能够处理的事件类型,以及运行应用程序所需的许可。例如,如果应用程序需要访问网络例如为了下载一个文件则manifest文件中必须显式地列出该许可。很多应用程序可能启用了这个特定的许可。这种声明式平安性有助于减少恶意应用程序损害设备的可能性。2.4开发工具及环境简介2.4.1开发工具Eclipse简介Eclipse是一个开放源代码的、与NetBeans、Sun ONE Studio Borlanduilder类似的一种基于Java的整合型可扩展开发平台,也是目前最著名的开源工程之一,Eclipse附带了一个标准的插件集,包括Java开发工具JavaDevelopmentTools,JDT。其未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系构造,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。目前,Eclipse已经开场提供C语言开发的功能插件。更难能可贵的是,Eclipse是一个开放源代码的工程,任何人都可以下载Eclipse的源代码,并且在此根底上开发自己的功能插件。也就是说未来只要有人需要,就会有在Eclipse之上COBOL,Perl,Python等语言的开发插件出现。同时可以通过开发新的插件扩展现有插件的功能,可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。Eclipse的主要组成。Eclipse是一个开放源代码的软件开发工程,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse工程、Eclipse工具工程和Eclipse技术工程三个工程组成,具体包括四个局部组成EclipsePlatform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,EclipsePlatform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的根底。EclipseSDK软件开发者包是EclipsePlatform、JDT和PDE所生产的组件合并,它们可以一次下载。这些局部在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到EclipsePlatform中的工具。EclipseSDK由Eclipse工程生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse工程生产的软件以CPL发布,第三方组件有各自自身的许可协议。2.4.2开发环境简介本工程在windows*P操作系统上进展开发,Google为开发者提供了SDK(SoftwareDevelopmentKit)。AndroidSDK的下载地址为development.Android./inde*.html。因为本工程的开发工具是Eclipse,所以还需要安装ADT(AndroidDevelopmentTools)插件。具体安装步骤就不在本文中介绍了。第二章 游戏开发2.1需求分析需求分析工作是软件生存周期中重要的一步,也是起决定性的一步。通过它可以全面了解整个系统的功能和性能方面的要求,为软件设计打下坚实的根底。该局部的目标主要有:获得目标系统的物理模型,了解目标系统是如何运行的;抽象出目标系统的逻辑模型,对物理模型进展筛选,得到与软件系统有关的局部;建立目标系统的逻辑模型,得出数据流图和数据字典;补充目标系统的逻辑模型,对目标系统的用户界面,至今尚未考虑的细节进展说明。本系统主要是完成贪吃蛇游戏的根本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求。(1)利用方向键来改变蛇的运行方向。(2)吃到食物就变成新的蛇体,碰到壁或自身则游戏完毕,否则正常运行2.2系统开发目标采用基于Android的程序设计技术,以及用Eclipse开发Android程序的相关技术开发出具有良好用户界面,操作简单易学,游戏功能齐全且有益于智力开发的贪吃蛇游戏。3.游戏筹划3.1系统需求分析业务需求分析虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的.因为它的特殊在于它能吸引人更深入,爱不释手.随着游戏速度不断加快,其刺激性也更强.可以说该游戏的优势在于它的简单易行,不管是手机,还是小游戏机,都能很快顺利的运行.对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的,这样的小游戏刚好迎合了他们的需求。手机贪吃蛇游戏基于JAVA平台编写,采用Android技术开发的一款手机游戏。手机游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,假设有丝毫的差异都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。JAVA是基于虚拟机的半解释型编译系统,其执行效率较C+等完全编译后的程序会低很多,程序如果不进展精简和优化,将可能导致运行的不流畅。2.3.2用户需求分析游戏开发成功后,最终用户为各个年龄段的人群,用户*围相当广泛。但是用户对软件产品也有一定的要求。1.简单易学时间不管对于谁来说都是珍贵的,用户不会愿意花大量时间去学习使用一款软件。一款软件如果操作界面不友好,让用户难以上手使用,那就说明这款软件开发得不够成功,从而失去大量的用户。所以本工程必须拥有良好的交互界面,让用户安装之后就能进展游戏。2.运行稳定一款软件设计得不够好,则就有可能在运行的时候出现一些不可预料的错误从而造成软件崩溃。如果用户正在游戏突然软件崩溃了,无疑会让用户感到非常不舒服,有可能就把软件给卸载了,这样也会失去很多用户。3.操作简便用户不是程序员,他们不知道程序的内部逻辑。所以程序员必须提供给用户便捷的操作接口来供用户操作,灵活便捷的操作性直接影响了一款软件的好坏。3.2.3功能需求分析本工程是一个运行在Android手机上的游戏,所以在应该实现以下功能。1.响应键盘事件玩家可以从手机键盘或者触屏开场游戏,操控游戏。2.绘制游戏图形界面玩家开场游戏后,在手机屏幕上绘制出一条初始由7个节点组成小蛇。蛇能够在屏幕上移动,屏幕上随机位置出现食物,当蛇吃到食物后蛇的身体会增长一截同时移动速度也会响应加快。蛇不能向相反方向移动,例如蛇头朝南时则不能向北移动。当蛇头碰到墙壁或者碰到自己的身体时游戏完毕。3.记录玩家分数当游戏完毕后,显示玩家在游戏中所获得的分数。4游戏设计4.1程序流程设计本游戏的流程如以下图4-1所示。开场初始化界面和蛇身放置食物蛇开场运动蛇吃到食蛇长大蛇死亡继续续退出界面NNYNY游戏者按键选择Y如图4-14.2概要设计4.2.1模块划分从面向对象程序设计的角度,本工程总体可以分为游戏界面模块、数据存储模块和控制模块。如以下图4-2所示。如图4-24.2.2游戏主界面模块游戏界面主框架主要包括游戏图形区域界面、游戏的开场按钮、暂停按钮、游戏的退出按钮。游戏界面主框架的主要构造图如图4-3所示。如图4-34.2.3游戏控制模块游戏控制模块主要通过手机键盘上的按钮来控制游戏的开场、游戏的退出这两个功能以及控制游戏分数变化。在这个模块中,需要给各个按钮添加响应事件代码,来对上述的功能加以进一步的实现。游戏控制模块的主要框架如图4-4所示。如图4-44.3模块实现原理4.3.1游戏界面模块实现1.实现游戏背景本游戏采用Activity作为游戏背景的载体,在Android中一个Activity就相当于windows中的一个窗口,Activity上可以放置许多类型的控件。一个activity主要有三个状态。当在屏幕前台时位于当前任务堆栈的顶部,它是活泼或运行的状态。它就是相应用户操作的activity。当它失去焦点但仍然对用户可见时,它处于暂停状态。即是:在它之上有另外一个activity。这个activity也许是透明的,或者未能完全遮蔽全屏,所以被暂停的activity仍对用户可见。暂停的activity仍然是存活状态它保存着所有的状态和成员信息并连接至窗口管理器,但当系统处于极低内存的情况下,仍然可以杀死这个activity。如果它完全被另一个activity覆盖是,它处于停顿状态。它仍然保存所有的状态和成员信息。然而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个activity。如果一个activity处于暂停或停顿状态,系统可以通过要求它完毕调用它的finish()方法或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。当一个activity从这个状态转变到另一个状态时,它被以以下protected方法所通知。voidonCreate(BundlesavedInstanceState)、voidonStart()、voidonRestart()、voidonResume()、voidonPause()、voidonStop()、voidonDestroy()2.实现蛇的身体蛇可以看做是一个个节点组成的,因此可以用一个链表来存储蛇身的元素,在画蛇时遍历这个链表讲里面的元素一一画出,这样就实现了一条蛇。3.实现蛇的移动用一个timer(定时器)来不断地刷新游戏画面,每刷新一次就再蛇头的前面(链表的尾部)增加一个新元素,同时把蛇尾的一个元素删掉,这样从视觉上看起来就实现了蛇的移动。4.实现蛇吃食物蛇移动的过程中如果蛇头的坐标与食物出现的坐标重合了,则就在蛇头的位置增加一个元素同时不删除蛇尾的最后一个元素,这样蛇每迟到一个食物身体就会变长一截。4.3.2游戏控制模块实现1.实现操作蛇的移动方向在Android系统中,手机上的每个按钮都会有一个对应的键值跟它对应,所在可以给对应的按钮设置监听器OnClickListener,监听器是一个接口,该接口中有一个方法onClick(Viewv)。当按钮被点击的时候系统会自动调用该监听器的onClick(Viewv)方法。所以实现游戏控制的具体代码将被写到该方法中。因为本游戏中不允许蛇向与蛇头相反的方向移动,所以当用户操作时需要判断用户操作的方向是不是跟规则冲突,假设冲突则无视该操作,假设不冲突则响应该操作,所以需要用一个变量来记录蛇头的当前方向。2.实现游戏暂停在Activity的生命周期中,有一个onPause()方法.该方法在Activity变得不可见的时候被系统自动调用.在玩游戏过程中,如果有来电或是其它事件中断,这时应该把当前状态保存。以便返回时,还可以继续玩游戏。这就使用onSaveInstanceState实现保存当前状态。3.实现游戏恢复Activity生命周期的onResume()方法.该方法在Activity从不可见的状态下变得可见时被系统自动调用.在用户接完或者在暂停状态下触摸屏幕后可以在该生命周期方法中对游戏进展恢复。4.实现游戏退出当一个Activity退出或者被调用finish()方法后,系统会调用其生命周期方法onDestroy().当用户退出游戏时,可以在这个方法中对资源进展释放。4.3.3TileView类的设计TileView是游戏的界限,即蛇头假设触碰到界限则游戏完毕。因为界限也需要被现实到屏幕上,所以TileView需要继承Android.view.View类。Android.view.View类是描绘块状视图的基类。View会绘制一个包含Drawing是event事件的方形块。View是所有与用户交互的组件的Widgets的基类(Buttons,te*tField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。实现一个View,首先需要实现框架中一些所有Views公用的方法。不必重写所有所有的方法,可以仅仅重写onDraw(Android.graphics.Canvas)。4.3.4SnakeView类的设计SnakeView是本游戏的业务逻辑类,该类中包含了游戏数据和一些处理数据的方法以及一些内部类。SnakeView的方法摘要。1.判断按键的方法在Android手机上,每个按键都会有一个唯一的键值与它对应,可以通过获得键值来判断哪个键被按下了并采取相应的动作。2.设置提示信息的方法通过程序判断动态地设置用户提示信息,如游戏完毕。3.在随机位置出现食物的方法通过随机数在屏幕*围内随机出现一个食物,但是不允许同一时刻有两个食物存在。4.刷新蛇的当前位置的方法主要用于刷新蛇的当前位置。5.判断蛇是否吃到食物的方法因为食物和蛇都会有一个坐标,所以可以通过判断蛇头坐标是否跟食物坐标相等的方法来判断蛇是否吃到了食物。4.4程序主构造本次所设计贪吃蛇游戏的程序主构造如图4-5所示。如图4-54.5程序类图该程序由以下三个类实现,分别为TileView,Snake,SnakeView。各个类之间的关系及所包括的方法如图4-6所示。4.6 详细代码4.6.1 Snake类的详细设计Snake类是蛇头以及蛇头的控制局部,包括判断newDirection和oldDirection是否为相反方向,用于选取有效方向。判断蛇头是否和蛇身的*个节点的坐标重合,即蛇是否吃到自己。实现蛇身沿着蛇头的轨迹移动。根据方向键,改变蛇头的*、y的值,即改变方向。以及让蛇不停走动。Snake.javapublic class TileView e*tends View /* * Parameters controlling the size of the tiles and their range within view. * Width/Height are in pi*els, and Drawables will be scaled to fit to these * dimensions. */Y Tile Counts are the number of tiles that will be drawn. */protected static int mTileSize; / tileprotected static int m*TileCount;/ *tileprotected static int mYTileCount;private static int m*Offset;/ private static int mYOffset;/* * A hash that maps integer handles specified by the subclasser to the * drawable that will be used for that reference */private Bitmap mTileArray;/ tile顣tilebitmapmTileArray1bitmap/* * A two-dimensional array of integers in which the number represents the * inde* of the tile that should be drawn at that locations */private int mTileGrid;/ tile顣int11=0int12=1/ private final Paint mPaint = new Paint();/ public TileView(Conte*t conte*t, AttributeSet attrs, int defStyle) super(conte*t, attrs, defStyle);/ TypeArraygooglegoogle飬TypedArray a = conte*t.obtainStyledAttributes(attrs, R.styleable.TileView);mTileSize = a.getInt(R.styleable.TileView_tileSize, 12); a.recycle(); public TileView(Conte*t conte*t, AttributeSet attrs) super(conte*t, attrs); TypedArray a = conte*t.obtainStyledAttributes(attrs, R.styleable.TileView);mTileSize = a.getInt(R.styleable.TileView_tileSize, 12); a.recycle(); /* * Rests the internal array of Bitmaps used for drawing tiles, and sets the * ma*imum inde* of tiles to be inserted * * param tilecount*/public void resetTiles(int tilecount) mTileArray = new Bitmaptilecount; / viewview0layoutviewOverrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) m*TileCount = (int) Math.floor(w / mTileSize);mYTileCount = (int) Math.floor(h / mTileSize);m*Offset = (w - (mTileSize * m*TileCount) / 2);mYOffset = (h - (mTileSize * mYTileCount) / 2);mTileGrid = new intm*TileCountmYTileCount; clearTiles(); /* * Function to set the specified Drawable as the tile for a particular * integer key. * * param key* param tile* Keytiletiledrawablebitmap*/public void loadTile(int key, Drawable tile) Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); tile.setBounds(0, 0, mTileSize, mTileSize); tile.draw(canvas);mTileArraykey = bitmap; /* * Resets all tiles to 0 (empty) * */public void clearTiles() for (int * = 0; * m*TileCount; *+) for (int y = 0; y mYTileCount; y+) setTile(0, *, y); /* * Used to indicate that a particular tile (set with loadTile and referenced * by an integer) should be drawn at the given */y coordinates during the * ne*t invalidate/draw cycle. * * param tileinde* param * param y* tiletileinde*mTileArrayinde* */public void setTile(int tileinde*, int *, int y) mTileGrid*y = tileinde*; / tiletiledrawcanvasOverridepublic void onDraw(Canvas canvas) super.onDraw(canvas);for (int * = 0; * m*TileCount; * += 1) for (int y = 0; y 0) canvas.drawBitmap(mTileArraymTileGrid*y, m*Offset + * * mTileSize, mYOffset + y * mTileSize, mPaint); 4.6.2 TileView类的详细设计TileView是游戏的界限,即蛇头假设触碰到界限则游戏完毕。因为界限也需要被现实到屏幕上,所以TileView需要继承Android.view.View类。Android.view.View类是描绘块状视图的基类。View会绘制一个包含Drawing是event事件的方形块。View是所有与用户交互的组件的Widgets的基类(Buttons,te*tField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。实现一个View,首先需要实现框架中一些所有Views公用的方法。不必重写所有所有的方法,可以仅仅重写。TileView.Javapublic class TileView e*tends View /* * Parameters controlling the size of the tiles and their range within view. * Width/Height are in pi*els, and Drawables will be scaled to fit to these * dimensions. */Y Tile Counts are the number of tiles that will be drawn. */protected static int mTileSize; / tileprotected static int m*TileCount;/ *tileprotected static int mYTileCount;private static int m*Offset;/ private static int mYOffset;/* * A hash that maps integer handles specified by the subclasser to the * drawable that will be used for that reference */private Bitmap mTileArray;/ tile顣tilebitmapmTileArray1bitmap/* * A two-dimensional array of integers in which the number represents the * inde* of the tile that should be drawn at that locations */private int mTileGrid;/ tile顣int11=0int12=1/ private final Paint mPaint = new Paint();/ public TileView(Conte*t conte*t, AttributeSet attrs, int defStyle) super(conte*t, attrs, defStyle);/ TypeArraygooglegoogle飬TypedArray a = conte*t.obtainStyledAttributes(attrs, R.styleable.TileView);mTileSize = a.getInt(R.styleable.TileView_tileSize, 12); a.recycle(); public TileView(Conte*t conte*t, AttributeSet attrs) super(conte*t, attrs); TypedArray a = conte*t.obtainStyledAttributes(attrs, R.styleable.TileView);mTileSize = a.getInt(R.styleable.TileView_tileSize, 12); a.recycle(); /* * Rests the internal array of Bitmaps used for drawing tiles, and sets the * ma*imum inde* of tiles to be inserted * * param tilecount*/public void resetTiles(int tilecount) mTileArray = new Bitmaptilecount; / viewview0layoutviewOverrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) m*TileCount = (int) Math.floor(w / mTileSize);mYTileCount = (int) Math.floor(h / mTileSize);m*Offset = (w - (mTileSize * m*TileCount) / 2);mYOffset = (h - (mTileSize * mYTileCount) / 2);mTileGrid = new intm*TileCountmYTileCount; clearTiles(); /* * Function to set the specified Drawable as the tile for a particular * integer key. * * param key* param tile* Keytiletiledrawablebitmap*/public void loadTile(int key, Drawable tile) Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); tile.setBounds(0, 0, mTileSize, mTileSize); tile.draw(canvas);mTileArraykey = bitmap; /* * Resets all tiles to 0 (empty) * */public void clearTiles() for (int * = 0; * m*TileCount; *+) for (int y = 0; y mYTileCount; y+) setTile(0, *, y); /* * Used to indicate that a particular tile (set with loadTile a
展开阅读全文