J2ME 手机游戏——SuDoKu数独毕业论文_第1页
J2ME 手机游戏——SuDoKu数独毕业论文_第2页
J2ME 手机游戏——SuDoKu数独毕业论文_第3页
J2ME 手机游戏——SuDoKu数独毕业论文_第4页
J2ME 手机游戏——SuDoKu数独毕业论文_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、j2mej2me 手机游戏手机游戏sudoku 数独数独 目目 录录 1. 引言引言.5 2. 绪论绪论.5 2.1 手机软件现状 .6 2.2 手机游戏应具有的特征 .6 2.3 本游戏背景介绍 .7 3. 开发环境及相关技术的介绍开发环境及相关技术的介绍.7 3.1 开发环境.7 3.2 j2me 简介.7 3.3 midlet suites简介 .8 3.4 midp 类库.8 3.5. wtk2.5 简介.10 4. 数独游戏的策划和设计数独游戏的策划和设计.11 4.1.生成数独题目的方法.11 4.2 数独题目的变换 .13 4.3.谜题数据的制作.13 4.4.利用回溯法求解数独

2、.14 4.5.游戏的类结构.15 4.6.用户界面流程.16 5. 主要模块设计主要模块设计.18 5.1.主类 sudokumidlet类.18 5.1.1.闪屏界面.18 5.1.2.游戏菜单列表.19 5.1.3. 继续游戏选项.19 5.1.4.填充完成后提示界面.20 5.2.游戏闪屏.21 5.2.1.加载闪屏图片.21 5.2.2.绘制闪屏屏幕.21 5.2.3.闪屏的线程.22 5.2.4.闪屏的取消.22 5.3 游戏菜单 menulist类.23 5.3.1.menulist 类得构造函数 .23 5.3.2.游戏当前状态.23 5.3.3.菜单事件处理.24 5.4.游

3、戏画布 sudokucanvas类的实现.25 5.4.1. sudokucanvas 类的构造函数.25 5.4.2.设置游戏参数.26 5.4.3.填充数字.26 5.4.4.游戏线程.27 5.4.5.键盘处理和绘制屏幕.27 5.4.6.显示答案.28 5.4.7.软键事件响应.28 5.5.游戏控制的实现.28 5.5.1.游戏难度和输入方式.29 5.5.2.谜题的产生.29 5.5.3.保存加载和开始新游戏.32 5.6.数独逻辑 sudokulogic类.32 5.6.1.填充和清空宫格.33 5.6.2.检测填充结果.33 5.7.总结.35 参考文献:参考文献:.36 英文

4、摘要:英文摘要:.36 致谢:致谢:.37 英文摘要:英文摘要: abstract: j2me is a kind of fast developing technology implemented on various devices especially mobile communication equipments. it focuses on application for consumptive electronic products, providing revolutionary solution to the intelligentization and diversifica

5、tion of the equipment. it improve the efficiency of the development process thanks to its “write once, run anywhere” nature. when mobile phone is getting ever more popular nowadays, with the implementation of java technology on mobile equipment, increment of capital on communication service exhibits

6、 its force on peoples everyday life, providing them ever fast information just in hand. mobile phone whose capability is greater is more and more mature for game. this dissertation focuses on implementation of j2me technology and has developed a commercial game suite run on mobile phones sudoku. thi

7、s article in introduced that j2me in correlation techniques foundation, designed and has realized of soduku game. keywords: j2me; mobile game;java; sudoku j2mej2me 手机游戏手机游戏sudokusudoku 数独数独 摘要:摘要:j2me(java 2 micro edition) 是近年来随着各种不同设备,尤其是移动通 信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应 用上,对设备的智能化、多样化,提供了革命性的

8、解决方案,并因其“write once, run anywhere”的 java 特性而提高开发的效率。 随着手机的日益普及、java 功能在移动设备上的实现,java 应用程序产生 的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资 讯起着不可忽视的作用。特别是手机性能的逐渐增强,手机作为一个游戏平台 越来越成熟了。本论文着眼于 j2me 技术的应用,开发一款可用的手机游戏程 序数独。 本文在介绍 j2me 的相关技术的基础上,设计并实现了数独游戏。 关键字:关键字:j2me、手机游戏、java 、数独 1. 引言引言 虽然 j2me 以开发交互式业务为主,属于战略性产品,

9、备受产业连的重视, 但是由于自从 nokia 的贪食蛇掀起手机游戏风潮之后,现在已经很难再想像 一部时尚的手机里头没有游戏。随着手机从单色屏到灰度屏到彩屏,从蜂鸣器 到扬声器,随着手机存储能力的加大和处理能力的加强,手机已经成为合情合 理的游戏平台,越来越多的手机厂商和专业的游戏公司开始关注手机游戏这个 潜在的市场。基于 j2me 的通用解决方案,这种方案不仅仅可以提供高质量的 游戏,而且可以提供全方位的软件服务。正是由于无线业务的蓬勃发展,和越 来越多的无线厂商支持 j2me 技术,j2me 也将拥有一个更广阔的发展空间。 在这样的背景下,本文分析了数独游戏的基本原理和关键技术,利用 wtk

10、 实现了数独游戏的部分模块。 2. 绪论绪论 2.1 手机软件现状手机软件现状 在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生 活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是 传统手机存在以下弊端: 1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了 错误也不能更新、修改,若要增加新功能必须另换一部手机。 2. 传统手机访问互联网是通过 wap(wireless application protocal),所有 网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。 而 java 技术在无线应用方面的优势非常明显: 1. 应用程序可按需

11、下载,而不是购买由硬件商提供的套件,可升级空间 大。 2. java 技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰 富的用户界面(gui). 3. java 技术使网络带宽的应用更为有效,因为应用程序可以下载到器件 上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。 基于以上分析,java 手机将是未来手机的发展方向,是业界的热点。 2.2 手机游戏应具有的特征手机游戏应具有的特征 一个手机游戏应该具有以下特征: 易于学习: 既然手机游戏面向的是普通消费者而不是计算机专家,那么他 们不可能深入的学习游戏技巧,消费者不会花几个小时去研究一个 3 元的手动操 作的游戏.保持游戏

12、的简单是最基本的要求。 可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务 (如等一个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯 和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间 的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。 基于订阅:手机游戏的盈利成功取决于他们巨大的使用量,一开始开发和设 计每个游戏都是昂贵的,如果一个手机游戏开发者要赢利的话,重要的是:同一 个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收 入的最好方法。 丰富的社会交互: 不管一个游戏设计得多好,只要玩家找到了它的根本模 式或者玩完了所有的

13、游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游 戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复 杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。 利用手机技术的优点: 巨额的手机技术研发费用都花在提高设备和网络的 可用性和可靠性上面。因此,手机设备硬件和网络协议与桌面/控制台世界(如 全球定位系统(gps)扩展、条形码扫描仪、和短消息服务(sms)/多媒体信息服务 (mms)通讯)有着非常大的差别。好的手机游戏应该利用那些更新的设备特征 和网络基础设备的优点。 2.3 本游戏背景介绍本游戏背景介绍 相传数独源起于拉丁方阵(latin square),1970 年代

14、在美国发展,改名为 数字拼图(number place),之后流传至日本并发扬光大,以数字智力游戏智力 拼图游戏发表。在 1984 年一本游戏杂志通信正式把它命名为 数独,意思是“在每一格只有一个数字”。拼图是九宫格(即 3 格宽3 格高) 的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上 1 至 9 的数字,让整个大九宫格每一列、每一行的数字都不重复。 数独的玩法逻 辑简单,数字排列方式千变万化,不少教育者认为数独是锻炼脑筋的好方法。 3. 开发环境及相关技术的介绍开发环境及相关技术的介绍 3.1 开发环境开发环境 操作系统:microsoft windows xp 程序语

15、言:java 2 开 发 包:java(tm) 2 standard edition (5.0) sun micro. j2me wireless tool kit 2.5.2 3.2 j2me 简介简介 sun 公司将 j2me 定义为“一种以广泛的消费性产品为目标,高度优化的 java 运行时环境”。j2me 是为了那些使用有限能源,有限网络连接(正常是无 线连接),以及有限图形用户界面的设备而开发的。 j2me 不只是一个单独的技术规范,而是一系列技术规范的总称。这些规 范定义了 java 技术在资源限制的设备中的表现形式,而且新规范的不断制定当 中,并且这些规范的制定是完全向公众开放的

16、。目前所说的手机游戏其实是其 中规范的一种,即 midp(移动信息设备规范),该规范应用最为普遍,因此 习惯上也被人们笼统地称之为 j2me 技术。 j2me 主要应用于手机等小型嵌入式设备,这些设备由不同的厂商设计生 产,功用千差万别。j2me 在应用于这些设备的同时也保留了 java 的传统特性, 即任何时间和任何地点的代码有可移植性,部署灵活性,安全的网络传输性, 以及代码稳定性。 3.3 midlet suites 简介简介 在制定 midp 规范过程中,最重要的一件事情就是定义一个 midp 应用程 序的组成。换句话说,它应当回答任何开发人员都可能问的问题,比如,如何 将程序正确下载

17、到设备中?程序的入口在哪?设备如何识别该 midp 应用程序 是自己想要的? 同 applet 类似,一个 midp 程序被称为“midlet”,midlet 应用的主类需 要从一个特殊的类(javax.microedition.midlet.midlet)中继承,并提供共用的默 认的构造函数。一个或多个 midlet 打包在一起叫做 midlet suite,其表现形式 一个以“.jar”为后缀名的文件,这个 jar 文件非常重要,它所包含的主要信息 如下: 包含 midlet 运行所需要的所有类,与 applet 不同,midlet 不运行在运行 时下载其他类,而只运行在同一个 midle

18、t 中的类。 jar 的 mainfest 是文本文件,用于描述 jar 文件的内容,定义了在 midlet 中的重要信息,如名称,主类,图标等。 其他资源文件,如使用的图像,声音文件。 和 java applet 类似,midlet 应用程序在移动设备上运行时具有应用程序生 命周期,显而易见,midlet 可能处于以下 3 种状态:暂停,激活和终止状态。 各种状态之间的转换规则如图 2-1 所示。 3.4 midp 类库类库 midp 类库建立在 cldc 类库基础之上, 因此许多类库都来自 j2se。为了实现特定功能, midp 增加了一些新的类库,这些类库描述如 表 2-1 所示。 核心

19、类库类库描述 java.io通过数据流提供系统的输入/输出 java.langmidp 语言包,在 cldc 中 java.lang 包的基础 上增加了类(来自 j2se) java.lang.illegalstateexception。当有非法的转换请求 时抛出这个异常,比如,在一个 timertask 安排中调 用或者在用户界面组件容器中请求时 java.utilmidp 工具栏,在 cldc 中 java.util 包的基础之 上增加了以下类(来自 j2se): java.util.timer java.util.timertask timer 用于安排一个后台线程使它在以后执行, ti

20、metask 通过使用 timer 安排一个单次执行的任务, 或者以一定间隔重复执行的任务 应用程序生命周期 javax.micorediton.mi dlet midlet 包定义了 midp 应用程序,以及应用程序 和它所运行于环境之间的交互 用户界面 javax.microedition.lc dui javax.microedition.lc dui.game 为 midp 应用程序提供用户界面 ape 为 midp 应用程序提供游戏开发的高级 api(midp2.0 新增) 持久存储 javax.mircroedition.r ms 这个包用来为 midlet 提供持久存储的机制,应

21、 用程序可以存储数据,在以后需要的时候获取这些数 据 网络 javax.mircroedition.i o midp 提供了基于 cldc 通用连接框架的网络支 持,在 cldc 这个包的基础之上,增加了类 javax.microedition.io.httpconnection,这个类用于建 立 http 连接 在 midp2.0 中除了支持 http 连接外,还支持 https,报文,socket 通信及串口通信。另外, midp2.0 还支持服务器 push 体系架构 公开密钥 javax.microedition.p ki 提供用于鉴别安全网络信息的数字认证 (midp2.0 新增)

22、声音媒体 javax.microedition.m edia javax.microedition.m edia.control 该包为 midp 应用程序提供音,视频等多媒体功 能,该包遵循 jsr-135 规范(midp 2.0 新增) 该包为播放器提供了一些特定的控制功能 (midp2.0 新增) 表 21 midp 中的类库描述 3.5. wtk2.5 简介简介 wtk(wireless tool kit)是 sun 公司针对 j2me 推出的用于手机和 palm 等 移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。 它通用性高,开发出的应用程序可保证能运行在大部分

23、设备上,而不像专用厂 商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供 运行模拟器的最基本组件,是其他 ide 需集成采用的必备元素。 j2me wtk 包含了为能够支持 midp 设备开发应用程序所需要的全部工具。 这些工具包含字节码与校验器(byte-code preverifier),ktoolbar,自带的模拟器, 以及其他一些用来优化代码和监视程序的工具。 在安装 wtk2.5 以前,需要安装 jdk 5 (1.5)或者更高版本,安装完成 需要添加环境变量: java_home: c:program filesjavajdk1.5.0_04 classpath:

24、.;%java_home%libdt.jar;%java_home%libtools.jar; %java_home%libhtmlconverter.jar 在原来的 path 变量前添加 %java_home%bin; wtk2.5 新建的项目会产生源程序,资源和类库文件,其结构组成如表 2-2 所示。 目 录描 述 src包含所有源程序文件 res包含所有的资源文件,如图片,声音,3d 数据文 件 bin包含 jar,jad 和未打包的 manifest(创建项目自 动生成) lib包含外部类库文件(jar 或者 zip 文件) tmplib存放临时外部类库(临时目录,编译后生成) cm

25、pclasses使用 jdk 编译后的类文件(临时目录,编译后生 成) classes使用 preverify 预验证后的类文件(临时目录,编 译后生成) 表 22 项目文件的组织 4. 数独游戏的策划和设计数独游戏的策划和设计 4.1.生成数独题目的方法生成数独题目的方法 到底有多少个 99 的拉丁方阵呢?答案 552475149615689284253122560 个。 但数独的规则除了每行每列都是 1 到 9 的数字外,数独的 9 个小宫格也都要是 1 到 9 不同的数字,所以要减少很多。直到 2005 年底,数学家贝米耳与罗斯坦 才算出一共有 667090375202107293696

26、0 种可能的数独谜题。 由于同一个数独可以变形,如列变换,行变换,数字代码变换(比如 1 和 5 交换,2 和 8,3 和 4.),重复前面几次之后,就分不清是来自同一个数独 了,因此,如何产生一道数独题目呢?产生数独题目的方法是从答案反推题目。 为了 便于理解,可以先从 22 的 4 个四宫格(共 16 个宫格)开始思考,推论。 先给出一个 22 个四宫格的数独解,为了方便解说,我把方阵内的数字位 置分区块为 a 区(黄色),b 区(绿色),c 区(蓝色),d 区(红色),如 图 3-1 所示。 推导数独题目的方法如下: 1.任意选取一个方格,并将此空格内的数字挖掉。例如将(3,3)位置的数

27、 字 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 已存在,为

28、了要找到 (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 所示。标准的 33 个 九宫格的数独谜题的推出原理与此相同,但过程复杂,在此不再赘述。 数字替换:例如数字 1 换 4;数字 2 换 3;

29、如图 3-10 所示。 4.3.谜题数据的制作谜题数据的制作 数独游戏使用到了 81 个宫格,因此首先联想到使用数组保存谜题数据。使 用数组保存数据更加直观,但是如果用非常多的谜题,就会造成代码量庞大而 且冗余。因此,使用字符串的格式来保存九宫格的数据。 然而,新的问题出现了,通过前面的讨论我们可能发现,谜题的答案是 99 共 81 个数字,但给玩家的谜题只是其中的一部分,那么哪些数字应该显 示,哪些数字不应该显示呢?这样是否应该使用两个字符串来保存一道谜题? 通过类似加密的方法可以使这个问题迎刃而解,能够使用这种方法的前提 是 char 字符类型的数据能够使用一个字符表示 0 到 ffff

30、得 unicode 码(可以 把 char 字符看成是多进制的运算)。例如 char 字符是 1,转化到 int 字符是 49。 为此,对谜题答案进行一定的处理(这里采用编码时加 10 的方法,读取时 减 10 的方法),就能将谜题和空白区域区分开来。运行下面代码,完成了数字 和字符的转换: for (int i = 1;i=9;i+) system.out.print(i); system.out.println(); for (int i= 1;i+) system.out.print(char)(i + 0); 两次的输出结果都是:123456789,但数据类型已经发生了变化。 对原有数

31、字加 10,然后再转成 char 字符: for (int i = 1;i=9;i+) system.out.print(char)(i + 10+0); 运行程序,原来的 123456789 通过加 10 再变换,变成了;?abc,结 果毫无规律,变得不可识别。 4.4.利用回溯法求解数独利用回溯法求解数独 回溯法有“通用解题法”之称,将所有的解(问题的解空间)按照一定结 构排列,再进行搜索。一般解空间构造成为为树状结构,用深度优先的策略搜 索,一般有两种方式: 1.只需要一个解的话,找到解就停止。 2.需要求所有解,则需做“树的遍历”找到所有解。 回溯法的基本做法是搜索,或是一种组织得井井

32、有条的,能避免不必要搜 索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间 树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如 果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯; 否则,进入该子树,继续按深度优先策略搜索。 回溯法是一种搜索算法,其基本思路是:在一个问题中,根据题意给出的 边界条件划定出所有可能解的范围(称为可能解),根据题意确定出约束条件。 利用程序顺次在所有可能解中搜索时按照深度搜索的方式进行。即在第一层选 定一个满足约束条件的解,然后以该可能解为出发点,搜索第二层

33、的一个可能 解(试探)。如果搜索到第二层的一个可能解,则继续搜索第三层得一个可能 解。依次类推,直到所有层得可能解都被找到,则得到了该问题的一个完整解。 如果第二层所有的肯可能解都不满足约束条件,则返回第一层,放弃原有的可 能解,使用第一层的下一个可能解(回溯)。一次类推,寻找第二层的一个可 能解。 回溯法相对于其他穷举的特点在于,不必把问题的每一层的所有可能解都 遍历一遍,只要当前的可能解不满足约束条件就抛弃该解,寻求下一个可能解, 而不必求解其余的下层解。当当前层得所有可能解都不满足约束条件,则回溯 到上一层,抛弃上一层的当前可能解。 从以上分析中结合数独问题的规则,得出数独问题的约束条件

34、为: 每一格的数值范围仅限 1-9 每一格内的数字在当前行不允许重复 每一格内的数字在当前列不允许重复 每一格内的数字在当前小宫格内不允许重复 由此,回溯法通过约束条件的筛选,在所有解中除掉不可能的解,从而获 得问题的一个或者全部解。具体实现方法和代码会在后面章节详细说明。 4.5.游戏的类结构游戏的类结构 整个游戏共由 10 个类组成,如图 3-11 所示是游戏的类结构。游戏的 sudokumidlet 类负责保持 display 对象,确保在各个屏幕之间切换。所切换的 屏幕包括闪屏,菜单,游戏画布,游戏设置表单和游戏说明表单。 游戏线程和屏幕绘制由 sudokucanvas 画布类实现,屏

35、幕绘制包括背景, 宫格和数字,游戏循环每隔 50ms 绘制一次。游戏声效由 soundeffects 类实现。 游戏控制类 sudokumodel 衔接了游戏画布,游戏存储和游戏逻辑各个功能单 元。使用这种结构能很好地保持各个类得抽象性和封装性,例如,逻辑类负责 保持宫格数据,判断胜负;而画布类只负责绘制和接收键盘事件;游戏控制类 起到中枢神经的功能。 sudokumidletsplashscreen menulist sudokucanvas optionscreen instructionsscreen sudokumodel soundeffects sudokulogic sudoku

36、store 主类 游戏闪屏 游戏菜单 画布 游戏设置 游戏说明 游戏控制 声效 游戏逻辑 存储 图 3-11 类结构 4.6.用户界面流程用户界面流程 游戏启动时,首先显示闪屏画面,等待 3 秒或者玩家按下任意键之后,进 入游戏主菜单。菜单选项有“开始新游戏”“加载游戏”“游戏设置”“游戏 说明”和“退出游戏”。 玩家选择“开始新游戏”和“加载游戏”则显示游戏画布;玩家选择“游 戏设置”,则进入游戏设置表单;玩家按下“游戏说明”则显示游戏说明画面; 玩家选择“退出游戏”则退出整个游戏。 整个游戏的界面切换流程如图 3-12 所示,主要的用户界面如图 3-13 所示。 游戏闪屏 确定 游戏菜单

37、游戏设置 游戏说明 游戏画布退出 启动 图 3-12 整个游戏的界面切换流程图 图 3-13 游戏主要的用户界面 5. 主要模块设计主要模块设计 5.1.主类主类 sudokumidlet 类类 5.1.1.闪屏界面 游戏的主类为 sudokumidlet 类,该类继承了 midlet 类,用于在各个屏幕 之间切换,并且实现各个功能的调用,是整个程序的中枢核心。游戏启动后显 示游戏闪屏,闪屏由 splashscreen 类实现,代码如下: public void startapp() displayable current = display.getdisplay(this).getcurre

38、nt(); if (current = null) display.getdisplay(this).setcurrent(new splashscreen(this); /显示闪屏界面 5.1.2.游戏菜单列表 当闪屏画面结束之后,将创建并显示菜单,菜单由 menulist 类实现,此时 后台创建 sudokucanvas 游戏画布: private menulist menulist; /游戏菜单 private sudokucanvas mycanvas; /游戏画布 public void splashscreendone() menulist = new menulist(this)

39、; /创建游戏菜单 mycanvas = new sudokucanvas(this); /创建游戏画布 display.getdisplay(this).setcurrent(menulist); /显示游戏菜单 游戏菜单有“开始新游戏”,“加载游戏”,“参数设置”,“游戏说明” ,“退出游戏”,当玩家选中这些选项时,将会有相应的调用方法。 5.1.3. 继续游戏选项 当玩家进入游戏后如果中途返回菜单,菜单会增加一项“继续游戏”,选 择该项则返回游戏。中途返回菜单将停止计算时间,代码如下: public void menulistcontinue() display.getdisplay(t

40、his).setcurrent(mycanvas);/显示游戏画布 mycanvas.start(); /启动游戏线程 从游戏,游戏帮助和参数设置界面返回菜单的代码如下,但是注意,从游 戏中返回时调用了菜单对象的 setgameactive()方法,该方法用于在菜单中插入 “继续游戏”选项;当设置好游戏参数返回时,通过主类将参数从对象传递给 游戏画布,可见主类起到了中介传递作用,这些方法代码如下: public void gameback() menulist.setgameactive(true);/在菜单中插入继续游戏选项 display.getdisplay(this).setcurre

41、nt(menulist);/显示菜单 public void menulistcontinue() display.getdisplay(this).setcurrent(menulist);/显示菜单 mycanvas.start(); public void optionsback(byte level,byte back,byte input,byte music) mycanvas.setoptions(level,back,input,music);/将参数传递给游戏画布 display.getdisplay(this).setcurrent(menulist);/显示菜单 5.1.

42、4.填充完成后提示界面 当玩家填好方格内所有数字后,将对结果进行检测,将检测结果保存在布 尔变量 issolved 中,并且弹出提示框。如果玩家顺利完成了谜题,提示框中将 显示玩家耗费的时间和难度级别,并恭喜玩家顺利通过;如果玩家填充了题目, 却存在错误,提示框将显示失败图片,并请玩家继续努力。 由于持续时间使用的是毫秒单位,还需将时间转换为小时,分,秒单位。 由 notifygameover()方法处理游戏完成,该方法代码如下: public void notifygameover(byte level,long gameduration,boolean issolved) string s

43、trtime; /时间字符串 string s; /提示字符串 long temp; /转换时间格式临时长整型变量 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=恭喜,在+str

44、time+内您顺利完成了本题!; else s=未能完成本题,请继续加油!; if (alert = null) alert = new alert (游戏结束); /创建提示框 alert.settimeout (alert.forever); /等待用户确认后消失 alert.settype (alerttype.info); alert.setstring (s); /设置提示框的文字内容 image imggameover; if(issolved)imggameover = createimage(/win.png); else imggameover = createimage(/

45、lose.png); alert.setimage(imggameover); menulist.setgameactive(false); display.getdisplay(this).setcurrent (alert, menulist); 5.2.游戏闪屏游戏闪屏 游戏闪屏由 splashscreen 类实现,该类继承了低级用户界面 cancas 类,并 且开启线程来等待用户确认,该类实现了 runnable 接口。 5.2.1.加载闪屏图片 splashscreen 类得构造方法加载了闪屏图片,并且启动等待线程,由如下 代码实现: splashscreen( sudokumidl

46、et midlet) this.midlet = midlet; imgsplash = midlet.createimage(/splash.png);/加载闪屏图片 new thread(this).start(); 5.2.2.绘制闪屏屏幕 当显示闪屏画布时,将自动调用 paint()方法,该方法将闪屏图片绘制到屏 幕中心,绘制完成后将图片销毁,以便垃圾回收。代码如下: private image imgsplash; public void paint(graphics g) int canvaswidth = getwidth(); /获取屏幕宽度 int canvasheight

47、= getheight(); /获取屏幕高度 if (imgsplash != null) g.drawimage(imgsplash,canvaswidth/2, canvasheight/2, graphics.vcenter | graphics.hcenter);/将图片绘制到屏幕 中心 imgsplash = null; 5.2.3.闪屏的线程 闪屏的线程等待 3 秒钟后取消闪屏,代码如下: public void run() synchronized(this) try wait(3000l); /等待 3 秒 catch (interruptedexception e) /捕捉线

48、程中断异常 dismiss(); 5.2.4.闪屏的取消 除了等待 3 秒外,玩家按下任意键也能取消闪屏,键盘处理调用画布类的 keypressed()方法,代码如下: public synchronized void keypressed(int keycode) dismiss(); dismiss()方法用于取消闪屏,取消闪屏的同时设置标志位,此时调用主类 的 splahscreendone()方法,该方法将显示权交给游戏菜单。用如下方法实现: private volatile boolean isdismissed = false; private void dismiss() if

49、(!isdismissed) isdismissed = true; midlet.splashscreendone(); 5.3 游戏菜单游戏菜单 menulist 类类 menulist 类继承了高级用户界面的 list 类,由于菜单属于 implict(有软 键组成的菜单),因此需要监听各个选项的选定事件,并且还实现了 commandlistener 接口。 5.3.1.menulist 类得构造函数 menulist 类得构造函数主要设置菜单名称和增加各个选项(软键),并监 听选项的选择事件。构造函数的代码如下: menulist(sudokumidlet midlet) super(

50、数独, list.implicit); /设置菜单名称和 list 的类型 this.midlet = midlet; append(开始新游戏, null); /添加选项 append(加载游戏, null); append(参数设置, null); append(游戏说明, null); append(退出游戏, null); setcommandlistener(this); /监听选中事件 5.3.2.游戏当前状态 如果玩家在游戏过程中,中途返回菜单,此时玩家会发现菜单中多了”继 续游戏“选项。该功能由 setgameactive()方法实现。 当玩家在游戏过程中按下”返回菜单“软键,

51、则会调用主类的 gameback() 方法,该方法先调用菜单的 setgameactive()方法,方法的布尔参数 active 设置 为 true,表示游戏进行中,需要增加”继续游戏“选项,然后才显示菜单,该 方法的代码如下: private boolean gameactive = false; void setgameactive(boolean active) if (active insert(0, 继续游戏, null); /插入继续游戏选项 else if (!active delete(0); /删除继续游戏选项 5.3.3.菜单事件处理 前面提到,游戏菜单实际上由众多软键组成

52、,所以菜单选项的选择和软键 的选择处理方法类似,所不同的是 list 将各个软键看成一个软键,然后用索引 的方式具体处理各个子选项。响应软键事件的代码如下: public void commandaction(command c, displayable d) if (c = list.select_command)/如果发生菜单事件 int index = getselectedindex();/获取选中选项的索引 if (index != -1) / should never be -1/不可能为-1 if (!gameactive) index+; switch (index) /根据索

53、引调用主类的不同方法 case 0: midlet.menulistcontinue();/继续游戏 break; case 1: midlet.menulistnewgame();/开始新游戏 break; case 2: midlet.menulistloadgame();/加载游戏 break; case 3: midlet.menulistoptions();/设置参数 break; case 4: midlet.menulistinstructions();/游戏说明 break; case 5: midlet.quit(); /退出游戏 break; default: break;

54、 5.4.游戏画布游戏画布 sudokucanvas 类的实现类的实现 sudokucanvas 类实现了游戏画布,也是玩家进行游戏的界面。该类继承 了 canvas 类,由于使用了软键和线程,因此还实现了 commandlistener 和 runnable 接口。 5.4.1. sudokucanvas 类的构造函数 构造函数根据屏幕宽度计算所采用的字体大小,可能选择的字体尺寸为 8,10,12,16,24,选择的标准是宫格的大小不能超出屏幕。例如屏幕的宽度是 240,如果选择尺寸为 24,那么 249+1=217240,没有超出屏幕尺寸。如图 4-1 所示。 图 4-1 数字的选择和尺寸

55、大小 5.4.2.设置游戏参数 游戏参数由 optionscreen 表单设置,设置好后通过主类传递给游戏画布, 主类调用 sudokucanvas 类得 setoption()方法设置参数,这些参数包括游戏难 度,背景索引,输入模式和声音效果。该方法的代码如下: public void setoptions (byte level,byte back,byte input,byte music) model.setinputmode(input);/游戏控制类设置输入模式 if (back = 1) public void setlevel(byte level) /设置难度等级 if (l

56、evel=difficult|level=easy) this.level = level; 5.5.2.谜题的产生 游戏每关提供了 40 个谜题,共 80 个基础谜题。每个基础谜题可以通过变 形产生新的谜题,这些谜题存储在字符串中。 protected static final byte num = 40;/每个等级的谜题数量 protected static final string strpuzzles = /谜题字符串 ;9?87684179523=a5b26;4c593782?16c45a 3;b45168379273b6?, ;31?485=75818?914a=6731?6bc4

57、46;bc357? a82=6419319457b, ;985?72813936?9a1b221c83?768?=762c;464a9;538389a9 517b42=7b43c65;, /后面省略 sudokumodel 类的一个重要功能是生成谜题,前面给出基本题型,但通过 交换同一九宫格内的行列,以及对 9 个数字进行任意排列,会产生新的谜题, 这样极大地减少了出线同样谜题的可能。对谜题进行交换的方法 shuffle()代码 如下: protected string shuffle(string s) /用给定的字符串产生新的数独谜题 string sreturn = s; byte ba

58、; byte b, t, i, j; for (b = 0; b 3; b+) ba = getshuffledarray( (byte) 3);/随机产生同一九宫格内列的交换方 式 sreturn = swapcols(s, ba, b);/交换列 ba = getshuffledarray( (byte) 3);/随机产生同一九宫格内行的交换方 式 sreturn = swaprows(s, ba, b);/交换行 ba = getshuffledarray( (byte) 9);/随机产生 9 个数字的交换方式 sreturn = swapnumbers(sreturn, ba);/交换

59、九宫格内的数字 return sreturn; /返回处理后的字符串 getshuffledarray()方法产生 0 到 n-1 数字内的任意排列,例如 0、1、2 的排 列可能是 0、2、1 和 2、1、0 具体排列方式由随机数产生。所得的排列方式用 来对数独单元格的行、列及九宫格进行交换。 protected byte getshuffledarray(byte n) byte bareturn = new byten; byte b, t, i, j; for (b = 0; b n; b+) bareturnb = b; for (b = 0; b 2 * n; b+) i = (b

60、yte) (math.abs(rand.nextint() % n);/产生随机数,发生交换的位 置 j = (byte) (math.abs(rand.nextint() % n);/产生随机数,发生交换的位 置 t = bareturni; /交换 i,j 位置的数字 bareturni = bareturnj; bareturnj = t; return bareturn; /返回交换后的结果 swapcols()方法将根据 getshuffledarray()方法产生的交换方法,进行指定九 宫格内部的列交换,由字节数组 ba 保存交换方式,变量 b 指定所交换的九宫格, 范围 0 到

温馨提示

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

评论

0/150

提交评论