基于Android平台的“贪食蛇”游戏的设计和实现_第1页
基于Android平台的“贪食蛇”游戏的设计和实现_第2页
基于Android平台的“贪食蛇”游戏的设计和实现_第3页
基于Android平台的“贪食蛇”游戏的设计和实现_第4页
基于Android平台的“贪食蛇”游戏的设计和实现_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGEPAGE1贵阳学院本科毕业设计基于Android平台的“贪食蛇”游戏的设计和实现摘要 Google公司2007年11月5日发布的开源的Android平台——一款包括操作系统(基于Linux内核)、中间件和关键应用的手机平台,并组建了开放手机联盟(OpenHandsetAlliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业。本课题是利用java语言在Android平台上进行手机游戏的开发,由于本人知识的有限,以及客观条件的限制,本人打算开发一个单机版的游戏。本人在手机上玩过贪吃蛇的游戏,曾经为了和别人比赛,苦苦的玩了好多次,追求高分!后来得知这个小小的游戏是nokia当年很成功的一款手机游戏,许多人都玩过,也很喜欢。现在这款游戏的版本已经发展到第三版了,手机生产厂商继续开发这个游戏,看来这个游戏还是有很大的市场的。于是,我决定利用自己大学所学的知识,自己在指导老师的帮助下,独立开发这个小游戏。本文首先详细介绍了java的一些基本的知识点,在此基础上引出了Android,介绍了Android的基础以及其特点,然后介绍了一下Android将来的一些前景和发展。重点说明了这个贪吃蛇程序所用到的一些类和控件,包括Drawable,Canvas,Thread,等等。介绍了这些类的一般的使用方法,以及本程序是如何使用这些类来进行游戏的开发的。关键词:Android系统;贪食蛇游戏;目录PAGE80第一章导论 随着移动通信的发展以及互联网向移动终端的普及,网络和用户对移动终端的要求越来越高,而Symbian,WindowsMobile,PalmOS等手机平台过于封闭,不能很好的满足用户的需求,因此市场迫切需要一个开放性很强的平台。经过多年的发展,第三代数字通信(3G)技术获得了广泛的接受,它为移动终端用户带来了更快的数据传输速率。随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。Google为此于2007年11月推出了一个专为移动设备设计的软件平台——Android。Android是一套真正意义上的开放性的移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android是由Linux+Java构成的开源软件,允许所有厂商和个人在其基础上进行开发。Android平台的开放性等特点既能促进技术(包括平台自身)的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定自己的特色化的产品。因此,它具有很大的市场发展潜力。1.1Android简介1.1.1Android的发展 Android一词本意是指"机器人",同时也指Google于2007年11月5日推出的开源手机操作系统。Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。它是由一个由30多家科技公司和手机公司组成的开放手机联盟共同研发,将大大降低新型手机设备的研发成本,完全整合的全移动功能性产品成为"开放手机联盟"的最终目标。Android作为谷歌移动互联网战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现。全球为数众多的移动电话用户从未使用过任何基Android的电话。谷歌的目标是让移动通讯不依赖于设备,甚至是平台。出于这个目的,Android将完善,而不是会替代谷歌长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。Android平台的研发队伍阵容强大,包括Google、HTC(宏达电)、T-Mobile、高通、摩托罗拉、三星、LG以及中国移动在内的30多家企业都将基于该平台开发手机的新型业务,应用之间的通用性和互联性将在最大程度上得到保持。"开放手机联盟"表示,Android平台可以促使移动设备的创新,让用户体验到最优越的移动服务。同时,开发商也将得到一个新的开放级别,更方便地进行协同合作,从而保障新型移动设备的研发速度。因此Android是第一个完整、开放、免费的手机平台。1.1.2Android系统的特点Android系统具有如下4个特点:一、开放性Google与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达电和T-Mobile在内的30多家技术和无线应用的领军企业组成。Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。二、应用程序无界限Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可供其他应用程序使用。应用程序是在平等的条件下创建的,所以移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件;应用程序可以轻松地嵌入HTML、Javascript和样式表。应用程序可以通过WebView显示网络内容。三、应用程序可以并行运行Android是一种完整的多任务环境,其中应用程序可以并行运行。在后台运行时,应用程序可以生成通知以引起注意。四、智能虚拟键盘虚拟键盘的出现意味着基于Android1.5的移动设备可以同时支持物理键盘和虚拟键盘。不同的输入方式可满足用户在特定场景的需求。Android虚拟键盘可以在任何的应用中提供,包括Gmail、浏览器、SMS,当然也包括大量的第三方应用。它包括自动校正、推荐、习惯文字的用户词典。你可以通过振动屏幕来进行触觉反馈。不同于竞争对手的手机平台,Android1.5还支持第三方虚拟键盘应用的安装。1.1.3Android的系统架构 Android的系统架构如图1-1所示:图1-1Android系统架构图从图1.0可以看出Android分为4层,从高到底分别是应用层、应用框架层、系统运行库层和linux核心层。应用层应用层是用Java语言编写的运行在虚拟机上的程序,即图中最上层的蓝色部分。我们编写的所有应用软件都属于应用层。应用框架层这一层即是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则。系统运行库(C/C++库以及Android运行库)层当我们使用Android应用框架时,Android系统会通过一些C/C++库来支持对我们使用的各个组件,使其能更好地为开发者服务。Linux内核层Android的核心系统服务基于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于Linux2.6内核。Linux内核同时也作为硬件和软件栈之间的抽象层。1.2 项目简介本项目在Android平台下,使用java语言、Android开发技术、SQLite数据库开发技术开发一款界面友好,功能齐全的贪食蛇游戏。贪食蛇是一款老牌的手机游戏,同时也是一款比较需要耐心的游戏,用游戏控制方向键上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,更不能咬自己的尾巴,当蛇头碰到墙或者自己的身体则游戏结束。1.3项目背景与意义1.3.1开发背景自2007年Google发布Android系统1.0之后,各大手机生产厂商纷纷将目光投向了最具发展潜力的Android系统,并陆续推出了各种品牌的搭载Android系统的智能手机。时隔四年,Android手机在手机市场中占的市场份额正以非常迅猛的速度上升:2010年市场份额:Symbian36.6%、Android25.5%、iPhone16.7、windowsMobile2.8%、linux2.1%。Nokia的Symbian系统在Android系统的冲击下,正在从手机市场中的王者慢慢被挤下来。在未来的几年内,Android手机必定会占据手机市场的主要份额,所以在这种形式下,Android应用的前景也必定是前景一片大好。

1.3.2开发意义现如今,电子商品的硬件支持越来越高端。人们对手机的功能要求不再仅仅局限于接电话和打电话了,在这些基本功能的基础上,手机更成了人们日常生活中非常重要的娱乐和休闲工具。许多时候人们都会处于无聊的状态,比如等车的时候、坐长途车的时候...这时若有一款有意思的游戏来打发时间是再好不过了。由于android手机具有多任务功能,可以一边听音乐一边玩游戏,是让人们在等车的时候玩上一玩消磨时间的好东东。1.4国内外现状分析1.4.1国内外手机系统现状目前国外各软硬件厂商已经推出过多款手机操作系统。下面简单介绍一下现主流手机操作系统。现阶段使用较广泛大家也相对熟悉的手机操作系统是由诺基亚公司主导推出的Symbian操作系统。Symbian是为手机而设计的操作系统,它是一个实时性,多任务的纯32位嵌入式的操作系统,具有低能耗,内存占用较少等特点。现在流行的Symbian系统有以下四个版本,分别为S40、S60(第二版)、S60(第三版)、S60(第五版)。S60(第五版)为触摸屏手机版本。iOS是由苹果公司为iPhone开发的操作系统。它主要是给iPhone、iPodtouch以及iPad使用。就像其基于的MacOSX操作系统一样,它也是以Darwin为基础的。iOS的系统架构分为四个层次:核心操作系统层(theCoreOSlayer),核心服务层(theCoreServiceslayer),媒体层(theMedialayer),可轻触层(theCocoaTouchlayer)。系统操作占用大概240MB的存储器空间WindowsMobile系列操作系统是从微软计算机的Windows操作系统演化而来的。WindowsMobile系列操作系统功能强大,而且支持该操作系统的智能手机大多数都采用了英特尔嵌入式处理器,主频比较高,在其它硬件配置(如内存、储存卡容量等)上也比采用其它操作系统的智能手机要高出许多,因此性能比较强劲,速度比较快。PalmOS属于Palm公司开发,是一种32位的嵌入式操作系统,是一套专门为掌上电脑编写的操作系统,是一种轻量级、比较开放的操作系统,占用的内存非常小。现在多用Paml公司生产的手机上。该系统允许用户在其基础上编写和修改相关软件,使支持的应用程序更加丰富多彩。Palm系统与其他手机系统相比在其它方面也还存在一些不足,如Palm操作系统本身不具有录音、MP3播放功能等,但是可以通过加入第三方软件或硬件设备来实现。相对国外手机系统百花齐放的局面,国内手机操作系统则处于刚起步的阶段。目前国内还没有自主研发并商品化的手机操作系统。当然近些年来国内企业和我国政府在这方也投入了大量的人力和物力。同时也取得了一定成果。在2009年8月,由中国移动所主导开发OPhone平台面世。OPhone平台采用开源的Linux作为系统内核,借鉴并兼容Android平台,集成灵活高效的Java应用框架,充分借鉴当下主流手机操作系统所具有的良好用户体验,提供了一套完整的电话解决方案和各类移动数据业务解决方案。1.4.2国内外手机应用现状随着3G在中国的全面启动,它所带来的巨大机遇和新生力量,大规模的网络建设正不断深入展开。但不可否认的是我国在通信领域中相比许多发达国家仍然存在着不小的差距,就在国人还在为EDGE这种传输速度仅能达到384KB/秒的2.75G过渡技术而欣喜的时候,国外早已开始试行HSDPA这种3.5G技术,传输速度更可达到惊人的数兆每秒,而基于其上所开发的延伸功能更是数不胜数,所以国内外手机应用也存在的较大的差异。但国内外对手机应用的需求方向是大致相似的,主要集中在信息服务,娱乐,学习这些方面。目前国内外手机应用服务方向主要有基于地理位置的信息服务(LocationBasedServiceLBS)它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在GIS(GeographicInformationSystem,地理信息系统)平台的支持下,为用户提供相应服务的一种增值业务。例如手机定位,导航服务。近年来十分热门的网络社交服务(SocialNetworkingServices)也已进入到手机客户端领域。例如国内有名的社交网站人人网已经针对Iphone,android,塞班等手机平台推出了手机客户端。国外最大的社交Fackbook也已经传出正在进行针对手机的产品的研发。Twiter,Myspace等国外知名社交类网站都已经推出手机版。国内淘宝网旗下口碑网在今年也已经推出针对多个手机平台的客户端程序。MSN,QQ等即时通信类的应用也已经在各个主流手机平台推出。手机办公类软件在手机上也正日趋完善,在手机上编辑查看各类文档已经实现,在android平台上的QuickOffice就是这样的软件。在GoogleMarket(一个谷歌针对android系统用户所开发的应用商场)上已经有过万的企业应用办公套件。手机娱乐游戏类应用,该类应用作为传统类手机应用,在各个平台上发展已近相对完善,手机上对各种流媒体的播放也已完美的支持。各类传统PC游戏厂商进入手机领域。1.4.3发展趋势随着3G应用的不断开发推广,用户会越来越需要更加个性化、优质化的多媒体数据服务,用户希望能够随时、随地无缝利用3G网络进行办公、网上交易、游戏娱乐、欣赏影视节目、收听和下载音乐等。根据观察,在不久的将来,移动手机终端将会在以下若干方面具有新的发展。首先,提供智能提醒服务,手机能够与用户实现密切配合,并监控用户的个性化设置(保持在本地或者云端),当重要时间点或关键事物需要用户注意时,手机会向用户发出“提醒”服务,服务包括日程提醒、交通状况、最佳行车路线、最佳泊位、优惠活动、实时新闻、体育赛事、天气情况、股市行情、好友活动、亲友生日等。其次,提供虚拟现实体验,手机可以借助传感器、周边设备了解到您的身边环境,并根据收集到的信息,智能的为您提供有用的信息,如在网络世界养的宠物,可以借助音频设备表达叫声,借助马达和位置传感器等传递其跳、跃等行为信息;也可以在用户购物时,提供相关的同类产品价格参考,提醒用户附近的那个卖场更物美价廉;根据实际场景,为用户及时提供正在操控的产品的使用方法提醒。接着,发挥物联网的优势,借助无处不在的传感器,可以感知并分享到周围世界的海量信息,这些信息将在“云端”得到整合,帮助用户及时、准确的获得气息信息、交通路况。另外借助物联网,用户间可以方便、快速的分享资源,协助和交互。如进行端到端的多人游戏、照片分享、书籍分享、音乐分享等。然后,作为经济工具,在交通或者信息不发达的情况下,帮助用户找到最佳的市场,获得有价值的帮助信息,帮助用户从事的经济活动的收益率。最后,更加智能、安全的设备,随着智能手机的不断普及和更加智能,手机软件的更新、升级将会变得越发简单,并会为用户提供工具或信息,让用户有能力和权力决策那些内容可以浏览、下载或分享。在安全性上也将更加出色,能够十分有效的帮助用户进行获取到的内容的管理,保护用户的个人隐私和基于手机的金融活动如电子钱包、在线支付、在线贸易等。第二章系统的开发方法及相关技术2.1软件工程的定义软件工程是一类求解软件的工程,它应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法,创建软件以达到提高质量、降低成本的目的。其中,计算机科学、数学用于构造模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。软件工程是一门指导计算机软件开发和维护的工程学科。2.2软件工程的模型软件工程的模型是软件开发全部过程、活动和任务的结构框架。

瀑布模型内容及特点:

瀑布模型将软件生存周期的各项活动规定为依固定顺序连接的软干阶段工作,是一种线性模型。各阶段活动为,提出系统需求、提出软件需求、需求分析、设计、编码、测试和运行。每个开发阶段具有以下特征,从上一阶段接受本阶段工作的对象作为输入,对上述输入实施本阶段的活动,给出本阶段的工作成果作为输出传入下一阶段,对本阶段工作进行评审,若本阶段工作得到确认,则继续下阶段工作,否则返回前一阶段甚至更前阶段。瀑布模型最为突出的缺点是该模型缺乏灵活性。

演化模型内容及特点:

演化模型主要针对事先不能完整定义需求的软件开发,其开发过程一般是首先开发核心系统,当核心系统投入运行后,软件开发人员根据用户的反馈,实施开发的迭代过程,每一迭代过程均由需求、设计、编码、测试、集成等阶段组成,直到软件开发结束。演化模型在一定程度上减少了软件开发活动的盲目性。

螺旋模型内容及特点:

它是在瀑布模型和演化模型的基础上,加入两者所忽略的风险分析所建立的一种软件开发模型。沿螺旋模型顺时针方向,依次表达了四个方面的活动,制定计划、风险分析、实施工程、客户评估。

喷泉模型内容及特点:

它体现了软件创建所固有的迭代和无间隙特征,喷泉模型主要用于支持面向对象开发过程。

增量模型内容:

在设计了软件系统整体体系结构之后,首先完整的开发系统的一个初始子集,继之,根据这一子集,建造一个更加精细的版本,如此不断的进行系统的增量开发。

瀑布模型、演化模型、螺旋模型之间的联系:相同点是这三个模型都分为多个阶段,而瀑布模型一次完成软件,演化模型分为多次完成,每次迭代完成软件的一个部分,螺旋模型也分为多次完成,每次完成软件的一个新原型,并考虑风险分析。2.3本项目的研究方法2.3.1本项目采用的开发模型本系统的开发严格遵守软件工程开发的标准流程。实地考察,进行需求分析,书写需求分析表和初步的软件说明书。在模块设计的同时进行单元测试,系统设计完成进行系统调试和系统集成测试。设计完成后,编写完整的软件说明书和用户手册,最后还需写对自己所作设计的评价和总结。经过对各个软件工程的模型的分析,我决定使用瀑布模型进行开发。因为本系统的开发人员仅为我一人,非小组合作,在对各个阶段的交接上,只能按顺序进行,完成上一阶段后才能进行下一阶段的工作。我的整个软件开发流程如图:

图2.1Androida贪食蛇游戏开发流程2.3.2本项目的开发方法经过深入分析,本项目使用面向对象方式开发是比较好的开发方式。面向对象的软件技术以对象(Object)为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(表示对象的动态行为),封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。

面向对象的设计方法与传统的面向过程的方法有本质不同,这种方法的基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而不强调算法,它鼓励开发者在软件开发的绝大部分过程中都用应用领域的概念去思考。在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都围绕着建立问题领域的对象模型来进行:对问题领域进行自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。

传统的软件开发过程可以用“瀑布”模型来描述,这种方法强调自顶向下按部就班地完成软件开发工作。事实上,人们认识客观世界解决现实问题的过程,是一个渐进的过程,人的认识需要在继承以前的有关知识的基础上,经过多次反复才能逐步深化。在人的认识深化过程中,既包括了从一般到特殊的演绎思维过程,也包括了从特殊到一般的归纳思维过程。人在认识和解决复杂问题时使用的最强有力的思维工具是抽象,也就是在处理复杂对象时,为了达到某个分析目的集中研究对象的与此目的有关的实质,忽略该对象的那些与此目的无关的部分。面向对象方法学的出发点和基本原则,就是分析、设计和实现一个软件系统的方法和过程.尽可能接近人们认识世界解决问题的方法和过程,也就是使描述问题的问题空间和描述解法的解空间在结构上尽可能一致。也可以说,面向对象方法学的基本原则,是按照人们习惯的思维方式建立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。面向对象的软件系统中广泛使用的对象,是对客观世界中实体的抽象,对象实际上是抽象数据类型的实例,提供了理想的数据抽象机制,同时又具有良好的过程抽象机制(通过发消息使用公有成员函数)。对象类是对一组相似对象的抽象,类等级中上层的类是对下层类的抽象。因此,面向对象的环境提供了强有力的抽象机制,便于人在利用计算机软件系统解决复杂问题时使用习惯的抽象思维工具。此外,面向对象方法学中普遍进行的对象分类过程,支持从特殊到一般的归纳思维过程;面向对象方法学中通过建立类等级而获得的继承特性,支持从一般到特殊的演绎思维过程。

面向对象的软件技术为开发者提供了随着对某个应用系统的认识逐步深入和具体化的过程,而逐步设计和实现该系统的可能性,因为可以先设计出由抽象类构成的系统框架,随着认识深入和具体化再逐步派生出更具体的派生类。这样的开发过程符合人们认识客观世界解决复杂问题时逐步深化的渐进过程。

2.4开发工具及环境简介2.4.1开发工具eclipse简介Eclipse是一个开放源代码的、与NetBeans、SunONEStudio和BorlandJbuilder类似的一种基于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,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。EclipsePlatform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。EclipseSDK(软件开发者包)是EclipsePlatform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到EclipsePlatform中的工具。EclipseSDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以CPL发布,第三方组件有各自自身的许可协议。2.4.2开发环境简介本项目在windowsXP操作系统上进行开发,Google为开发者提供了SDK(SoftwareDevelopmentKit)。AndroidSDK的下载地址为:/index.html;因为本项目的开发工具是eclipse,所以还需要安装ADT(AndroidDevelopmentTools)插件。具体安装步骤就不在本文中介绍了。第三章需求分析需求分析工作是软件生存周期中重要的一步,也是起决定性的一步。通过它可以全面了解整个系统的功能和性能方面的要求,为软件设计打下坚实的基础。该部分的目标主要有:获得目标系统的物理模型,了解目标系统是如何运行的;抽象出目标系统的逻辑模型,对物理模型进行筛选,得到与软件系统有关的部分;建立目标系统的逻辑模型,得出数据流图和数据字典;补充目标系统的逻辑模型,对目标系统的用户界面,至今尚未考虑的细节进行说明。3.1系统开发目标采用基于Android的程序设计技术,以及用eclipse开发Android程序的相关技术开发出具有良好用户界面,操作简单易学,游戏功能齐全且有益于智力开发的贪吃蛇游戏。3.2系统需求分析3.2.1业务需求分析虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的.因为它的特殊在于它能吸引人更深入,爱不释手.随着游戏速度不断加快,其刺激性也更强.可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行.对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的,这样的小游戏刚好迎合了他们的需求.手机贪吃蛇游戏基于JAVA平台编写,采用Android技术开发的一款手机游戏。手机游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。JAVA是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。3.2.2用户需求分析本项目中用户的需求如下图所示:游戏用例图游戏开发成功后,最终用户为各个年龄段的人群,用户范围相当广泛。但是用户对软件产品也有一定的要求:简单易学时间不管对于谁来说都是宝贵的,用户不会愿意花大量时间去学习使用一款软件。一款软件如果操作界面不友好,让用户难以上手使用,那就说明这款软件开发得不够成功,从而失去大量的用户。所以本项目必须拥有良好的交互界面,让用户安装之后就能进行游戏。运行稳定一款软件设计得不够好,那么就有可能在运行的时候出现一些不可预料的错误从而造成软件崩溃。如果用户正在游戏突然软件崩溃了,无疑会让用户感到非常不舒服,有可能就把软件给卸载了,这样也会失去很多用户。操作简便用户不是程序员,他们不知道程序的内部逻辑。所以程序员必须提供给用户便捷的操作接口来供用户操作,灵活便捷的操作性直接影响了一款软件的好坏。软件是做给用户使用的,所以一切都要站在用户的角度来看问题。3.2.3功能需求分析本项目是一个运行在Android手机上的游戏,所以在应该实现以下功能:响应键盘事件玩家可以从手机键盘或者触屏开始游戏,操控游戏,暂停游戏,结束游戏;绘制游戏图形界面玩家开始游戏后,在手机屏幕上绘制出一条初始由7个节点组成小蛇。蛇能够在屏幕上移动,屏幕上随机位置出现食物,当蛇吃到食物后蛇的身体会增长一截同时移动速度也会响应加快。蛇不能向相反方向移动,例如蛇头朝南时则不能向北移动。当蛇头碰到墙壁或者碰到自己的身体时游戏结束。3.记录玩家分数当游戏结束后,显示并保存玩家在游戏中所获得的分数。概要设计4.1程序流程设计本游戏的流程如下图所示:触摸屏幕游戏开始,触摸屏幕游戏开始,蛇开始移动键盘操作:向上左移右移向下没有吃到食物且蛇碰到边界游戏结束游戏中途欲中断,稍后继续游戏触摸屏幕暂停游戏游戏暂停进入游戏画面再次触摸屏幕游戏恢复图4.1游戏处理流程图4.2模块设计4.2.1模块划分从面向对象程序设计的角度,本项目总体地可以分为游戏界面模块、数据存储模块和控制模块。如下图所示:游戏数据存储模块贪吃蛇游戏游戏主界面模块游戏控制模块游戏数据存储模块贪吃蛇游戏游戏主界面模块游戏控制模块图4.2游戏总设计模块4.2.2游戏主界面模块游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮。游戏界面主框架的主要结构图如图4.3所示。游戏的主界面架游戏的主界面架游戏图形区域界面(即游戏画布)游戏控制按钮界面图4.3游戏主界面4.2.3游戏控制模块游戏控制模块主要通过手机键盘上的按钮来控制游戏的开始、游戏的暂停、游戏的退出这三个功能以及控制游戏分数变化。在这个模块中,需要给各个按钮添加响应事件代码,来对上述的功能加以进一步的实现。游戏控制模块的主要框架如图4.4所示。游戏控制模块游戏控制模块游戏的移动速度功能能游戏的暂停功能游戏的重新开始图4.4游戏控制模块框架4.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()实现蛇的身体蛇可以看做是一个个节点组成的,因此可以用一个链表来存储蛇身的元素,在画蛇时遍历这个链表讲里面的元素一一画出,这样就实现了一条蛇.实现蛇的移动用一个timer(定时器)来不断地刷新游戏画面,每刷新一次就再蛇头的前面(链表的尾部)增加一个新元素,同时把蛇尾的一个元素删掉,这样从视觉上看起来就实现了蛇的移动.实现蛇吃食物 蛇移动的过程中如果蛇头的坐标与食物出现的坐标重合了,那么就在蛇头的位置增加一个元素同时不删除蛇尾的最后一个元素,这样蛇每迟到一个食物 身体就会变长一截.4.3.2游戏控制模块实现实现操作蛇的移动方向在Android系统中,手机上的每个按钮都会有一个对应的键值跟它对应,所在可以给对应的按钮设置监听器OnClickListener,监听器是一个接口,该接口中有一个方法onClick(Viewv)。当按钮被点击的时候系统会自动调用该监听器的onClick(Viewv)方法。所以实现游戏控制的具体代码将被写到该方法中。因为本游戏中不允许蛇向与蛇头相反的方向移动,所以当用户操作时需要判断用户操作的方向是不是跟规则冲突,若冲突则无视该操作,若不冲突则响应该操作,所以需要用一个变量来记录蛇头的当前方向。实现游戏暂停在Activity的生命周期中,有一个onPause()方法.该方法在Activity变得不可 见的时候被系统自动调用.在玩游戏过程中,如果有来电或是其它事件中断, 这时应该把当前状态保存。以便返回时,还可以继续玩游戏。这就使用 onSaveInstanceState实现保存当前状态。实现游戏恢复Activity生命周期的onResume()方法.该方法在Activity从不可见的状态下变得可见时被系统自动调用.在用户接完电话或者在暂停状态下触摸屏幕后可以在该生命周期方法中对游戏进行恢复.实现游戏退出当一个Activity退出或者被调用finish()方法后,系统会调用其生命周期方法onDestroy().当用户退出游戏时,可以在这个方法中对资源进行释放.4.3.3数据存储模块实现 在Android系统中数据的存储是使用SQLite数据库来实现的,SQLite是一款轻型的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。在SQLite中创建一张表,表的结构如下表所示:字段名类型意义playervarchar玩家名字scoreint玩家分数该表用来存放玩家数据。第五章 详细设计5.1游戏类图本游戏的类图如下:图5.1游戏类图5.2游戏界面具体实现5.2.1蛇身、食物和墙的实现前面已经提过,蛇身的数据用一个链表来存储,具体我使用ArrayList来实现。蛇身的每个元素、食物和墙都是一个坐标对象,画这些东西的时候只需要把它们的坐标传给画的方法就行了。这里需要引进一个坐标类Coordinate,这是一个包括两个参数,用于记录X轴和Y轴简单类,其中包括一个比较方法,该方法用于判断蛇头于食物或者墙是否重合.该类的代码如下:classCoordinate{publicintx;publicinty;publicCoordinate(intnewX,intnewY){x=newX;y=newY;}publicbooleanequals(Coordinateother){if(x==other.x&&y==other.y){returntrue;}returnfalse;}@OverridepublicStringtoString(){return"Coordinate:["+x+","+y+"]";}}蛇身的初始长度我设置为5,new5个Coordinate的对象放入ArrayList中。整个屏幕可以看做是有很多个网格组成的,而蛇就在这些网格中移动。用一个二维数组int[][]mTileGrid来存储网格的坐标,将蛇身、食物或者墙的坐标传到该数组中,onDraw方法按照该数组中的坐标将屏幕相应位置的网格填充成位图。画蛇身、食物、墙的方法为:@OverridepublicvoidonDraw(Canvascanvas){super.onDraw(canvas);for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){if(mTileGrid[x][y]>0){canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset+x*mTileSize, mYOffset+y*mTileSize, mPaint);}}}}5.2.2蛇移动的实现5.2.3处理键盘事件使用View类的onKeyDown方法,该方法由系统监听调用。根据按键的值处理响应事件,该方法中解决了反向移动的问题。mDirection为当前蛇头的方向,mNextDirection为按键对应的方向,按键按下后会先判断当前方向是否跟下一方向相反,若相反则不响应事件。具体代码如下:@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventmsg){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){if(mMode==READY|mMode==LOSE){/**Atthebeginningofthegame,ortheendofapreviousone,*weshouldstartanewgame.*/initNewGame();setMode(RUNNING);update();return(true);}if(mMode==PAUSE){/**Ifthegameismerelypaused,weshouldjustcontinuewhere*weleftoff.*/setMode(RUNNING);update();return(true);}if(mDirection!=SOUTH){mNextDirection=NORTH;}return(true);}if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){if(mDirection!=NORTH){mNextDirection=SOUTH;}return(true);}if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){if(mDirection!=EAST){mNextDirection=WEST;}return(true);}if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){if(mDirection!=WEST){mNextDirection=EAST;}return(true);}returnsuper.onKeyDown(keyCode,msg);}if((direction!=currentDirection)&&!needUpdate){//取出列表中的最后一个元素(蛇的头部)WormLinksl=(WormLink)worm.lastElement();intx=sl.getEndX();inty=sl.getEndY();//不同的运动方向坐标的改变也不一样switch(direction){caseUP://当这段向上运动的时候if(currentDirection!=DOWN){y--;needUpdate=true;}break;caseDOWN://当这段向下运动的时候if(currentDirection!=UP){y++;needUpdate=true;}break;caseLEFT://当这段向左运动的时候if(currentDirection!=RIGHT){x--;needUpdate=true;}break;caseRIGHT://当这段向右运动的时候if(currentDirection!=LEFT){x++;needUpdate=true;}break;}//当更改方向后需要更新if(needUpdate==true){worm.addElement(newWormLink(x,y,0,direction));currentDirection=direction;}}3.1.3 TileView类的设计TileView是游戏的界限,即蛇头若触碰到界限则游戏结束。因为界限也需要被现实到屏幕上,所以TileView需要继承android.view.View类。android.view.View类是描绘块状视图的基类。View会绘制一个包含Drawing是event事件的方形块。View是所有与用户交互的组件的Widgets的基类(Buttons,textField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。实现一个View,首先需要实现框架中一些所有Views公用的方法。不必重写所有所有的方法,可以仅仅重写onDraw(android.graphics.Canvas)

3.1.4 SnakeView类的设计SnakeView是本游戏的业务逻辑类,该类中包含了游戏数据和一些处理数据的方法以及一些内部类。SnakeView的方法摘要:判断按键的方法在Android手机上,每个按键都会有一个唯一的键值与它对应,可以通过获得键值来判断哪个键被按下了并采取相应的动作。设置提示信息的方法通过程序判断动态地设置用户提示信息,如游戏结束。在随机位置出现食物的方法通过随机数在屏幕范围内随机出现一个食物,但是不允许同一时刻有两个食物存在。刷新蛇的当前位置的方法主要用于刷新蛇的当前位置判断蛇是否吃到食物的方法因为食物和蛇都会有一个坐标,所以可以通过判断蛇头坐标是否跟食物坐标相等的方法来判断蛇是否吃到了食物。3.1.5 RefreshHandler类的设计RefreshHandler类需要处理是否需要重绘Snake,所以需要继承继承android.os.Handler类。Handler类允许你发送和处理和当前MessageQueue相关的Message类和Runnable类。每一个Handler类都和一个唯一的线程(以及这个线程的MessageQueue)关联。当你创建一个新的Handler类的时候,它就和创建它的Thread/MessageQueue绑定,也就是说这个Handler类会向它所关联的MessageQueue递送Messages/Runnables并且在该Message/Runnable从MessageQueue出列时候执行它。在这里我用来调度可能会被执行的Messages和Runnables。4.1程序主结构本次所设计贪吃蛇游戏的程序主结构如图4-1所示。初始化初始化进入事件等待状态初始化失败不正常退出开始请求相关事件返回暂停请求退出正常退出图4-1贪吃蛇程序主结构4.2 程序类图4.3 类的详细设计4.3.1 Snake类的详细设计Snake类的详细代码如下:packagecom.heima.android.snake;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.TextView;publicclassSnakeextendsActivity{privateSnakeViewmSnakeView;privatestaticStringICICLE_KEY="snake-view";@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.snake_layout);mSnakeView=(SnakeView)findViewById(R.id.snake);mSnakeView.setTextView((TextView)findViewById(R.id.text));if(savedInstanceState==null){mSnakeView.setMode(SnakeView.READY);}else{Bundlemap=savedInstanceState.getBundle(ICICLE_KEY);if(map!=null){mSnakeView.restoreState(map);}else{mSnakeView.setMode(SnakeView.PAUSE);}}}@OverrideprotectedvoidonPause(){super.onPause();mSnakeView.setMode(SnakeView.PAUSE);}@OverridepublicvoidonSaveInstanceState(BundleoutState){outState.putBundle(ICICLE_KEY,mSnakeView.saveState());}}4.3.2 TileView类的详细设计TileView类的代码如下:packagecom.heima.android.snake;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.Bitmap;importandroid.graphics.Canvas;importandroid.graphics.Paint;importandroid.graphics.drawable.Drawable;importandroid.util.AttributeSet;importandroid.view.View;publicclassTileViewextendsView{protectedstaticintmTileSize;protectedstaticintmXTileCount;protectedstaticintmYTileCount;privatestaticintmXOffset;privatestaticintmYOffset;privateBitmap[]mTileArray;privateint[][]mTileGrid;privatefinalPaintmPaint=newPaint();publicTileView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.TileView);mTileSize=a.getInt(R.styleable.TileView_tileSize,12);a.recycle();}publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs);TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.TileView);mTileSize=a.getInt(R.styleable.TileView_tileSize,12);a.recycle();}publicvoidresetTiles(inttilecount){ mTileArray=newBitmap[tilecount];}@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){mXTileCount=(int)Math.floor(w/mTileSize);mYTileCount=(int)Math.floor(h/mTileSize);mXOffset=((w-(mTileSize*mXTileCount))/2);mYOffset=((h-(mTileSize*mYTileCount))/2);mTileGrid=newint[mXTileCount][mYTileCount];clearTiles();}publicvoidloadTile(intkey,Drawabletile){Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888);Canvascanvas=newCanvas(bitmap);tile.setBounds(0,0,mTileSize,mTileSize);tile.draw(canvas);mTileArray[key]=bitmap;}publicvoidclearTiles(){for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){setTile(0,x,y);}}}publicvoidsetTile(inttileindex,intx,inty){mTileGrid[x][y]=tileindex;}@OverridepublicvoidonDraw(Canvascanvas){super.onDraw(canvas);for(intx=0;x<mXTileCount;x+=1){for(inty=0;y<mYTileCount;y+=1){if(mTileGrid[x][y]>0){canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset+x*mTileSize, mYOffset+y*mTileSize, mPaint);}}}}}4.3.3 SnakeView类的详细设计SnakeView的代码如下:packagecom.heima.android.snake;importjava.util.ArrayList;importjava.util.Random;importandroid.content.Context;importandroid.content.res.Resources;importandroid.os.Handler;importandroid.os.Message;importandroid.util.AttributeSet;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.TextView;publicclassSnakeViewextendsTileView{privatestaticfinalStringTAG="SnakeView";privateintmMode=READY;publicstaticfinalintPAUSE=0;publicstaticfinalintREADY=1;publicstaticfinalintRUNNING=2;publicstaticfinalintLOSE=3;privateintmDirection=NORTH;privateintmNextDirection=NORTH;privatestaticfinalintNORTH=1;privatestaticfinalintSOUTH=2;privatestaticfinalintEAST=3;privatestaticfinalintWEST=4;privatestaticfinalintRED_STAR=1;privatestaticfinalintYELLOW_STAR=2;privatestaticfinalintGREEN_STAR=3;privatelongmScore=0;privatelongmMoveDelay=600;privatelongmLastMove;privateTextViewmStatusText;privateArrayList<Coordinate>mSnakeTrail=newArrayList<Coordinate>();privateArrayList<Coordinate>mAppleList=newArrayList<Coordinate>();privatestaticfinalRandomRNG=newRandom();privateRefreshHandlermRedrawHandler=newRefreshHandler();classRefreshHandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){SnakeView.this.update();SnakeView.this.invalidate();}publicvoidsleep(longdelayMillis){ this.removeMessages(0);sendMessageDelayed(obtainMessage(0),delayMillis);}};publicSnakeView(Contextcontext,AttributeSetattrs){super(context,attrs);initSnakeView();}publicSnakeView(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); initSnakeView();}privatevoidinitSnakeView(){setFocusable(true);Resourcesr=this.getContext().getResources();resetTiles(4);loadTile(RED_STAR,r.getDrawable(R.drawable.redstar));loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar));loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar)); }privatevoidinitNewGame(){mSnakeTrail.clear();mAppleList.clear();mSnakeTrail.add(newCoordinate(7,7));mSnakeTrail.add(newCoordinate(6,7));mSnakeTrail.add(newCoordinate(5,7));mSnakeTrail.add(newCoordinate(4,7));mSnakeTrail.add(newCoordinate(3,7));mSnakeTrail.add(newCoordinate(2,7));mNextDirection=NORTH;addRandomApple();addRandomApple();mMoveDelay=600;mScore=0;}privateint[]coordArrayListToArray(ArrayList<Coordinate>cvec){intcount=cvec.size();int[]rawArray=newint[count*2];for(intindex=0;index<count;index++){Coordinatec=cvec.get(index);rawArray[2*index]=c.x;rawArray[2*index+1]=c.y;}returnrawArray;}publicBundlesaveState(){Bundlemap=newBundle();map.putIntArray("mAppleList",coordArrayListToArray(mAppleList));map.putInt("mDirection",Integer.valueOf(mDirection));map.putInt("mNextDirection",Integer.valueOf(mNextDirection));map.putLong("mMoveDelay",Long.valueOf(mMoveDelay));map.putLong("mScore",Long.valueOf(mScore));map.putIntArray("mSnakeTrail",coordArrayListToArray(mSnakeTrail));returnmap;}privateArrayList<Coordinate>coordArrayToArrayList(int[]rawArray){ArrayList<Coordinate>coordArrayList=newArrayList<Coordinate>();intcoordCount=rawArray.length;for(intindex=0;index<coordCount;index+=2){Coordinatec=newCoordinate(rawArray[index],rawArray[index+1]);coordArrayList.add(c);}returncoordArrayList;}publicvoidrestoreState(Bundleicicle)

温馨提示

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

评论

0/150

提交评论