目 录

摘  要

ABSTRACT

1  绪论

1.1 手机软件现状

1.2 J2ME介绍

1.3 手机游戏应具有的特征

1.4 本章小结

2  开发环境及相关技术的介绍

2.1  开发环境

2.2  Java语言特点

2.3  关于ECLIPSE

2.4 关于Wireless Tool Kit

2.5 Java Appication Manager

2.6 本章小结:

3  程序结构、思想和相关技术

3.1 本程序需要解决的主要技术问题

3.2  程序流程

3.3 Canvas类

3.4 Graphics类

3.5 MIDP1.0技术下的绘制背景技术

3.6 MIDP2.0新增的GameCanvas包

3.7 PNG图片格式

3.8 内存的优化

3.9 内存检测器

3.10 关于混淆器

3.11 本章小结

4  程序分析和具体实现

4.1 贪吃蛇游戏的规则简介以及开发环境

4.1.1 贪吃蛇游戏的规则简介

4.1.2 开发环境

4.2 详细设计

4.2.1 操作流程

4.2.2 代码设计

4.3本章小结

5  测试

5.1 游戏的调试

5.2 游戏的运行环境

6  总结

6.1 本程序的总结和展望

6.2 感想

致 谢

参考文献












摘 要

J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。

随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序。本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。

本论文介绍了J2ME的相关技术及本程序的结构分析和具体功能的实现。


关键字:J2ME;手机游戏;Java

























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 intelligentizetionand diversification of the equipment. It improve the efficiency of the development process thanks to its “Write Once, run anywhere”nature.

When cell phoneis getting ever more popular nowadays, with the implementation of Java technology on mobile equipment, increment of capital on communication service exhibits its force on people’s everyday life, providing them ever fast information just in hand. This dissertation focuses on implementation of J2ME technology and has developed a commercial game suite run on mobile phones. This application  transports the classical product to mobile phones, offering corresponding software for such more popular hardware platform.

This dissertation introduces  J2ME and its relative technology as well as this program’s structure and analysis of implementation in details.


Key words:J2ME;mobile game;Java









1  绪论

1.1 手机软件现状

在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端:

1.  传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。

2.  传统手机访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。

而Java技术在无线应用方面的优势非常明显:

1.  应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。

2.  Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI);

3.  Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。

基于以上分析,Java手机将是未来手机的发展方向,是业界的热点。

1.2 J2ME介绍

虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、J2ME以及JavaCard。其中J2ME定位在消费性电子产品的应用上。这个版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。这个版本的应用层面相当广泛,会是未来Java平台发展的重点项目。

J2ME在1999年的JavaOne开发人员大会上初次亮相,它的目标是面向智能无线设备和小型计算机设备的开发人员。J2ME的一个关键优点是,J2ME与所有支持Java的设备都是兼容的。支持Java的设备就是任何运行Java虚拟机器的计算机。Motorola、Nokia等生产厂商都生产支持Java的设备。、

J2ME平台是由配置(Configuration)和简表(Profile)构成的。配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java虚拟机。简表是针对一系列设备

提供的开发包集合。在J2ME中还有一个重要的概念是可选包(Optional Package),它是针对特定设备提供的类库,比如某些设备是支持蓝牙的,针对此功能J2ME中制定了JSR82(Bluetooth API)提供了对蓝牙的支持。

目前,J2ME中有两个最主要的配置,分别是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。

作为第一个面对小型设备的Java应用开发规范,CLDC是由包括Nokia,Motorola和Siemens在内的18家全球知名公司共同协商完成的。CLDC是J2ME核心配置中的一个,可以支持一个或多个profile。其目标主要面向小型的、网络连接速度慢、能源有限(主要是电池供电)且资源有限的设备,如手机、PDA等。

而CDC则是主要用于运算能力相对较佳、在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机机顶盒 (set-top box))

1.3 手机游戏应具有的特征

    一个手机游戏应该具有以下特征:

易于学习: 既然手机游戏面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习游戏技巧。消费者不会花几个小时去研究一个3元的手动操作的游戏。保持游戏的简单是最基本的要求。

可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。

基于订阅:手机游戏的盈利成功取决于他们巨大的使用量。一开始开发和设计每个游戏都是昂贵的。如果一个手机游戏开发者要赢利的话,重要的是:同一个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。

丰富的社会交互: 不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。

利用手机技术的优点: 巨额的手机技术研发费用都花在提高设备和网络的可用性和可靠性上面。因此,手机设备硬件和网络协议与桌面/控制台世界(如全球定位系统(GPS)扩展、条形码扫描仪、和短消息服务(SMS)/多媒体信息服务(MMS)通讯)有着非常大的差别。好的手机游戏应该利用那些更新的设备特征和网络基础设备的优点。

1.4 本章小结

引言和第一章中介绍了手机在无线应用方向的当今概况,J2ME的相关内容,分析了J2ME在手机软件开发中起的重要作用,描述了本论文的相关背景。

























2  开发环境及相关技术的介绍

2.1  开发环境

操作系统:Microsoft Windows XP

程序语言:Java 2

开 发 包:Java(TM) 2 Standard Edition (5.0)

        Sun Micro. J2ME   Wireless Tool Kit 2.2

IDE:    Eclipse 3.01

2.2  Java语言特点

1. 平台无关性

Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。Java的数据类型与机器无关。

2. 安全性

Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。

3. 面向对象

Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。

4. 分布式

Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。

5. 健壮性

Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。

2.3  关于ECLIPSE

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

虽然大多数用户很乐于将。

这种平等和一致性并不仅限于

2.4 关于Wireless Tool Kit

WTK(Wireless Tool Kit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。

2.5 Java Appication Manager

手机中负责调配程序运行资源的管理后台是Java Application Manager。它所使用的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。Java Application Manager 会从网络上下载代表该Application Suite 的JAR 档,接着在手机上安裝此MIDlet Suite,然后在手机开始执行该应用程序。

2.6 本章小结:

第二章介绍了Java语言的特点、本程序的开发环境及其相关工具的原理和使用。






3  程序结构、思想和相关技术

3.1 本程序需要解决的主要技术问题

1.  游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。

2.  游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。

3.游戏的背景图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。

4.  Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。

5.  游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。

以上相关技术细节和整体流程将分别在以下小节阐述。

基于java贪吃蛇计算机毕设源码+论文_手机游戏

3.2  程序流程

MIDlet suite是MIDP应用程序的最小单位,JAM负责将手机内的MIDlet suite以图形化的方式呈现,让用户能够选取欲执行的MIDlet suite,一旦选取了某个MIDlet suite,操作系统就会激活KVM执行里面的MIDlet。MIDlet及相关的支持类组成了MIDP应用程序的实际内容。而

每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。在MIDP规范中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。这三种状态的转换关系如图3-1所示:MIDlet有三个状态,分别是pause、active和destroyed。在启动一个MIDlet的时

候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。

本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后将先从外部文件载入背景图文件,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。

3.3 Canvas类

为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进行绘图。从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。Canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。

3.4 Graphics类

Graphics类提供了简单的2D绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制,GameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给Canvas的paint()函数,以便最终显示。

3.5 MIDP1.0技术下的绘制背景技术

在没有MIDP2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内将所想要画的图形画在一张预先准备好的背景上,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上。Image类提供了一个建立背景的静态方法createImage(int width, int height),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用drawImage()方法将背景的数据复制到实际显示的屏幕上。

这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。不过在某些MIDP的实现上已经加上了双重缓冲的支持,因此在处理前应先利用Canvas类的isDoubleBuffer()方法来判断。

3.6 MIDP2.0新增的GameCanvas包

    J2ME的流行促进几个运营商和制造商开发了一些支持游戏的类,但是,这却造成了游戏缺乏可移植性的问题,例如,很难将使用Siemens的Sprite类的游戏移植到Nokia上。

在MIDP2.0版本发布后,这些游戏移植性问题初步得到了解决。MIDP2.0新加入了

GameCanvas、Sprite、Layer、LayerManager、TiledLayer五个与游戏开发相关的类。其中Layer类一般不会直接用到。

    Game类的出现不仅降低了错误出现的几率,也使游戏代码变的更小,因为开发者不需要自己编写象Sprite这种例子。下面将简要介绍Game类。

    GameCanvas类继承自Canvas,所以具有Canvas所具有的功能,还额外增加了一些便于游戏设计的功能。比如:GameCanvas类直接提供了getKeyStates(),使程序员可以在同一个线程自己侦测按键的状态。GameCanvas类提供了flushGraphics()的功能,实现了双缓冲技术。

    所谓的Sprite,就是画面上独立移动的图形。

Sprite类是继承自Layer的用于存储多桢的基本可视元素。不同的frame可交相显示,构成动态的效果。图片可翻转、颠倒、由一个主角图片就可以方便的得到所有方向的显示状态,相比原先只能使用Canvas绘图,需要将所有方向的主角图象都绘制在png图象中简化了许多。Sprite也可以从整合的图象中读图,读图时将把大图分解为若干等宽等高的小图。每个小图按照其排列顺序有相应的序号,在程序中调用其序号,就可以绘制出相应的图片。

LayerManager提供控制整体画面层的控制。它包括了一系列自动获取了代号和位置的层,简化了各层加入游戏画面的过程,提供了自动排序和绘制的能力。

LayerManager存储了一个层的列表,新的层可以用函数附加、删除和插入。层的序号相当于坐标的Z轴,0层表示最接近用户视觉,层数越高,离用户越远。层号总是连续的,即使有中间的层被移除,其他层的序号会作相应的调整以保持整体的完整性。LM中的View Window控制着与LM相对坐标的可视区域。改变View Window的位置可以制造出滚动屏幕的效果。

TiledLayer是有一组图象格元素组成的整块虚拟图象。该类使不需要高分辨率的图象就能创建大幅图面成为可能。这项技术通常应用在2D游戏平台的滚动背景的绘图。一块整图可被分割成等大小的图象格,每块格有其对应的序号,按照行列递增。多块小格可由大块同时替换组合而模拟动态的背景,这不需要逐块替换所有的静态图象格而显得非常方便。

3.7 PNG图片格式

PNG(Portable Network Graphics)格式是MIDlet唯一支持的图象格式,PNG具体格式由PNG Specification,Version 1.0定义的。PNG格式提供透明背景的图象,这对绘制游戏画面和被操纵主角极有帮助。

PNG格式图片中包含许多定义其图片特性的冗余部分(Chunks)。这些代码包含在每一个单独的png格式图象中,然而如果将多个png图象合并在一张幅面稍大一些的整图中,多个chunks就可以得到精简,图片的大小可以得到控制。使用Image类中的createImage函数可从整图中分割出所需要的元素。在Game包中的TiledLayer和Sprite类都整合了这样的功能。本程序中的地图元素都集成在一张beijing.png图片中,实现了方便的管理和程序体积的精简。

3.8 内存的优化

手机内存空间小,所以在程序设计时应该注意以下几点,以尽量减少内存的使用:

    (1)尽量缩短命名的长度。在应用程序内,对于所建立的类、接口、方法及变量名而言,都需要赋予一个识别的名称,所命名的名称每多一个字符就会在类文件内多产生一个字节,对于一个较复杂的应用程序而言就会增加为数不小的数据量。所有这些可以借助混淆器来帮助实现

    (2)所有代码写为一个类。

    (3)只使用一个线程。

    (4)尽量不使用静态变量。

    (5)将PNG图片合并成一张,减少图形数据的大小。

将PNG格式的小分辨率图象合并在一张大的高分辨率图象中,由于减少了头文件的大小,将比合并前的总大小减少许多。

3.9 内存检测器

Wireless Tool Kit提供了许多在运行时监视运行状态的工具。 包括内存状况的检测(手机上的内存空间十分有限,必须时刻关注机载内存是否大于程序所能使用到的最大可能的内存空间),网络状况的检测,运行函数的跟踪等。 内存检测器是内存跟踪测试随时间变化的调试器。其中,允许强制垃圾回收(Garbage Collection)。由于Java语言中,不像许多其他的如C++语言,不需要指定回收函数中特定不使用的资源,资源回收机制将自动清空无效变量占用的空间。在程序运行中也可以调用System类的gc()函数手动收回废弃的内存。

3.10 关于混淆器

Java 语言并没有完全编译成二进制可执行文件,编译出的.class文件是一种介于源程序和二进制之间的一中基于半解释的字节码,需要虚拟机来执行。它包括了所有的信息。然而这样会导致.class很容易被反编译为源代码,从而不能保护作者的知识成果。目前流行的如decode,JAD等反编译工具可以以很快的速度生成源文件。如果不加以施行有效的措施,将造成严重的后果。

由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的减少变量、函数的命名长度的关系,编译后也会从.class文件中减少这些冗余的信息。混淆后,体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。

3.11 本章小结

第三章中介绍了程序的流程、相关技术的思想及其在本程序中的应用。

4  程序分析和具体实现

4.1 贪吃蛇游戏的规则简介以及开发环境

4.1.1 贪吃蛇游戏的规则简介

在贪吃蛇游戏中,玩家操作由小方块连接而成的蛇,去吃随机散落在画面内的小方块,每吃一块就增加一小方块长度,要是撞壁以及撞自己的尾,就属于失败,如无失败则直到通关为止。

屏幕的长度的行向为11单位,纵向为18单位。在这个范围内,玩家通过操作方向键来控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。

4.1.2 开发环境

(1)开发的硬件环境:CPU C1.7HZ/Maxor  40G/DDR 256M/CD-ROW 40X

  (2)开发软件:JDK1.5和J2MEWTK

4.2 详细设计

4.2.1 操作流程

本游戏的操作流程(如图3-1):用户在启动MIDlet后,即进入游戏主画面,屏幕开始显示为欢迎画面。之后游戏自动开始,当小蛇咬到自己身体或者碰到边界时游戏结束,游戏MIDlet都会终止。

基于java贪吃蛇计算机毕设源码+论文_手机游戏_02

图4-1操作流程

4.2.2 代码设计

(1)游戏地图代码设计

游戏地图是蛇的活动范围和食物随机散落的范围,游戏的容器为行向为11单位,纵向为18单位,如下代码:

private final int iX = 10; //地图的开始坐标

    private final int iY = 10; //

private final int SWIDTH = 16; //图标的宽度

    private final int iCells = 11; //地图的列数

    private final int iRows = 18; //地图的行数

    private final int iBoxW = SWIDTH*iCells; //地图的宽

采用二维绘图工具:二维绘图工具drawLine采用4个参数——直线起点的x、y坐标值和直线终点x、y的坐标值,例如:

graphics.drawLine(50,0,100,0);

这行代码会从位置(50,0)到(100,0)绘制一条直线。

绘制一个矩形是一个类似的过程,不同的只是需要用起点加上宽度和高度的方式来指定这个对象。可以绘制透明的或者填充的矩形,甚至可以绘制圆角的矩形。4个绘制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。

(2)贪吃蛇和食物的代码设计

屏幕的长度为行向为11单位,纵向为18单位;在这个范围内(如图3.3),玩家操作方向键控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。

基于java贪吃蛇计算机毕设源码+论文_Java_03

图4-2游戏区域

贪吃蛇最初由3个小正方形组成,小正方形是蛇的身体和游戏容器的组成部分。食物也由一块小正方形组成,并且随机散落在游戏框图的区域内,每次只出现唯一的一个,待玩家操作游戏完成一个任务后面,再出现下个食物,小蛇每吃一个食物就增加一个长度。实现代码如下:

public int getCell(){

return iCell;

}

public int getRow(){

return iRow;

}

    public void show(){

        sLabel.setVisible(true);

    }

    public boolean isVisible(){

        return sLabel.isVisible();

    }

    public void hide(){

        sLabel.setVisible(false);

    }

    protected void setPosition(int row, int cell){

iCell = cell;

iRow  = row;

        sLabel.setBounds(cell*SWIDTH, row*SWIDTH, SWIDTH, SWIDTH);

    }

public void moveUp(){

if(iRow>0)

setPosition(--iRow,iCell);

else

setTouch();

}

public void moveDown(){

if(iRow<iBoxH-1)

setPosition(++iRow,iCell);

else

setTouch();

}

public void moveLeft(){

if(iCell>0)

setPosition(iRow,--iCell);

else

setTouch();

}

public void moveRight(){

if(iCell<iBoxW-1)

setPosition(iRow,++iCell);

else

setTouch();

}

static boolean getTouch(){

return isTouch;

}

static void setTouch(){

isTouch = true;

}

static void setImTouch(){

isTouch = false;

}

public Snake clone(){

Snake tem = new Snake();

tem.setPosition(this.getRow(),this.getCell());

return tem;

}

(3)操作控制代码设计

MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的就不需重绘。游戏画布是一个CommandListener,可以接受用户键盘命令,控制蛇的左移,右移,下移,上移。其代码如下:

public void move(){

hide();

if(aoSnakes[0].getRow()==Food.getRow()&&aoSnakes[0].getCell()==Food.getCell())

eat();

Snake tempSnakes[] = new Snake[iLen-1];

for(int i=0;i<tempSnakes.length;i++){

tempSnakes[i] = aoSnakes[i].clone();

}

switch(heading){

case 37:

aoSnakes[0].moveLeft();

break;

case 38:

aoSnakes[0].moveUp();

break;

case 39:

aoSnakes[0].moveRight();

break;

case 40:

aoSnakes[0].moveDown();

break;

default:

break;

整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面。欢迎画面和Game Over画面的绘制相当简单,游戏暂停画面的绘制也相当容易,就是设立标志,让paint()执行的时候无需真正执行重绘动作

4.3本章小结

第四章中按照相应的步骤描述了所有关键类的具体算法实现,引用了相关函数进行了具体流程的解释,并对原理稍复杂的函数做了详细的分析。对游戏有关的各运行面也做了展示。


































5  测试

5.1 游戏的调试

使用Eclipse完成代码的调试之后,生成jar包文件。

   测试的过程,实际上就是找不同的同学玩这款游戏,以期望发现BUG。实际上,几乎每一版本都会产生很多BUG。

在手机游戏方面,游戏的控制和图片的设置是游戏的基本能力,为了方便玩家操作游戏,把玩家常用的操作键设为游戏最常用的控制键,并通过J2ME简单有效的编码,使玩家可以重新设置自己的熟悉的键。本游戏不设立关卡,而是随着游戏积分的增加,游戏将自动增加游戏的难度,如随小蛇长度的增加,游戏的操作难度也会增大。如玩家进入游戏,操作小蛇,去吃随机散落在游戏区内的食物,每吃一个食物就增加小蛇一个单位长度,并随着长度的增加,游戏的速度将增加,而小蛇的长度增加也会增加玩家的操作难度。

如果玩家操作小蛇碰壁或者由于小蛇长度太长而蛇头撞到小蛇的身体任何部位,均属于失败,玩家得重新游戏开始。         

5.2 游戏的运行环境

目标硬件环境:

1:显示: 96*54象素,1位颜色,大约1:1的象素比例;

2:输入:(a)单手键盘或者小键盘;

(b)双手的QWERTV键盘;

(c)触摸屏。 

3)内存  (a)128KB非易失性内存,供MIDP组件使用;

(b)8KB的非易失性内存,供应用程序生成的永久数据使用;

(c)32KB的易失性内存,供Java堆使用。









6  总结

6.1 本程序的总结和展望

     本次毕业设计所开发的贪吃蛇游戏,实现了游戏的一些基本和必需的功能。如游戏的界面设置,游戏动画的设置,玩家的控制键设置等功能。但游戏功能还存在着很多不足,首先,对游戏的动画设计不够熟悉,技巧性不强,界面的设置也不够美观。这些对于玩家来说是非常重要,将直接决定本游戏的生存能力。其次,这款游戏还没直接下载到手机上去实现,只是通过PC机上模拟实现。另外此次所使用的开发工具都是用的JDK的较低版本,有些功能不能实现。这次游戏的功能没能做到十全十美,是由于自身能力的不足和时间的限制,没有对游戏的开发进行进一步研究,还有很多地方需要改进。

我的水平实在有限,但我相信,随着时间的推移,个人水平的增长,我一定会重写这个程序,使其更加完善。

6.2 感想

   这款游戏作为我的毕业设计,是本人目前做过的最有意义的程序。

本科期间做过很多课程设计,大多规模很小。在数据库、各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间做过图书馆管理程序等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。大家作品的最终结果都离不开同一个模式。相比一些数据库软件,游戏的设计有很多人情色彩和艺术思想的发挥,正式商业的软件的人性化界面和各个游戏间迥异的结构每每会让人有去开发的冲动。

学习JAVA语言的困难远远超出了想象,在设计初期,为了解决最基本的边界问题竟然花费了数天的时间。很多相关的技术,如需要使用到的线程、Game包的新功能、高级、低级图形界面的使用、贴图等,每一项都需要花一定的时间去掌握和熟悉。更为困难的是,J2ME为一种刚出现仅几年的新技术,国内的参考资料非常少,仅有的几本也停留在简单的介绍阶段。台湾的王森写了本较好的书,给了我很大的帮助,但对设计该游戏来说,仍只够入门。

幸运的是,互联网上有那么多无私的人,由Jason Lam著,Deaboway Chou译的电子书《J2ME&Gaming》给了我很大的帮助,作者、译者的辛勤劳动的成果免费放在网上由大家下载,是开源精神的完美体现。

致 谢

首先感谢我的指导老师,他在我的毕业设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新兴的技术。

感谢同学们对游戏进行测试,感谢同学对游戏相关图片的修改。

感谢答辩组对本毕业设计的考核,如果可以得到专家的认可将对我的学习和工作给予极大的鼓励。你们客观的评价和建议我将牢记在心,在今后的发展中扬长避短,更加努力的严格要求自己。

















参考文献

[1]Joshua Bloce著. 潘爱民译. Effective Java中文版.2004年7月第4版. 机械工业出版社.

[2]Bruce Eckel.侯捷译.Java编程思想. 2005年3月第1版. 机械工业出版社出版社

[3]王森著.Java手机/PDA程序设计入门.2005年2月第3版.电子工业出版社.

[4]James Keogh著.潘颖 王磊译.J2ME开发大全.2004年2月第1版清华大学出版社.

[5]Ian Sommerville著.程成等译.软件工程.2003年1月第1版.机械工业出版社.

[6]Jason Lam著.Deabo way Chou译 J2ME&Gaming2004年末 www.jasonlanm604.com

[7]陈立伟 张克非 黎秀红著.精通JAVA手机游戏与应用程序设计.中国青年出版社.

2005年5月

[8]飞思科技产品研发中心.精通Jbuilder9.电子工业出版社.2004年

[9]微型爪哇人.Java手机程序开发.中国铁道出版社,2003年

[10]Frand M.Carrano,Janet J.Prichard .著 韩志宏 译.数据抽象和问题求解——

JAVA语言描述.清华大学出版社2005年4月

[11]袁海燕 王文涛著.JAVA实用程序设计100例.人民邮电出版社.2005年5月

[12]Jonathan Knudsen.What's New in the J2ME Wireless Toolkit 2. 22004年4月www.sun.com