版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
成绩数学与计算机科学学院09级计算机应用专业毕业设计题目:J2ME手机游戏——SuDoKu数独年级专业:09级计算机应用(2)班学号:20095938姓名:谢平日期:2011年12月13日摘要J2ME(Java2MicroEdition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“WriteOnce,runanywhere”的Java特性而提高开发的效率。随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。特别是手机性能的逐渐增强,手机作为一个游戏平台越来越成熟了。本论文着眼于J2ME技术的应用,开发一款可用的手机游戏程序——数独。本文在介绍J2ME的相关技术的基础上,设计并实现了数独游戏。关键词:J2ME、手机游戏、Java、数独AbstractJ2MEisakindoffastdevelopingtechnologyimplementedonvariousdevicesespeciallymobilecommunicationequipments.Itfocusesonapplicationforconsumptiveelectronicproducts,providingrevolutionarysolutiontotheintelligentizationanddiversificationoftheequipment.Itimprovetheefficiencyofthedevelopmentprocessthankstoits“WriteOnce,runanywhere”nature.Whenmobilephoneisgettingevermorepopularnowadays,withtheimplementationofJavatechnologyonmobileequipment,incrementofcapitaloncommunicationserviceexhibitsitsforceonpeople’severydaylife,providingthemeverfastinformationjustinhand.Mobilephonewhosecapabilityisgreaterismoreandmorematureforgame.ThisdissertationfocusesonimplementationofJ2MEtechnologyandhasdevelopedacommercialgamesuiterunonmobilephones—sudoku.ThisarticleinintroducedthatJ2MEincorrelationtechnique'sfoundation,designedandhasrealizedofSodukugame.Keywords:J2ME;mobilegame;java;sudoku目录80451.引言 5141592.绪论 5221372.1手机软件现状 6138812.2手机游戏应具有的特征 6189902.3本游戏背景介绍 7296613.开发环境及相关技术的介绍 721993.1开发环境 735273.2J2ME简介 725753.3MIDletSuites简介 8122513.4MIDP类库 8296963.5.WTK2.5简介 10139914.数独游戏的策划和设计 11292764.1.生成数独题目的方法 11249454.2数独题目的变换 13261204.3.谜题数据的制作 13310884.4.利用回溯法求解数独 14224314.5.游戏的类结构 15164014.6.用户界面流程 16228255.主要模块设计 18174755.1.主类SuDoKuMIDlet类 1858275.1.1.闪屏界面 18325235.1.2.游戏菜单列表 1954485.1.3.继续游戏选项 19230405.1.4.填充完成后提示界面 20177995.3游戏菜单MenuList类 23190495.3.1.MenuList类得构造函数 23162075.3.2.游戏当前状态 23322965.3.3.菜单事件处理 24307275.4.总结 3523784参考文献: 3624475致谢: 引言虽然J2ME以开发交互式业务为主,属于战略性产品,备受产业连的重视,但是由于自从NOKIA的贪食蛇掀起手机游戏风潮之后,现在已经很难再想像一部时尚的手机里头没有游戏。随着手机从单色屏到灰度屏到彩屏,从蜂鸣器到扬声器,随着手机存储能力的加大和处理能力的加强,手机已经成为合情合理的游戏平台,越来越多的手机厂商和专业的游戏公司开始关注手机游戏这个潜在的市场。基于J2ME的通用解决方案,这种方案不仅仅可以提供高质量的游戏,而且可以提供全方位的软件服务。正是由于无线业务的蓬勃发展,和越来越多的无线厂商支持J2ME技术,J2ME也将拥有一个更广阔的发展空间。在这样的背景下,本文分析了数独游戏的基本原理和关键技术,利用WTK实现了数独游戏的部分模块。绪论2.1手机软件现状在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端:1.传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。2.传统手机访问互联网是通过WAP(WirelessApplicationProtocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。而Java技术在无线应用方面的优势非常明显:1.应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。2.Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI).3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。基于以上分析,Java手机将是未来手机的发展方向,是业界的热点。2.2手机游戏应具有的特征一个手机游戏应该具有以下特征:易于学习:既然手机游戏面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习游戏技巧,消费者不会花几个小时去研究一个3元的手动操作的游戏.保持游戏的简单是最基本的要求。可中断性:多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。基于订阅:手机游戏的盈利成功取决于他们巨大的使用量,一开始开发和设计每个游戏都是昂贵的,如果一个手机游戏开发者要赢利的话,重要的是:同一个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。丰富的社会交互:不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。利用手机技术的优点:巨额的手机技术研发费用都花在提高设备和网络的可用性和可靠性上面。因此,手机设备硬件和网络协议与桌面/控制台世界(如全球定位系统(GPS)扩展、条形码扫描仪、和短消息服务(SMS)/多媒体信息服务(MMS)通讯)有着非常大的差别。好的手机游戏应该利用那些更新的设备特征和网络基础设备的优点。2.3本游戏背景介绍相传数独源起于拉丁方阵(LatinSquare),1970年代在美国发展,改名为数字拼图(NumberPlace),之后流传至日本并发扬光大,以数字智力游戏智力拼图游戏发表。在1984年一本游戏杂志《パズル通信ニコリ》正式把它命名为数独,意思是“在每一格只有一个数字”。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。数独的玩法逻辑简单,数字排列方式千变万化,不少教育者认为数独是锻炼脑筋的好方法。开发环境及相关技术的介绍3.1开发环境操作系统:MicrosoftWindowsXP程序语言:Java2开发包:Java(TM)2StandardEdition(5.0)SunMicro.J2MEWirelessToolKitJ2ME简介Sun公司将J2ME定义为“一种以广泛的消费性产品为目标,高度优化的java运行时环境”。J2ME是为了那些使用有限能源,有限网络连接(正常是无线连接),以及有限图形用户界面的设备而开发的。J2ME不只是一个单独的技术规范,而是一系列技术规范的总称。这些规范定义了java技术在资源限制的设备中的表现形式,而且新规范的不断制定当中,并且这些规范的制定是完全向公众开放的。目前所说的手机游戏其实是其中规范的一种,即MIDP(移动信息设备规范),该规范应用最为普遍,因此习惯上也被人们笼统地称之为J2ME技术。J2ME主要应用于手机等小型嵌入式设备,这些设备由不同的厂商设计生产,功用千差万别。J2ME在应用于这些设备的同时也保留了java的传统特性,即任何时间和任何地点的代码有可移植性,部署灵活性,安全的网络传输性,以及代码稳定性。3.3MIDletSuites简介在制定MIDP规范过程中,最重要的一件事情就是定义一个MIDP应用程序的组成。换句话说,它应当回答任何开发人员都可能问的问题,比如,如何将程序正确下载到设备中?程序的入口在哪?设备如何识别该MIDP应用程序是自己想要的?同Applet类似,一个MIDP程序被称为“MIDlet”,MIDlet应用的主类需要从一个特殊的类(javax.microedition.midlet.MIDlet)中继承,并提供共用的默认的构造函数。一个或多个MIDlet打包在一起叫做MIDletSuite,其表现形式一个以“.jar”为后缀名的文件,这个JAR文件非常重要,它所包含的主要信息如下:包含MIDlet运行所需要的所有类,与Applet不同,MIDlet不运行在运行时下载其他类,而只运行在同一个MIDlet中的类。JAR的Mainfest是文本文件,用于描述JAR文件的内容,定义了在MIDlet中的重要信息,如名称,主类,图标等。其他资源文件,如使用的图像,声音文件。和JavaApplet类似,MIDlet应用程序在移动设备上运行时具有应用程序生命周期,显而易见,MIDlet可能处于以下3种状态:暂停,激活和终止状态。各种状态之间的转换规则如图2-1所示。3.4MIDP类库MIDP类库建立在CLDC类库基础之上,因此许多类库都来自J2SE。为了实现特定功能,MIDP增加了一些新的类库,这些类库描述如表2-1所示。核心类库类库描述java.io通过数据流提供系统的输入/输出java.langMIDP语言包,在CLDC中java.lang包的基础上增加了类(来自J2SE)java.lang.IllegalStateException。当有非法的转换请求时抛出这个异常,比如,在一个TimerTask安排中调用或者在用户界面组件容器中请求时java.utilMIDP工具栏,在CLDC中java.util包的基础之上增加了以下类(来自J2SE):•java.util.Timer•java.util.TimerTaskTimer用于安排一个后台线程使它在以后执行,TimeTask通过使用Timer安排一个单次执行的任务,或者以一定间隔重复执行的任务应用程序生命周期javax.micorediton.midletMidlet包定义了MIDP应用程序,以及应用程序和它所运行于环境之间的交互用户界面Javax.microedition.lcduijavax.microedition.lcdui.game为MIDP应用程序提供用户界面APE为MIDP应用程序提供游戏开发的高级API(MIDP2.0新增)持久存储javax.mircroedition.rms这个包用来为MIDlet提供持久存储的机制,应用程序可以存储数据,在以后需要的时候获取这些数据网络javax.mircroedition.ioMIDP提供了基于CLDC通用连接框架的网络支持,在CLDC这个包的基础之上,增加了类javax.microedition.io.HttpConnection,这个类用于建立HTTP连接在MIDP2.0中除了支持HTTP连接外,还支持HTTPS,报文,Socket通信及串口通信。另外,MIDP2.0还支持服务器Push体系架构公开密钥javax.microedition.pki提供用于鉴别安全网络信息的数字认证(MIDP2.0新增)声音媒体Javax.microedition.mediajavax.microedition.media.control该包为MIDP应用程序提供音,视频等多媒体功能,该包遵循JSR-135规范(MIDP2.0新增)该包为播放器提供了一些特定的控制功能(MIDP2.0新增)表2-1MIDP中的类库描述3.5.WTK2.5简介WTK(WirelessToolKit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。J2MEWTK包含了为能够支持MIDP设备开发应用程序所需要的全部工具。这些工具包含字节码与校验器(byte-codepreverifier),KToolbar,自带的模拟器,以及其他一些用来优化代码和监视程序的工具。在安装WTK2.5以前,需要安装JDK5(1.5)或者更高版本,安装完成需要添加环境变量:JAVA_HOME:C:\ProgramFiles\Java\jdk1.5.0_04classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\htmlconverter.jar在原来的path变量前添加%JAVA_HOME%\bin;WTK2.5新建的项目会产生源程序,资源和类库文件,其结构组成如表2-2所示。目录描述src\包含所有源程序文件res\包含所有的资源文件,如图片,声音,3D数据文件bin\包含JAR,JAD和未打包的Manifest(创建项目自动生成)lib\包含外部类库文件(JAR或者ZIP文件)tmplib\存放临时外部类库(临时目录,编译后生成)cmpclasses\使用JDK编译后的类文件(临时目录,编译后生成)classes\使用preverify预验证后的类文件(临时目录,编译后生成)表2-2项目文件的组织数独游戏的策划和设计4.1.生成数独题目的方法到底有多少个9×9的拉丁方阵呢?答案552475149615689284253122560个。但数独的规则除了每行每列都是1到9的数字外,数独的9个小宫格也都要是1到9不同的数字,所以要减少很多。直到2005年底,数学家贝米耳与罗斯坦才算出一共有6670903752021072936960种可能的数独谜题。由于同一个数独可以变形,如列变换,行变换,数字代码变换(比如1和5交换,2和8,3和4),重复前面几次之后,就分不清是来自同一个数独了,因此,如何产生一道数独题目呢?产生数独题目的方法是从答案反推题目。为了便于理解,可以先从2×2的4个四宫格(共16个宫格)开始思考,推论。先给出一个2×2个四宫格的数独解,为了方便解说,我把方阵内的数字位置分区块为A区(黄色),B区(绿色),C区(蓝色),D区(红色),如图3-1所示。推导数独题目的方法如下:1.任意选取一个方格,并将此空格内的数字挖掉。例如将(3,3)位置的数字4挖掉,如图3-2所示。2.观察B区得四宫格可以发现,不管(2,2)位置的数字4是否存在,为确定(4,1)位置挖掉的数字4,(3,1)位置的数字2必须存在,如图3-3所示。3.观察A区得四宫格,由于(3,1)位置的数字2已存在,为了要找到(1,2)位置的数字2,则(2,2)位置的数字4必须存在,如图3-4所示。4.观察C区得四宫格,由于(2,2)位置的数字4已存在,为了要找到(1,4)位置的数字4,则(1,3)位置的数字3必须存在,如图3-5所示。5.观察D区得四宫格,由于(1,3)位置的数字3已存在,为了要找到(3,4)位置的数字3,则(4,4)位置的数字1必须存在,如图3-6所示。4.2数独题目的变换经过以上5个步骤可以发现:只需要提供4个位置的数字就可以得出一个唯一解的数独谜题,如图3-7所示。另外通过以下形式的变换方式,仍然可以得出唯一解的数独谜题。行列变换:将同一四宫格内的行列变换,例如,将第1,2列互掉;第3,4列互掉;第1,2行互掉;第3,4列互掉,如图3-8和图3-9所示。标准的3×3个九宫格的数独谜题的推出原理与此相同,但过程复杂,在此不再赘述。数字替换:例如数字1换4;数字2换3;如图3-10所示。4.3.谜题数据的制作数独游戏使用到了81个宫格,因此首先联想到使用数组保存谜题数据。使用数组保存数据更加直观,但是如果用非常多的谜题,就会造成代码量庞大而且冗余。因此,使用字符串的格式来保存九宫格的数据。然而,新的问题出现了,通过前面的讨论我们可能发现,谜题的答案是9×9共81个数字,但给玩家的谜题只是其中的一部分,那么哪些数字应该显示,哪些数字不应该显示呢?这样是否应该使用两个字符串来保存一道谜题?通过类似加密的方法可以使这个问题迎刃而解,能够使用这种方法的前提是char字符类型的数据能够使用一个字符表示0到FFFF得Unicode码(可以把char字符看成是多进制的运算)。例如char字符是1,转化到int字符是49。为此,对谜题答案进行一定的处理(这里采用编码时加10的方法,读取时减10的方法),就能将谜题和空白区域区分开来。运行下面代码,完成了数字和字符的转换:for(inti=1;i<=9;i++){System.out.print(i);}System.out.println();for(inti=1;i++){System.out.print((char)(i+'0'));}两次的输出结果都是:123456789,但数据类型已经发生了变化。对原有数字加10,然后再转成char字符:for(inti=1;i<=9;i++){System.out.print((char)(i+10+'0'));}运行程序,原来的123456789通过加10再变换,变成了;<=>?@ABC,结果毫无规律,变得不可识别。4.4.利用回溯法求解数独回溯法有“通用解题法”之称,将所有的解(问题的解空间)按照一定结构排列,再进行搜索。一般解空间构造成为为树状结构,用深度优先的策略搜索,一般有两种方式:1.只需要一个解的话,找到解就停止。2.需要求所有解,则需做“树的遍历”找到所有解。回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。回溯法是一种搜索算法,其基本思路是:在一个问题中,根据题意给出的边界条件划定出所有可能解的范围(称为可能解),根据题意确定出约束条件。利用程序顺次在所有可能解中搜索时按照深度搜索的方式进行。即在第一层选定一个满足约束条件的解,然后以该可能解为出发点,搜索第二层的一个可能解(试探)。如果搜索到第二层的一个可能解,则继续搜索第三层得一个可能解。依次类推,直到所有层得可能解都被找到,则得到了该问题的一个完整解。如果第二层所有的肯可能解都不满足约束条件,则返回第一层,放弃原有的可能解,使用第一层的下一个可能解(回溯)。一次类推,寻找第二层的一个可能解。回溯法相对于其他穷举的特点在于,不必把问题的每一层的所有可能解都遍历一遍,只要当前的可能解不满足约束条件就抛弃该解,寻求下一个可能解,而不必求解其余的下层解。当当前层得所有可能解都不满足约束条件,则回溯到上一层,抛弃上一层的当前可能解。从以上分析中结合数独问题的规则,得出数独问题的约束条件为:每一格的数值范围仅限1-9每一格内的数字在当前行不允许重复每一格内的数字在当前列不允许重复每一格内的数字在当前小宫格内不允许重复由此,回溯法通过约束条件的筛选,在所有解中除掉不可能的解,从而获得问题的一个或者全部解。具体实现方法和代码会在后面章节详细说明。4.5.游戏的类结构整个游戏共由10个类组成,如图3-11所示是游戏的类结构。游戏的SuDoKuMIDlet类负责保持display对象,确保在各个屏幕之间切换。所切换的屏幕包括闪屏,菜单,游戏画布,游戏设置表单和游戏说明表单。游戏线程和屏幕绘制由SuDoKuCanvas画布类实现,屏幕绘制包括背景,宫格和数字,游戏循环每隔50ms绘制一次。游戏声效由SoundEffects类实现。游戏控制类SuDoKuModel衔接了游戏画布,游戏存储和游戏逻辑各个功能单元。使用这种结构能很好地保持各个类得抽象性和封装性,例如,逻辑类负责保持宫格数据,判断胜负;而画布类只负责绘制和接收键盘事件;游戏控制类起到中枢神经的功能。图3-11类结构4.6.用户界面流程游戏启动时,首先显示闪屏画面,等待3秒或者玩家按下任意键之后,进入游戏主菜单。菜单选项有“开始新游戏”“加载游戏”“游戏设置”“游戏说明”和“退出游戏”。玩家选择“开始新游戏”和“加载游戏”则显示游戏画布;玩家选择“游戏设置”,则进入游戏设置表单;玩家按下“游戏说明”则显示游戏说明画面;玩家选择“退出游戏”则退出整个游戏。整个游戏的界面切换流程如图3-12所示,主要的用户界面如图3-13所示。图3-12整个游戏的界面切换流程图主要模块设计5.1.主类SuDoKuMIDlet类5.1.1.闪屏界面游戏的主类为SuDoKuMIDlet类,该类继承了MIDlet类,用于在各个屏幕之间切换,并且实现各个功能的调用,是整个程序的中枢核心。游戏启动后显示游戏闪屏,闪屏由SplashScreen类实现,代码如下:publicvoidstartApp(){Displayablecurrent=Display.getDisplay(this).getCurrent();if(current==null){Display.getDisplay(this).setCurrent(newSplashScreen(this));//显示闪屏界面}}5.1.2.游戏菜单列表当闪屏画面结束之后,将创建并显示菜单,菜单由Menulist类实现,此时后台创建SuDoKuCanvas游戏画布:privateMenuListmenuList;//游戏菜单privateSuDoKuCanvasmyCanvas;//游戏画布publicvoidsplashScreenDone(){menuList=newMenuList(this);//创建游戏菜单myCanvas=newSuDoKuCanvas(this);//创建游戏画布Display.getDisplay(this).setCurrent(menuList);//显示游戏菜单} 游戏菜单有“开始新游戏”,“加载游戏”,“参数设置”,“游戏说明”,“退出游戏”,当玩家选中这些选项时,将会有相应的调用方法。5.1.3.继续游戏选项当玩家进入游戏后如果中途返回菜单,菜单会增加一项“继续游戏”,选择该项则返回游戏。中途返回菜单将停止计算时间,代码如下:publicvoidmenuListContinue(){Display.getDisplay(this).setCurrent(myCanvas);//显示游戏画布myCanvas.start();//启动游戏线程}从游戏,游戏帮助和参数设置界面返回菜单的代码如下,但是注意,从游戏中返回时调用了菜单对象的setGameActive()方法,该方法用于在菜单中插入“继续游戏”选项;当设置好游戏参数返回时,通过主类将参数从对象传递给游戏画布,可见主类起到了中介传递作用,这些方法代码如下:publicvoidgameBack(){menuList.setGameActive(true);//在菜单中插入继续游戏选项Display.getDisplay(this).setCurrent(menuList);//显示菜单}publicvoidmenuListContinue(){Display.getDisplay(this).setCurrent(menuList);//显示菜单myCanvas.start();}publicvoidoptionsBack(bytelevel,byteback,byteinput,bytemusic){myCanvas.setOptions(level,back,input,music);//将参数传递给游戏画布Display.getDisplay(this).setCurrent(menuList);//显示菜单}5.1.4.填充完成后提示界面当玩家填好方格内所有数字后,将对结果进行检测,将检测结果保存在布尔变量isSolved中,并且弹出提示框。如果玩家顺利完成了谜题,提示框中将显示玩家耗费的时间和难度级别,并恭喜玩家顺利通过;如果玩家填充了题目,却存在错误,提示框将显示失败图片,并请玩家继续努力。由于持续时间使用的是毫秒单位,还需将时间转换为小时,分,秒单位。由notifyGameOver()方法处理游戏完成,该方法代码如下:publicvoidnotifyGameOver(bytelevel,longgameDuration,booleanisSolved){StringstrTime;//时间字符串Strings;//提示字符串longtemp;//转换时间格式临时长整型变量temp=gameDuration/1000;//将毫秒转换成秒strTime=(gameDuration%60)+"秒";//获取秒if(temp>=60){temp=temp/60;strTime=(temp%60)+"分"+strTime;//获取分if(temp>=60){temp=temp/60;strTime=temp+"小时"+strTime;//获取小时}}if(isSolved)s="恭喜,在"+strTime+"内您顺利完成了本题!";elses="未能完成本题,请继续加油!";if(alert==null){alert=newAlert("游戏结束");//创建提示框alert.setTimeout(Alert.FOREVER);//等待用户确认后消失alert.setType(AlertType.INFO);}alert.setString(s);//设置提示框的文字内容ImageimgGameOver;if(isSolved)imgGameOver=createImage("/win.png");elseimgGameOver=createImage("/lose.png");alert.setImage(imgGameOver);menuList.setGameActive(false);Display.getDisplay(this).setCurrent(alert,menuList);}5.2.游戏闪屏游戏闪屏由SplashScreen类实现,该类继承了低级用户界面Cancas类,并且开启线程来等待用户确认,该类实现了Runnable接口。5.2.1.加载闪屏图片SplashScreen类得构造方法加载了闪屏图片,并且启动等待线程,由如下代码实现:SplashScreen(SuDoKuMIDletmidlet){this.midlet=midlet;imgSplash=midlet.createImage("/splash.png");//加载闪屏图片newThread(this).start();}5.2.2.绘制闪屏屏幕当显示闪屏画布时,将自动调用paint()方法,该方法将闪屏图片绘制到屏幕中心,绘制完成后将图片销毁,以便垃圾回收。代码如下:privateImageimgSplash;publicvoidpaint(Graphicsg){intCanvasWidth=getWidth();//获取屏幕宽度intCanvasHeight=getHeight();//获取屏幕高度if(imgSplash!=null){g.drawImage(imgSplash,CanvasWidth/2,CanvasHeight/2,Graphics.VCENTER|Graphics.HCENTER);//将图片绘制到屏幕中心imgSplash=null;}}5.2.3.闪屏的线程闪屏的线程等待3秒钟后取消闪屏,代码如下:publicvoidrun(){synchronized(this){try{wait(3000L);//等待3秒}catch(InterruptedExceptione){//捕捉线程中断异常}dismiss();}}5.2.4.闪屏的取消除了等待3秒外,玩家按下任意键也能取消闪屏,键盘处理调用画布类的keyPressed()方法,代码如下:publicsynchronizedvoidkeyPressed(intkeyCode){dismiss();}Dismiss()方法用于取消闪屏,取消闪屏的同时设置标志位,此时调用主类的splahScreenDone()方法,该方法将显示权交给游戏菜单。用如下方法实现:privatevolatilebooleanisDismissed=false;privatevoiddismiss(){if(!isDismissed){isDismissed=true;midlet.splashScreenDone();}}5.3游戏菜单MenuList类MenuList类继承了高级用户界面的List类,由于菜单属于IMPLICT(有软键组成的菜单),因此需要监听各个选项的选定事件,并且还实现了CommandListener接口。5.3.1.MenuList类得构造函数MenuList类得构造函数主要设置菜单名称和增加各个选项(软键),并监听选项的选择事件。构造函数的代码如下:MenuList(SuDoKuMIDletmidlet){super("数独",List.IMPLICIT);//设置菜单名称和List的类型this.midlet=midlet;append("开始新游戏",null);//添加选项append("加载游戏",null);append("参数设置",null);append("游戏说明",null);append("退出游戏",null);setCommandListener(this);//监听选中事件}5.3.2.游戏当前状态如果玩家在游戏过程中,中途返回菜单,此时玩家会发现菜单中多了”继续游戏“选项。该功能由setGameActive()方法实现。当玩家在游戏过程中按下”返回菜单“软键,则会调用主类的gameBack()方法,该方法先调用菜单的setGameActive()方法,方法的布尔参数active设置为true,表示游戏进行中,需要增加”继续游戏“选项,然后才显示菜单,该方法的代码如下:privatebooleangameActive=false;voidsetGameActive(booleanactive){if(active&&!gameActive){gameActive=true;insert(0,"继续游戏",null);//插入继续游戏选项}elseif(!active&&gameActive){gameActive=false;delete(0);//删除继续游戏选项}}5.3.3.菜单事件处理前面提到,游戏菜单实际上由众多软键组成,所以菜单选项的选择和软键的选择处理方法类似,所不同的是List将各个软键看成一个软键,然后用索引的方式具体处理各个子选项。响应软键事件的代码如下:publicvoidcommandAction(Commandc,Displayabled){if(c==List.SELECT_COMMAND)//如果发生菜单事件{intindex=getSelectedIndex();//获取选中选项的索引if(index!=-1)//shouldneverbe-1//不可能为-1{if(!gameActive){index++;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年环境污染治理技术与工程合同
- 2024年特许连锁合同:美容护肤品牌连锁经营
- 船舶英语课程设计
- 液压课程设计集成块
- 统计表微课程设计
- 箱盖机械制造课程设计
- 文科课程设计个人日志
- 背景图高级课程设计
- 物体旋转课程设计思路
- 体育行业市场拓展总结
- 中国古代文学史PPT完整PPT完整全套教学课件
- (完整版)人教版高中物理新旧教材知识对比
- 最好用高速公路机电维修手册
- 家庭管理量表(FaMM)
- 土默特右旗高源矿业有限责任公司高源煤矿2022年度矿山地质环境年度治理计划
- 【金属非金属矿山(地下矿山)安全管理人员】考题
- 神经外科手术的ERAS管理策略
- mt煤矿用氮气防灭火技术
- ASTM-B117-16-盐雾实验仪的标准操作规程(中文版)
- 【超星尔雅学习通】《老子》《论语》今读网课章节答案
- 配电箱采购技术要求
评论
0/150
提交评论