




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计引 言在如今3G时代,手机游戏、移动多媒体无线增值服务,已会成为一个热点。我国主要的移动运营商正在积极努力致力于发展手机游戏业务。在中国,手机游戏仍处于探索时期,其发展仍然受很多因素的制约。面对广阔的市场和无限的潜在客户的基础上,如何真正让手机游戏在正确的轨道上发展和运作是电信运营商和游戏开发商急需解决的问题。从用户角度看,手机游戏因其随时随地便于携带的基本特征备受用户关注。因此用户无论在户外或车里,只要是空闲时间,都可以成为手机游戏参与者。由于游戏节奏很快,不会占用用户大量的时间,游戏情节进度可以暂停等效果,给用户提供方便,并降低了游戏难度的阈值,提高用户的游戏的兴致度及可玩值,提供更适合的人在旅游时的休闲、娱乐功能。从开发的角度上来看,成熟的手机游戏产品应该有以下几个方面:一个是能够适应庞大的用户群,即可以在高峰时间内集中加载游戏的信息;二是游戏可以适应不同的移动终端的屏幕尺寸;三是一个手机游戏的兼容性,一些智能手机的色彩和声音支持具有良好的兼容性;四是游戏中应当应用合理大小,若手机没有太大内存,用户下载和存储很难;五是游戏过程能中断性要求,结合不同的特点,可以实现手机操作系统的背景。目前,手机网络游戏有两大发展的基本条件:一是有效的3G网络传输平台,在3 G手机网络时代的传输速率和承载能力有了很大程度的提高,互联网电话打开网页时间基本控制在3秒左右,对移动电话使用3G网络的高速数据传输的实时转播的多媒体内容丰富,打破了数据传输速度的对手机游戏开发限制;二是完美的电话终端的软硬件支持环境,手机硬件生产、开发与手机操作系统的不断成熟,为移动终端平台实现多种插件凝聚力提供依据,手机的娱乐功能越来越易于实现高质量的,有利于各种手机网络游戏需要。手机网络游戏市场的需求将在几年呈强劲的势头。首先,是指在2002年左右发展迅速的PC网络游戏。从中可以看到,中国的宽带互联网业务网络游戏和走进公众生活,占用庞大的用户群体,使中国的游戏厂商也如雨后春笋般迅速崛起一般。同样,3G网络在语音和数据传输上的飞跃发展,将会给手机网络游戏带来大好机会。第二,也可以参考日本和韩国的经验。由于3G技术的普及比我们早,日本和韩国的手机网络游戏市场已经非常成熟和标准。目前在韩国市场上流行的手机网络游戏,几乎所有都有美丽的画面和情节的游戏内容丰富,可以达到实际效果,最强烈的是和3G网络完美结合,并逐步形成了“网络游戏社区”这个概念。国内手机网络游戏的发展包含了无限的潜力,相信3G互联网的普及和成熟,国内的移动电话网络游戏开发会迅速和强有力的。J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。它有一些非常重要的特征对所有组织都有益。J2ME 设备是智能的。他们可在自身上处理信息。区别J2ME智能手机与前几代手机最重要的特征有: 1对用户来说,最具吸引力的特点是智能电话可以在并不连接网络的情况下玩游戏。在今天的2-5 G下,网络在线模式是必要的。但是由于在网络中,覆盖面积小,数据通信非常昂贵。将数据和请求网络操作缓存到事务处理中也可显著的减少无线网络的使用并且提供应用的可靠性。2智能客户端可以使用不同的协议来集成后台的游戏服务器及其同位体(包括无线同位体和互联网同位体)。3智能客户端支持视觉冲击游戏重要的丰富的用户界面(UI)。4智能客户端可以进入手机网络(如短信,彩信)或设备扩展(如GPS)的特点。这使得游戏开发的优势,充分利用活动生活方式成为可能。5客户提供智能变得更为强大,也更为灵活的安全通过先进的加密和数字签名算法。有了智能的客户端,我们可以传递情感和私人数据在互联网上,以及建立有效的网络社会。1概述1.1 游戏的背景知识游戏“连连看”,正如它的名字意味着找到相同链接到的东西,是网上看到一款再基本不过的小游戏,它是要找到相同的两件图案,在一定的规则的情况下,可以在相关处理。“连连看”的发展经历了从桌面游戏,在线游戏,社交游戏三个过程。游戏“连连看”是来自台湾的桌面小游戏的,自进入大陆以来就风靡一时,吸引许多程序员开发。“连连看”有许多版本,其中,顾方编写“阿达连连看”凭借着其成熟的生产是在市场上很受欢迎,它也成为古方“阿达连连看”的核心产品。并于2004年,并获得国家版权局计算机软件著作权登记证书。随着Flash应用的普及,已经出现在互联网上在线Flash版本“连连看”。如“水晶连连看”,“水果蔬菜连连看”等,广受欢迎的“水晶连连看”华丽的界面吸引了大批女性玩家。2008年,随着互联网的普及和社交开放平台的崛起,“连连看”被引入到社交网络。“连连看”与个人空间,并快速蔓延的组合,成为一个热门的社交游戏,其中包括与开发商Jonevey慢悠悠的开放式平台,在推出的“宠物连连看”最受欢迎。“经调查数据显示,在所有玩连连看小游戏用户中,大专及以上学历人士占其总数的50.6%,在连连看小游戏用户中这一比例达到62.8%;收入方面,38.4%的小游戏游戏用户收入高于3000元,而仅23.5%的小游戏用户达到这一收标准;1”经专家分析后认为,从用户的学历、收入以及在游戏中的构成比例来看,连连看小游戏用户的属性更高端,相较普通游戏用户其用户的消费潜力也更大,伴随着使用连连看小游戏用户规模的快速增长,用户规模+高端属性将为连连看小游戏的媒体价值奠定良好的框架,而随着连连看小游戏产业的成熟和发展,其媒体价值将逐步被释放,未来也将有更大的开发空间。连连看小游戏的最大的优势在于无需下载客户端,这使得这类游戏可以更为方便地被安装在其他移动终端中,如掌机、手机。这给一些上网受限制的用户提供了很大便利。此外研究认为认为一旦政府逐步实施建设在一线城市中广域网的计划,随着该网络的建成,连连看小游戏也将迎来新一轮的发展空间。1.1.1 游戏的基本规则简单地说,玩家可以通过方向键将2个相同图案的连接起来,连接线不多于 3 条直线,就可以成功将相同图案消除。第一次玩时,点击屏幕上将要相消的图案之一,该图案此时状态为“被选中”,以白色的框框出显示;再次以左右键点击另一个图案,若该图案与被选中的图案相同,且把第一个图案到第二个图案连接起来,中间的直线不超过3条,则消掉这一对图案,否则第一个图案恢复成未被选中状态,而第二个图案变成已选中状态。游戏共有两种道具,其一设有提示功能,当玩家找不到相同图案时,点击键盘一按键,屏幕将会突出两个图案来提示玩家,用过一次,则道具少一次。其二设有重排道具,当玩家找不到相同图案时,点击键盘一按键,屏幕将会把图案重新排列,将产生新的连接组合,玩家可以继续游戏。游戏共分为12关卡,每一关过后方可进入下一关,失败后重新从第一关开始。每一关卡都不相同,比如,第一关消除一对图片后,下方的图片将自动向上运动,这将会产生新的消除组合。往后每一关都有图片的各式各样的运动方式,增加了游戏的趣味性及难度。1.1.2 本游戏的概况本游戏主要给用户提供的是游戏的娱乐功能,所以怎么提高游戏的娱乐性成为问题的关键,那么这款游戏的娱乐性主要体现在那些方面呢?首先,该用户界面具有良好的用户界面能吸引人去玩。界面简单明了,但是图案设计清晰有趣,而且屏幕设计比较人性化适合老幼各年龄段的人群使用。其次,游戏的娱乐功能,具有良好的娱乐功能是游戏具有持久魅力的基础,需要设计游戏的不同级别以充分调动用户积极性。再次,具有友好的提示功能,满足不同游戏级别的人的不同需要,增加必要的音乐效果,使用户玩起来不觉得单调乏味。本次画面设计观赏性强,并配以适当的音乐增加游戏的娱乐性。设置不同的游戏级别(本游戏有3个级别)主要是缩短游戏时间,因为图标是随机排列的,所以通过控制产生随机数的难度显得不现实。通过快捷键的操作可以适时做出游戏的提示功能,满足提示要求,如果用户对某次产生的图标分布效果不满意,可以对现在有的图片资源进行有限次的重排,以满足用户的需要。玩家使用上、下、左、右四个方向键来选择图案的位置,利用确认键来选定。还会有一些按键代表道具,点击则可使用。整个游戏的难点和重点在于图形组合的多变性,游戏共有12局,图案将会按照规律运动,所排出来的组合将会产生新的连接可能。比如方块将会上升、下降、向中间靠拢、四角发散等运动。1.2 J2ME相关知识1.2.1 J2ME技术特点J2ME,即Java 2 Micro Edition,Sun公司定义为“高度优化的Java运行时针对环境的J2ME广泛的消费类产品,包括寻呼机,手机,手机屏幕,数字机顶盒和汽车导航系统。”在1999年6月Sun公司在JavaOne开发者大会上宣布,J2ME带来较小的设备的Java语言的跨平台功能,允许移动无线设备共享应用程序。对于J2ME,Sun已经适应了Java平台消费电子产品纳入或基于小型计算设备。Java的最大目标和特点,就是“一次编写,到处运行”的平台无关性。但是,很自然的,正如Sun认识到的,One size doesnt fit all,一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用。Standard Edition (标准版,J2SE)主要用于创建独立运行、基于Web的Java applet和应用程序,针对桌面端PC和工作站的个人和低端商务应用。Enterprise Edition(企业版,J2EE)包含J2SE的所有功能,针对服务器端企业级应用,并且重点应用于利用EJB、Servlet 与JSP和XML进行服务器编程。Micro Edition(缩微版,J2ME)重点应用于无线计算机环境。针对有限内存,显示和处理能力的设备,主要是消费电子和嵌入式设备领域(这实际正是Java语言设计最初的目标领域)。 Java 程序是以边解释边执行的方式运行的,所有的Java 程序都会被编译成为二进制代码并运行在Java虚拟机上(J2EE、J2SE 中的Java 虚拟机简称为 JVM)。而J2ME针对的设备主要是嵌入式和消费类的设备,因为这些设备受内存和处理器的限制,所以J2ME 所包含的类库也比较小一些,相对于J2SE的类库来说作了一些裁剪,虚拟机的功能也相对简单。在 J2ME 中有两类虚拟机:C虚拟机(C Virtual Machine,CVM)与K虚拟机(K Virtual Machine,KVM)。KVM 和 CVM均可被看作是一种 Java 虚拟机,是 JVM 的子集,在功能上都是 JVM 的缩减版。这两类虚拟机的适用范围并不相同,简单地说,CVM 的功能比KVM 功能更为强大,下面将会更清楚地介绍这两种虚拟机的具体适用范围。运行在J2ME 上的程序大致分为两种。KVM是用于 J2ME平台最小的虚拟机,并且是用于CLDC配置的虚拟机。但是J2ME应用程序并不一定非要使用 KVM,J2ME技术可以使用任何虚拟机,不过至少应当有 KVM这样的功能。“J2ME 在设计其规格的时候,遵循“对于各种不同的装置而造出一个单一的开发系统是没有意义的事”这个基本原则。于是J2ME 先将所有的嵌入式装置大体上区分为两种:一种是运算功能有限、电力供应也有限的嵌入式装置(例如PDA、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置;2”因为有这两种型态的嵌入式装置,所以Java 引入了一个叫做Configuration 的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则定义在Connected Device Configuration(CDC)规格中。也就是说,J2ME先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。J2ME 使用配置(CDC或CLDC)和简表(Profile)定制运行时环境(Java Runtime Environment,Java,JRE)。一个完整的 JRE由配置和简表组成,配置决定了所使用的 JVM(CVM 或 KVM),而简表通过定义特定的类来为应用程序提供功能上的支持,一个简表定义了设备所提供的 API 集合。对比前面简表的定义可以知道,移动信息设备简表(MIDP)是简表的一种,定义了移动信息设备的类型和提供相关的应用程序编程接口(API)集合,MIDP 所定义的功能更加面向用户,而且比 CLDC 更高级。1.2.2 Wireless Toolkit的技术特点Sun Java Wireless Toolkit是一组工具,可以用来为移动或其它无线设备创建应用程序。 其功能如下: 1构建和封装,是用来编译源码,预校验类文件并封装MIDlet。 2运行和监视,其在将MIDlet 实际部署到移动设备上之前,可以使用J2ME模拟器(Emulator)在桌面计算机上对其进行运行和调试。 3MIDlet 套件签名,它包含对MIDlet 进行加密签名的工具。 Sun Java Wireless Toolkit具有如下两种工具,可以在模拟环境中构建和测试J2ME应用程序:无线工具包,是开发 MIDlet 的一个开发环境;模拟器(Emulator),为在PC上测试代码提供了一个有效的模拟环境。1.2.3 Eclipse技术特点Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。最初主要用来Java语言开发,目前亦有人通过插件使其作为Python、C+、PHP等其他语言的开发工具。Eclipse的本身只是一个框架平台,由于众多插件的支持,使得Eclipse拥有较佳的灵活性。各个领域的开发人员可以通过开发插件,构建与eclipse环境无缝集成的工具。Eclipse采用的技术是IBM公司开发的(SWT),这是一种基于Java的窗口组件,类似Java本身提供的AWT和Swing窗口组件。Eclipse的图形用户界面还使用了GUI中间层JFace,从而简化了基于SWT的应用程序的构建。Eclipse的插件机制是轻型软件组件化架构。在客户端平台上,Eclipse使用插件来提供所有的额外功能,例如支持Java以外的其他语言。已有的分离的插件已经能够支持C/C+(CDT)、PHP、Perl、Ruby,Python、telnet和数据库开发。插件的架构可以支持任何延伸到现有的环境,例如配置管理,而决不仅仅限于支持各种编程语言。Eclipse中几乎每样东西都是插件,Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本内核包括:图形API(SWT/Jface),Java开发环境插件(JDT),插件开发环境(PDE)等。1.2.4 关于EclipseMEEclipseMe作为Eclipse一个插件,致力于帮助开发者开发J2ME应用程序。“EclipseMe并不为开发者提供无线设备模拟装置,而将各手机厂商的实用模拟器紧密连接到Eclipse开发环境中,为开发者提供一种无缝统一的集成开发环境。3” 1.3 开发工具和语言本项目是在window XP操作系统下,使用Java语言编写,开发手机连连看游戏,采用java环境及工具进行设计及实现,使用Wireless Toolkit封装集成。1.3.1 开发工具市场上存在多种J2ME平台,针对如此多样化的环境,各厂家相继推出了属于自己的开发工具。面对这种情况,工具厂商提供了集成开发工具让开发人员在同一环境下,随时开发时或测试时所使用的底层开发工具。本项目所使用的是Eclipse开发平台,开发人员可以通过开发插件来与eclipse形成无缝集成工具。如果用Eclipse开发J2ME应用程序,到目前为止只有使用EclipseME插件。EclipseME作为Eclipse的一个插件,帮助开发着开发J2ME应用程序。1.3.2 开发语言在J2ME环境开发平台下,使用Java编程语言,java良好的跨平台特性在开发中显示了强大的威力。Java语言面向对象的优势也是的开发游戏变得非常容易。Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的java接口,使用java编写程序能在世界大范围内共享。Java的编程类似于C+,但舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存是由系统分配,这样就可以避免病毒通过指针入侵系统。它提供了完全管理器,防止程序的的非法访问。Java致力于检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语言、多重继承、goto语句、操作符、重载等不易被掌握的特效,提供垃圾收集器回收不用内存空间。82 需求分析2.1 游戏可行性分析随着人们生活水平的不断提高,人们对精神生活水平的要求也随之提高。游戏,不但可以放松身心,有的还可以开发智力。她作为一种娱乐项目在不断的发展,并在我国逐渐地发展壮大。如今市场上,已经出现了各种各样,适合不同年 龄段和不同人群的游戏。比如:CS、极品飞车、大富翁、魔兽等一些大型游戏,再比如连连看、贪吃蛇、找茬等一些小游戏,都是现在受大众欢迎的娱乐休闲游 戏。并且,随着互联网的发展,许多游戏不仅有单机版的,而且还有网络版的, 甚至还有近两年流行起来的网页游戏。迄今为止,游戏产业在我国已经发展为一 个庞大的产业,为许多相关行业带来了巨大的经济效益。2.2 游戏功能需求分析为了便于游戏者操作,游戏的界面简洁清晰,控制区和操作区分别在游戏界面的上部分和下部分。控制区由一排按钮组成,里面包括游戏的模式选择,游戏的开始、暂停、游戏成绩分数点、游戏的帮助说明以及游戏级别设置选项等,游戏开始由函数调用来完成游戏图片的加载,随机产生图片排列。游戏操作区是用手机的上下左右键来控制图片的移动,用中间键作为确定键,当连续选定两个相同图片后,且两者的连线在算法允许消去的范围内,则消去这两个相同的图形。当游戏者一时找不到可消去的相同的图片时,就可以利用控制区中的提示按钮,则会随机的产生一对可消去的图片。当游戏中还有图片且不可消去时,则可利用控制区中重新洗牌按钮,则会把存在的图片打乱后重新组合,就可以继续游戏。2.3 游戏界面需求分析游戏的界面分为控制区和操作区,控制区是整个游戏的控制按钮的集中区域,操作区是游戏者进行游戏的场所。(1)控制区控制区中有以下一些按钮:开始游戏按钮:进入游戏开始界面,玩游戏显示分数与所用时间;退出游戏按钮:放弃本局游戏,进行游戏模式选择重新开始游戏;退出按钮:退出游戏程序;重新洗牌按钮:把游戏中的图片重新排列;暂停按钮:暂停游戏;游戏说明按钮:游戏规则的说明。(2)操作区操作区是玩家进行游戏的场所,游戏的规则很简单,就是用不超过两次转折的连线把两个相同的图片连起来,直到把游戏画面中的图片消完为止。游戏采用LLKMatrix类,用来加载图片和连连看的核心算法来选择选中图案以及消除图片的算法,用GameCanvas来接收手机键盘消息来消除图案和重画画布,用TimeDown()与GameCanvas来控制时间来计算游戏时间与判断是否能成功完成游戏通关。2.4游戏技术可行性分析技术上的可行性分析主要分析现有技术条件能否顺利完成开发工作,硬件、 软件配置能否满足开发者的需要,各类技术人员的数量,水平,来源等。连连看系统的工作主要是在开发者和玩家之间架起一座桥梁,能相互沟通信息 和处理信息。这一特点非常适合计算机特点,通过网络 Internet 技术,发挥计算机的信息传输速度快、准确度高的优势。计算机硬件和软件技术的飞速发展,为系统的建设提供了技术条件。2.5 游戏规则性分析每一关的图案连接方式有三种:1直连,这包括横直连和竖直连;2连线有一个转折;3连线有两个转折。本游戏一共12关,每一关中图片整体运动方向各不相同。第一关是方块自动上升;第二关是方块向下坠落;第三关是方块左方往下,右方往上;第四关是方块向左靠拢;第五关是方块上方向左,下方向右;第六关是方块上方向上,下方向下;第七关是方块左方向左,右方向右;第八关是方块上下向中间靠拢;第九关是方块左右向中间靠拢;第十关是方块向对角靠拢;第十一关是方块向中心靠拢;第十二关是方块不进行重排。3 总体设计3.1 用户界面流程游戏的界面清新自然,操作简单,适合各个年龄段的玩家操作。图3-1 用户界面框架图3.1.1 主界面程序运行后,首先显示游戏菜单,玩家可以选择“开始游戏”选项跳转到游戏画布,如果游戏失败,则出现提示画面,玩家确认后返回游戏菜单;如果游戏顺利通关,则显示游戏胜利画布,玩家确认后也返回菜单。游戏截图如图3-1所示。3.1.2 设置与关于游戏画面游戏有3个难度,分为“简单”、“中级”、“高等”。玩家进入难度选择菜单之后,可以使用方向键改变当前难度,当前难度用level变量标识,并在当前难度的位置上绘制红色方框。玩家按下确认键FIRE确认。难度设置菜单如图的中图和右图所示。玩家可以通过方向键改变当前难度。游戏的操作说明和关于都是用图片来实现,当玩家选择“操作说明”或者“关于游戏”选项时,在指定位置绘制说明或关于图片。drawHelp()和drawAbout()方法分别用来显示操作说明和关于。是游戏的操作说明和关于界面。3.1.3 游戏画面当玩家按下“开始游戏”软键时,则进入游戏。如图3-2所示。当玩家使用四个方向键在一图案上按下“确认”软键时,则显示被选中。画面下方一次是所赢得的金钱数、关数、所剩时间、音量、重排道具、提示道具。3-2游戏信息显示在游戏过程中,还添加了一些图片来表示当前情况,比如玩家输了,则显示“啊!你挂了?”;当玩家赢了,则显示“你赢了,真棒!”;当按下暂停键时,则显示“休息一会儿”。这些图片如图3-3所示。3-3游戏图片 表3-1 图片清单表图片名大小(字节)像素(宽高)用途llk.png2451616程序logobackgroung.png47245240309菜单框架图片menu.pn单about.png6039141189游戏说明set.png6344141189游戏难度help.png6888141189操作说明cong.png181617330“你赢了,真棒”gameover.png158515332“啊,你挂啦?”pause.png145916426“休息一会儿”won.png146716029“过关了!恭喜”wonall.png250814451“打通关了,真厉害啊!”3.2 游戏的算法分析连连看的算法主要是判断两个单元格是否相连,按照连连看规则,连个单元格的内容首先必须是相同的;其次,两个单元格之间连线的这点不超过两个(连接线由水平线和垂直线组成)。3.2.1 可能的连接情况分析一下连接的情况,可以知道,可连接线条分为3种情况:直线相连、一个折点和两个折点,这3种情况具体到每种情况如图3-4所示。图3-4 可能的连接情况通过3-4可以发现,如果有折点,每个折点必定有缺至少有一个坐标(X或者Y)和其中一个单元格是相同的,也就是说,折点必定在两个单元格所在的X方向或Y方向的直线上。这也是连连看算法的一个出发点。3.2.2 数组表示图形矩阵我们发现,可以将游戏中的图片矩阵看作是一个二维数组,其中的所有图片可以看做是数组中的一个具体的元素。那么,游戏中相同的图片可以看做是数组中不同位置两个值相同的元素。对于矩阵中的空白部分,我将其对应于数组中一个特殊的值如“-1”。空白区域是可以连线的,所以当连续的等于-1的数组元素的横向索引或纵向索引相同时,可以认为这是一条直线,如图3-5所示。图3-5 空白区域的数值表示当数组中两个位置的值相同,并且两个单元格见只需要不超过3条直线就能连接起来时,就让这两个位置的值变为-1,如果数组中全是-1,就认为游戏已经结束。在数组初始化时,我先按顺序及排列,这样能简单的确保同样的图案出现的次数是偶数次,然后随机交换数组中的内容,图案种类越多,难度越高。3.2.3 消除情况下面来判断两个单元格的消除情况。根据游戏规则,如果两个单元格之间可以用不超过3条直线(也可以说不超过两个转折的直线)连接起来,这两个单元格就可以消除。现在从算法的角度来分析一下所有可能的情况。首先一种可能是,两点之间只需要1条直线连接。如果两个单元格之间只需要1条直线能够连接起来,那么它们的横坐标或纵坐标必定相同,有了这个条件,判断是否只需要1条直接连接就简单了许多。其次一种可能是,两点之间需要2条直线连接。如图所示,A、B两点如果需要2条直线连接起来,有可能有两种方式。但通过观察可以发现,转折点C或者D的坐标是A点和B点坐标的组合。因此,可以从其中一个点,例如A点,向B点寻路,如果这个过程中发现存在连通路径,则判断可以相连。3-6 2条直线相连如图3-6所示,说明了两点之间3条直线的所有可能性,和2条直线的情况相比,转折点是两个,看上去虽然麻烦了一点,但也不难处理。3-7 3条直线相连有图3-7可以看出,A、B如果要通过3条直线相连,则必须有C、D两个拐点,如果确定下C、D,问题就基本上解决了。由于矩阵的行列数量不是很多,我采用遍历的方法扫描是否存在C、D这样的通路,如果存在,则进一步判断,A、B两点是否存在到达CD的通路AC和BD,如果三次判断都成立,则判断可连。消除这两个单元格时,只需要将两个单元格的值置为-1即可。3.3 游戏类的设计整个游戏共由6个类组成,如图3-8所示是游戏的类结构。游戏的LLKMIDlet类负责保持display对象,显示游戏画布并开启游戏线程:MainMenu类用来显示游戏菜单;LLKCanvas类负责显示游戏画布;LLKMatrix类保持了一个矩阵数组,并且可以判断两个单元格是否可连;TimeTask类用来计时,如果玩家超出指定时间没有完成任务,则游戏失败;GameWinCanvas类用来显示游戏胜利界面。图3-8 类结构3.3.1 主类和菜单MainMenu类游戏的主类为LLKMIDlet类,该类比较简单,主要功能为显示游戏菜单,以及创建和显示游戏画布。它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。)、结束的函数。3.3.2 矩阵LLKMatrix类LLKMatrix类实现了游戏矩阵,包括矩阵的随机生成、自动重排和判断是否消除等部分。矩阵用一个整形数组保持。LLKMatrix类的核心算法为judge(),该方法判断两个位置的元素是否符合“二折”规则,即是否能够相连并消除。 连连看的规则是连接两个位置的连线出现的转折不超过两个,因此可能出现多种不同的情况。根据不同的情况返回不同的得分,复杂程度越高,得分也越高,游戏中定义了下面3个分数:10,20,30。为了便于玩家识别,两个单元格连接时会用线条显示。这些线条分别用不同变量标识,连接线条和变量的对应关系如图显示:图3-9连接线条和变量的对应关系为了增强游戏趣味性和难度,方块会朝指定方向运动,例如上升、下降、向中间靠拢、向四角发散。自动的组合可能产生新的连接可能,也会让原来可连的单元格相互错开,玩家在连接某些单元格时也应当考虑周边的变化情况。重排方式按照当前关卡,包括不进行重排,共有12种方式。这有方块向下运动;方块上方向上下方向下运动;方块左方往下,右方往上;方块向左靠拢;方块上方向左,下方向右;方块左方向左,右方向右;方块上方向上,下方向下;方块上下向中间靠拢;方块左右向中间靠拢等以上组合。3.3.3 游戏画布LLKCanvas类LLKCanvas类用于显示游戏画布,并相应键盘事件。LLKCanvas类的构造函数用于初始化游戏参数和游戏资源,包括定时器、根据级别设置矩阵尺寸,以及创建游戏尺寸。游戏资源包括游戏中使用到的声音文件和图片文件。计时功能用于游戏计时,计时器初始值为0,共用360s;玩家按下暂停键,计时停止;当玩家在360s时间内没有赢得游戏,则显示游戏失败画面。屏幕绘制包括游戏胜败、游戏暂停和游戏进行画面。绘制游戏画面包括绘制背景、矩阵、连线、提示边框、提示信息等。当玩家按下*键时,暂停游戏,游戏当前处于暂停状态,玩家按下FIRE键则重新激活游戏。当玩家按下#键时,如果还有提示道具,则显示提示框;如果玩家按下9键时,则重新排列矩阵;玩家按下7键,则调整音量。FIRE是功能键,按下是确定的意思。如果玩家在单元格上按下FIRE,则选中此单元格,玩家利用方向键在其他的单元格上选中时,则判断两个单元格是否能够相消。玩家每过一关,道具都加1如果玩家通过12关,则显示胜利屏幕。3.3.4定时器和游戏胜利屏幕TimeTask类用来实现一个可以调度的任务。GameWinCanvas类用来绘制游戏胜利结束画面。当玩家顺利过关时,将显示游戏胜利屏幕。如果玩家通过初等或者中级难度的游戏将绘制“过关了,恭喜!”图片:如果玩家通过高级难度的游戏,将绘制“打通关了,真厉害啊!”图片,在游戏上方,同时以“走马灯”的形式绘制“你赢了,真棒”图片。GameWinCanvas类主要是加载游戏图片,是属于GameCanvas画布类。该类包括屏幕的线程,屏幕绘制及键盘处理,加载图片包括难度等级图片、恭喜图片“过关了,恭喜!”、胜利图片“你赢了,真棒!”。在这过程中,要设置图片的纵坐标,图片宽度,线程每次循环的时间等。在加载图片时,先要获取图片宽度再创建可变图片,图片背景要设置为黑色,绘制图片。包括图片及提示信息,处理现实过程中玩家出发的键盘事件。4 游戏的实现4.1 主类与菜单类的实现在程序启动startApp()方法中,将显示游戏菜单。exit()方法用来退出游戏,当用户界面在游戏菜单中选择退出游戏时调用。startGame()方法根据菜单选择的难度级别创建并显示游戏画布。setCurrent()函数用来显示背景介绍窗口。当玩家点击确定后将调用display.setCurrent(mainmenu)以显示游戏菜单MainMenu。图4-1 LLKMIDlet处理流程图MainMenu类用来显示游戏菜单,该类继承了MIDP2.0的GameCanvas类。菜单中的“游戏设置”、“游戏说明”、“关于游戏”都用图片实现,直接贴图覆盖,如图所示。如果玩家选择“开始游戏”,则调用主类的startGame()方法显示游戏画布。图4-2 MainMenu流程图菜单类的构造函数主要用来设置屏幕属性和加载图片资源。主意:本游戏调用了GameCanvas类的setFullScreenMode()方法将屏幕设置成全屏。加载图片资源后绘制框架图片和菜单。图4-3 MainMenu类函数构造流程图当显示游戏画布时,自动调用paint()方法,该方法调用flushGraphics()方法,该方法将缓冲内容刷新到屏幕上。菜单的绘制有drawMenu()方法实现,该方法在指定位置绘制菜单图片,并且按照当前的选择在选项上绘制红色方框。当前选择的选项由selected变量标识,该变量在玩家发生键盘输入时更改。游戏有3个难度,分为“简单”、“中级”、“高等”。玩家进入难度选择菜单之后,可以使用方向键改变当前难度,当前难度用level变量标识,并在当前难度的位置上绘制红色方框。玩家按下确认键FIRE确认,可以通过方向键改变当前难度。主菜单界面的绘制和难度设置流程基本相同:绘制背景图片难度图片设置颜色为红色绘制红色方框。游戏的操作说明和关于都是用图片来实现,当玩家选择“操作说明”或者“关于游戏”选项时,在指定位置绘制说明或关于图片。drawHelp()和drawAbout()方法分别用来显示操作说明和关于。玩家通过方向键改变菜单的各个状态。菜单中按照“菜单”、“游戏设置”、“关于游戏”、“操作说明”分为四种状态,分别用静态整型常量标识。当处于“菜单”状态时,玩家通过方向键改变选项,当前选择的选项用selected标识,当玩家按下确认键后,则进入相应的游戏选项。当玩家选择“难度设置”选项时,则进入难度选择菜单,玩家可以用方向键改变当前难度,当前难度用level标识。当玩家选择“操作说明”和“关于游戏”时,则显示游戏相关说明,玩家按下任意键返回菜单。当玩家选择“退出游戏”时,则退出游戏。图4-4 键盘输入流程图4.2 矩阵LLKMatrix类的实现LLKMatrix类的结构函数根据指定的矩阵尺寸和图案数量初始化图形矩阵。由于连连看的图案必须成对出现,所以图案总数必须是偶数。initMatrix()方法先按顺序填充矩阵数组,然后随机交换任意两个位置。首先创建矩阵,接着按照单元格图片索引生成的有规律的矩阵,随机变换矩阵,如果不存在可连单元格,则重新变换。shuffleMatrix()方法随机交换种子矩阵的元素,生成一个随机矩阵。clearTrace()方法用于对矩阵内容重新整理,小于-1的元素将被重置为-1。find()方法将遍历矩阵,然后判断是否存在两个可以相连的元素,判断过程由judge()方法完成。LLKMatrix类维护了一个数组矩阵,因此也提供了设置和获取矩阵内容的外部接口,如果指定位置超出矩阵范围则返回-1。getRest()方法用来获取当前剩余图案的数量,如果图案被消除,则将相应的矩阵内容设置为-1。连连看的核心算法是连线不超过两个转折,该方法的形参为两个位置,分别为x和y,以及xx和yy。如下图所示。图4-5 连线流程图由于游戏画布对左上角的位置定义为(1,1),而矩阵内容是以(0,0)开始的,所以应先将游戏画布传递过来的形参相应减1。如果两个位置重合或者指定位置超出了矩阵范围,则直接返回0;如果两个位置的图案不相同或者其中任何一个位置为空,也直接返回0。 单元格的连接分为直接连接、出现一个转折、两横一竖情况、连通路径在左右侧外部情况、两竖一横情况、连通路径在上下方情况。首先进行检测的是两个可以直线相连的图案,这是最直接最明显的连接方式,包括纵向和横向两种。图4-6 纵向相连纵向直接相连时,两个位置的x坐标相同,即x=xx。从上方格向下方格读取中间方格的图案搜引,如果中间为空(搜引为-1)或者直接相邻,那么判断为可以使用直线相连。横向直线相连时,两个位置的y坐标相同,即y=yy,如图所示。从左方格向右方格读取中间方格的图案搜引,如果中间为空(索引为-1)或者直接相邻,那么判断为可以使用直线相连。图4-7 横向相连如果xxx ,yyy,那么(x,y)在(xx,yy)的左上方,首先判断出项一个转折的情况,可能有两种情况,如4-8图所示。图4-8 可能出现的连接情况(一)如果xyy,那么(x,y),(xx,yy)的左下方,判断出现一个转折的情况,同样可能有两种情况,如图4-9所示。图4-9 可能出现的连接情况(二)下面检测另外一种连接可能,如4-10图所示虽然连接情况个不同,但是可以总结出它们都是两横一竖,并且所连接单元格都不是在矩阵的外边缘。对于这种可能,可以先检测两个单元格在矩阵里是否存在纵向连通路径,如果存在,继续检测横向,并根据横向路径向路径的方向,判断是属于图中哪种具体情况。图4-10 矩阵内部存在纵向连通路径的可能情况在检测过程中使用了两个中间变量y1和y2来检测纵向连通路径,其中y2取y和yy中的较大值,y1取y和yy中的较小值。上面的检测,默认两个单元格位于矩阵内部,并且纵向连通路径在矩阵内部,但还有一种情况,就是连通路径在矩阵外,需要对这种情况独立检测。图4-11 连通路径在矩阵左外或右外侧的情况检测原理是分别对两个单元格向左方寻路,如果能够到达矩阵外放(也就是说,该单元格目前是该行最左侧图案),则判断为存在如图所示的情况,两个单元格可连。与此类似,连通路径在矩阵右外侧的情况也需要进行独立检测,如上图所示。横向连通路径也可能在矩阵外面,如图所示,是连通路径在矩阵上方外面和下方外部的情况。图4-12 连通路径在矩阵上方或下方的情况如果以上情况均不存在,则无法消除所选单元格,返回0分。单元格向下坠落,如果存在空白,则用上方单元格填充该空白,运动轨迹类似自由落体,单元格自由下落由dropdown()方法实现,该方法选取每一列从上往下检测,如果检测到空白区域,则用该单元格的上方单元格往下填充,而最上方的单元格内容设置为空白。方块左方往下,右方往上。这种运动方式,将整个矩阵分为两半,作半矩阵按照下落方式自动重排,右半矩阵按照上升方式自动重排,leftdownrightup()方法用来实现方块左方往下,右方往上的运动左边向下,右边向上运动,该方法将矩阵分为两半,然后分别使用raiseui()和dropdown()方法中的代码。单元格自动向左靠拢。goleft()方法实现了方块向左靠拢的运动,单元格向左自动填充空白区域,该方法选取每一行从右向左检测,如果出现空格,则用该空格右侧的单元格填充,并且该行最右边的单元格设置为空白。矩阵上半部分的单元格向左靠拢,下半部分的单元格向右靠拢。upleftdownright()方法实现了上方单元格自动向左填充,下方单元格自动向右填充。方块上方向上,下方向下。矩阵分为上下两部分,上方单元格向上填充,下方单元格向下填充,updown()方法实现了该运动,该方法结合了raiseup()方法和dropdown()方法。 方块左方向左,右方向右。矩阵分为左右两部分,左方单元格向左填充,右方单元格向右填充,leftright()实现了该变形方式。方块上下向中间靠拢。矩阵分为上下两部分,上下两部分都向中间靠拢,该过程由updowncenter()方法实现。方块左右向中间靠拢。矩阵分为左右两部分,左右两部分都向中间靠拢,该过程由leftrightcenter()方法实现。将上述的几种变换方式加以组合,可以得到新的方式,例如:同时调用updown()和leftright()方法,即上方向上,下方向下,左方向左,右方向右,会得到所有单元格像两个对角靠拢的效果。同时调用updowncenter()和leftrightcenter()方法,及上下方向中间靠拢,左右方向中间靠拢,会得到所有单元格向中心的效果。4.3 游戏画布LLKCanvas类的实现LLKCanvas类的构造函数用于设置游戏参数和读取游戏资源,这包括播放声音、游戏机室、屏幕绘制、绘制游戏画面、键盘响应等。init()方法用来读取游戏资源,包括游戏中使用到的声音文件和图片文件。这些图片有提示图片、重列图片、停止图片、音量控制图片、连连看图片,声音文件有胜利声音、游戏失败声音等。游戏画布提供了两种方法播放声音,包括按照字符串播放声音,以及播放字节数组声音。游戏计时方面,TimeDown()方法用于配合计时器进行游戏计时,计时器每过一秒调用该方法一次,而TimeLeft减一,初始值为360.当TimeLeft()为0时,游戏结束,玩家没有在指定时间内完成任务,游戏失败。图4-13 计时流程图使用TimeDown()方法时,如果玩家没有在指定时间内完成任务,则调用GameEnd()方法,该方法取消计时任务,并且将游戏结束标识设置为true。游戏画布显示的内容由paint()方法控制,如果游戏失败则显示游戏结束画面,如果游戏停止则显示游戏暂停画面,如果游戏进行中则显示游戏画面。游戏暂停键和继续可以通过设置标识来实现。goPause()和goActive()方法可以改变暂停标识,然后调用repaint()方法重新绘屏幕,如果暂停则显示暂停画面,如果没有暂停则绘制游戏画面。当游戏暂停时调用drawPause()方法,显示游戏暂停画面。当游戏失败时会调用drawEnd()方法,显示提示画面。游戏画面分为3个部分:背景、方格矩阵和状态栏。绘制背景有drawBackground()方法实现完成,该方法将整个屏幕简单地涂成黑色,也可以选取淡雅的图片作为北京。drawMaze()方法用来绘制矩阵,包括图案、提示框、选择框、以及连接两个单元格的连线。该方法首先遍历矩阵,获取矩阵的内容,然后根据内容绘制屏幕。在获取矩阵的内容后,首先绘制图形矩阵外的连线,连线用来连接目前可消除的图形图4-14 图形矩阵外的连线图形矩阵内的连线和矩阵之外的连线的绘制过程有所不同。矩阵之外的连线只可能出现在矩阵4个边界的单元格上,因此只需要对4个边进行判断,判断过程中使用了4个布尔变量。由于连线时用来连接两个单元格的,若初始状态变量,例如h1为false,则当遇到第一个单元格时h1设置为true,连线往下绘制;当遇到第二个单元格时,将h1设置为false,停止绘制。以在矩阵左外侧外边缘绘制的连线为例,矩阵从上往下遍历,但遇到在矩阵左侧的单元格为Hconn或者能够包含Hconn的值,则往下绘制,直到遇到左边缘第二个值为Hconn或者能够包含Hconn的单元格。绘制提示边框,单元格内容的数字就是图片搜引,它的范围在0到SeedCount之间。如果当前位置不是提示单元格,则知己绘制图片,并绘制外边框,外边框颜色为0xffffff,用整型变量OuterColor表示:如果当前位置时提示单元格(坐标为X1,Y1和X2,Y2),绘制图片后绘制提示边框,提示边框颜色为0x2200ff,用整形变量HintColor表示。图4-15 提示边框示意图提示边框标记了两个可以消除的单元格,玩家在一时无
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业内部员工培训合格证书证明(7篇)
- 那个让我难忘的陌生人记事作文(7篇)
- 成长的烦恼写抒情作文(9篇)
- 国际商法概述-经济管理学院
- 初中文言文经典篇目教学计划:古代历史、典籍导读
- 2025年雅思考试听力机经模拟试卷:家庭与婚姻关系试题
- 现代农业技术发展及其影响考点
- 2025年对外汉语教师资格证考试对外汉语教学实践与教学评价策略研究评价试卷
- 2025年快餐服务项目规划申请报告模板
- 2025年乳胶枕项目规划申请报告
- GB/T 44481-2024建筑消防设施检测技术规范
- 风险评估培训课件x
- 代牧牛羊合同模板
- 感术行动专项考核试题及答案
- DB34∕T 3468-2019 民用建筑楼面保温隔声工程技术规程
- 《西兰花先生的理发店》幼儿园小学少儿美术教育绘画课件创意教程教案
- 江苏省淮安市2023-2024学年八年级下学期期末数学试卷(含答案详解)
- 国家开放大学本科《商务英语4》一平台机考真题及答案(第二套)
- 玻璃窑炉维修与保养考核试卷
- NBT 47013.4-2015 承压设备无损检测 第4部分:磁粉检测
- 湖北2024年湖北省高级人民法院及直属法院招聘雇员制审判辅助人员22人笔试历年典型考题及考点附答案解析
评论
0/150
提交评论