《J2ME手机拼图游戏毕业论文.doc》由会员分享,可在线阅读,更多相关《J2ME手机拼图游戏毕业论文.doc(37页珍藏版)》请在三一办公上搜索。
1、广东海洋大学寸金学院毕业论文(设计) 论文题目: 手机拼图游戏 Handset composite picture game 系 别: 信息技术系 专 业: 计算机科学与技术班 级: 姓 名: 学 号: 指导老师: 职 称: 讲师 日 期: 2011-05-20 广东海洋大学寸金学院教务制目 录目 录I摘 要IIABSTRACTIII第1章引言11.1 手机软件现状11.2 手机游戏的发展11.3 关于J2ME21.4 拼图游戏2第2章基于J2ME的手机游戏开发环境与技术介绍32.1 开发环境32.2 Java语言特点32.3 关于ECLIPSE与EclipseME32.4 关于JDK与WTK
2、4第3章手机游戏“拼图”的设计与实现53.1 游戏设计53.2 游戏实现(类与方法的介绍)53.2.1 MyPinTu类63.2.2 MyImage类113.2.3 MyCanvas类12第4章调试284.1 目的284.2 方法284.3 未完善的功能28结束语29致 谢30参考文献31摘 要J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案。随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐
3、体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于设计和开发一款拼图游戏,在游戏设计中融入了图片的拆分和分散技术,并在游戏当中添加了难度和计时功能,以提高游戏的趣味性和挑战性。同时存在一个秘籍功能。这款游戏的名字叫拼图游戏。选择一张图片后,选择其中一种难度后进行拼图,通过按方向键移动小图块,当把打乱后的小图块移到原来的位置时,游戏完成。本设计的特点是:可选图片,可选难度,可计时,在觉得无法完成时可输入秘籍,自动完成游戏。关键字: J2ME,手机游戏,JavaABSTRACT J2ME is a kind of fast developing technolog
4、y implemented on various devices especially mobile communication equipments. It focuses on application for consumptive electronic products, providing revolutionary solution to the intelligentizetion and diversification of the equipment. When cell phone is getting ever more popular nowadays, with the
5、 implementation of Java technology on mobile equipment, increment of capital on communication service exhibits its force on peoples everyday life, providing them ever fast information just in hand. This paper focus on design and open a paragraph of the jigsaw puzzle game design, blended in pictures
6、of split and dispersed technology, and in the process added difficulty and timing function, to improve the game interesting and challenging. There is a esoterica function.The title of this game is puzzles. Choose a picture, Choose one of the difficulty after the puzzles, after the key direction of m
7、ovement insets block, when the insets block after the disturb moved the original position, the game is done. This design features are: optional pictures, optional difficulty, have clock,unable to complete the feel when input techniques, auto complete game.Keywords: J2ME, mobile game, Java第1章 引言1.1 手
8、机软件现状在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端:1.传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。2.传统手机访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。而Java技术在的优势非常明显:1.应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。2.Java技术提供了一个类库,它使的应用开发商可以创建更为
9、直觉、丰富的用户界面(GUI)。3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。基于以上优势,Java手机将是未来手机的发展方向,是业界的热点。1.2 手机游戏的发展从1997年的第一款手机游戏贪吃蛇到目前,手机游戏已经不在停留在简单的俄罗斯方块之类的画面简单,规则单一的游戏,而是发展到可以与电脑相媲美的,具有很强交互性与娱乐性的复杂形式。如果能利用JAVA上的其他丰富功能,那么就可以实现更多的功能。随着手机游戏的发展,国内外各大开发商纷纷运用JAVA进行游戏游戏开发。J2ME作为一种基于JAVA的便携设备开发平台。
10、在各大手机开发公司得到了广泛应用。作为运行于手持设备上的应用程序,手机的硬件特征决定了手机游戏的特点。1. 庞大的潜在用户群全球在使用的移动电话已经超过10亿部,而且这个数字每天都在不断增加。在除美国之外的各个发达国家,手机用户都比计算机用户多。2. 便携性在控制台游戏时代,GameBoy热销的一个原因就是便携性人们可以随时随地沉浸在自己喜欢的游戏中。和游戏控制台或者PC相比,手机虽然可能不是一个理想的游戏设备,但毕竟人们总是随时随身携带,这样手机游戏很可能成为人们消遣时间的首选。3. 支持网络因为手机是网络设备,在一定限制因素下可以实现多人在线游戏。1.3 关于J2MEJ2ME(Java 2
11、 micro Edition)是一种高度优化的Java运行环境,是sun的java 2 的三大成员之一(J2SE,J2EE,J2ME)。专门用于开发消费性电子产品。针对市面上的大量消费类电子设备,例如Papers、cellularphones(蜂窝电话), screen-phones(可视电话)、digital set-top boxes(数字机顶盒)、car navigation systems(汽车导航系统)等等。 J2ME技术在1999年的JavaOne Developer Conference大会上推出。J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备
12、之间共享应用程序。1.4 拼图游戏拼图操作能培养手眼协调能力拼图需要耐心的操作,以及手眼协调能力。只要一不协调就不能将数据块放在正确的位置。学习解决问题的方法及策略玩拼图能学习推理思考能力,因为尝试不同的选择,到决定正确的一块放下去。也就是经过假设,判断到选择的过程。能让玩家学习运用逻辑来解决问题的方法。本设计的拼图游戏利用J2ME的移动开发MIDP架构设计和开发,在游戏设计中融入了图片拆分和分散技术,并在游戏当中增加了难度选择和计时功能,以提高游戏的趣味性和挑战性。第2章 基于J2ME的手机游戏开发环境与技术介绍2.1 开发环境操作系统: Windows XP开发环境: JDK WKT程序语
13、言: Java2开发平台: Eclipse EclipseME2.2 Java语言特点1. 平台无关性Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。Java的数据类型与机器无关。2. 安全性Java的编程类似C+,但舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。3. 面向对象Java吸收了C+面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。4. 分布式Java建立在TCP/IP网络平台上,提供了用HTTP和FTP
14、协议传送和接收信息的库函数,使用其相关技术可以十分方便地构建分布式应用系统。5. 健壮性Java致力于检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。2.3关于ECLIPSE 与 EclipseMEEclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JDT)。还包括插件开发环境
15、(PDE)。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言,Eclipse框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。EclipseMe对于JavaME程序开发,是一个比较流行的插件。Eclipse的安装,只能让我们很方便地编写Java程序,但是要方便地编写JavaME程序,并对JavaME移动应用提供运行模拟,还必须对Eclipse的功能进行
16、加强。EclipseME帮助你轻松的把无线工具包整合到Eclipse开发环境中。2.4 关于JDK 与 WTKJDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。WTK(Wireless Tool Kit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专
17、用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。 第3章 手机游戏“拼图”的设计与实现3.1游戏设计本游戏的规则是:选择一张图片后,选择3*4,3*4记时记步,4*4记时记步其中一种难度进入拼图游戏后,出现相应个数的图片方块游戏界面,其中一图片方块为空格,通过按手机的4个方向键可将空格对应的上、下、左、右方向的小图块移动到空格中,同时移动的小图块的原位置变空格,当所有的小图块被移动到正确的位置后,系统会自动显示整张原始图片,这就说明拼图已经完成。在拼图过程中,按住手机的选择键时可以显示原图,用来进行参照,松键的时
18、候会自动回到原来的拼图状态。在记时记步难度下,屏幕下方会显示所用时间与成功移动方块的次数。按下暂停计时按钮,停止计时;按下继续计时按钮,继续计时。按下返回按钮或*号键返回选择图片与难度界面。本游戏存在一个秘籍,当按下#119,拼图自动完成。手机常用功能键如图3.1所示。图3.1 手机常用功能键图3.2 游戏实现(类与方法的介绍)在列表框选择对应的图片后,按下相应难度的按钮,进入拼图游戏界面。通过图片所需大小的计算,从大的图片提取出所要显示的那部分图片,通过分割,打乱图片进入游戏操作。根据本游戏的设计,实现的程序代码由MyPinTu、MyImage、MyCanvas几个类构成。具体分析如下:3.
19、2.1 MyPinTu类MyPinTu类继承自MIDlet,并实现CommandListener接口。MyPinTu类是游戏的主类,控制着整个游戏的生命周期。根据游戏开始时的列表框,里面有几个选项供选择,因此,在MyPinTu类中的startApp()先加载游戏选择菜单界面。其主要代码如下:package PinTu;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Display;import javax
20、.microedition.lcdui.Displayable;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.List;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class MyPinTu extends MIDlet implements CommandListener private Display dis; private Li
21、st l; private String p_name; public MyPinTu() protected void destroyApp(boolean arg0) throws MIDletStateChangeException protected void pauseApp() protected void startApp() throws MIDletStateChangeException dis=Display.getDisplay(this); /获得当前MIDlet上的显示对象showList(); dis.setCurrent(l); /将l设置为当前界面l.setC
22、ommandListener(this);private void showList() l=new List(选择图片,List.IMPLICIT); / 高级界面,列表框ll.append(草莓, null);l.append(苹果, null);l.append(美女, null);l.append(熊, null);l.append(樱桃, null);Font f = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD|Font.STYLE_ITALIC,Font.SIZE_LARGE);l.setFont(0, f);l.setF
23、ont(1, f);l.setFont(2, f);l.setFont(3, f);l.setFont(4, f);l.addCommand(new Command(普通拼图,Command.ITEM,0);l.addCommand(new Command(3*3记时记步 拼图,Command.ITEM,1);l.addCommand(new Command(4*4记时记步 拼图,Command.ITEM,1);private void zhuanh() if(p_name.equals(熊) p_name=xiong;else if(p_name.equals(樱桃) p_name=cher
24、ry;else if(p_name.equals(美女) p_name=meinv;else if(p_name.equals(苹果) p_name=apple;else if(p_name.equals(草莓) p_name=caomei; public void commandAction(Command c, Displayable d) List temp=(List)d;if(c.getLabel().equals(普通拼图) /选择普通3*4拼图p_name=temp.getString(temp.getSelectedIndex();MyCanvas mc=new MyCanva
25、s(dis,temp,3,4);zhuanh();mc.addImage(/+p_name);mc.allimages();mc.setFullScreenMode(true);mc.Fenge();dis.setCurrent(mc); /转到画布界面mc.addCommand(new Command(返回, Command.BACK, 1);if(c.getLabel().equals(3*3记时记步 拼图) /选择3*3记时记步拼图p_name=temp.getString(temp.getSelectedIndex();MyCanvas mc=new MyCanvas(dis,temp
26、,3,3);zhuanh();mc.addImage(/+p_name);mc.allimages();mc.Fenge();dis.setCurrent(mc); /转到画布界面mc.addCommand(new Command(返回, Command.BACK, 1);mc.addCommand(new Command(暂停计时, Command.SCREEN, 1);if(c.getLabel().equals(4*4记时记步 拼图) /选择4*4记时记步拼图p_name=temp.getString(temp.getSelectedIndex();MyCanvas mc=new MyC
27、anvas(dis,temp,4,4);zhuanh();mc.addImage(/+p_name);mc.allimages();mc.Fenge();dis.setCurrent(mc); /转到画布界面mc.addCommand(new Command(返回, Command.BACK, 1);mc.addCommand(new Command(暂停计时, Command.SCREEN, 1); 该类中使用了3个方法,下面分别介绍这3个方法:startApp()方法:当MIDlet运行时,startApp函数自动调用,应用程序进入运行(Active)状态,此时程序正在运行中,将列表框l设
28、置为当前界面。并将l上的Command按钮和事件处理类(CommandListener)对象绑定。showList()方法:该方法完善列表框 (如图3_1),实现了刚进入游戏时的选择界面,并在l界面添加3个软键按键“普通拼图”、“3*3记时记步 拼图”、 “4*4记时记步 拼图”按钮。commandAction()方法:commandAction()方法为实现CommandListener接口后必须重写的方法。 实现对l界面选择“普通拼图”、“3*3记时记步 拼图”、“4*4记时记步 拼图”3个软键按键的方法响应。默认选择草莓图片,按右软键后:选择“普通拼图”后按选择键,实例化MyCanvas
29、类的对象mc(传参dis,temp,3,4),并实现mc的方法,转到画布界面,在画布界面添加“返回”软键按键(界面如图3_2); 选择“3*3记时记步 拼图”后按选择键,实例化MyCanvas类的对象mc(传参dis,temp,3,3),并实现对象mc的方法,转到画布界面,在画布界面添加“返回”和“暂停计时”软键按键(界面如图3_3);选择“4*4记时记步 拼图”后按选择键,实例化MyCanvas类的对象mc(传参dis,temp,4,4),并实现对象mc的方法,转到画布界面,在画布界面添加“返回”和“暂停计时”软键按键(界面如图3_4)。 图3_1列表框界面图 图3_2 普通拼图界面图 图3
30、_3 3*3记时记步拼图界面图 图3_4 4*4记时记步拼图界面图3.2.2 MyImage类定义了MyImage类来表示分割后的小图块,其主要代码如下:package PinTu;import javax.microedition.lcdui.Image;public class MyImage private Image image=null;private int old_x=0;private int old_y=0;private int x=0;private int y=0;public MyImage(Image image, int old_x, int old_y) sup
31、er();this.image = image;this.old_x = old_x;this.old_y = old_y;this.x=old_x;this.y=old_y;public int getX() return x;public void setX(int x) this.x = x;public int getY() return y;public void setY(int y) this.y = y;public Image getImage() return image;public int getOld_x() return old_x;public int getOl
32、d_y() return old_y;public boolean check()if(old_x=x&old_y=y)return true;return false;该类3个参数,image用来表示小图块,old_x与ole_y表示小图块起始坐标。同时用2个变量x和y来改变小图块的坐标,初始值分别等于old_x与ole_y。包含的方法分别实现:得到x; 修改x; 得到y; 修改y; 得到表示小方块的参数;得到该小方块的初始坐标old_x; 得到该小方块的初始坐标old_y。 最后的check()方法是判断小图块改变后的坐标x与y是否与初始坐标old_x与ole_y相等,是的话返回true,
33、不是返回false。3.2.3 MyCanvas类MyCanvas类继承自Canvas,实现CommandListener与Runnable接口。主要代码如下:package PinTu;import java.io.IOException;import java.util.Random;import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lc
34、dui.Display;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Form;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.List;import javax.microedition.lcdui.game.Sprite;public cla
35、ss MyCanvas extends Canvas implements CommandListener , Runnable private Image image=null; private int xuanz_x;private int xuanz_y;private MyImage is;private MyImage Nimage=null;public int null_x;public int null_y;private boolean game_key=false; private boolean game_miji;private Display d=null;priva
36、te List l=null; private String miji=; private String miji_temp=;private int jishu;private int jishi; private int shuz; public boolean bRUN;/构造函数 public MyCanvas(Display d, List l, int xuanz_x, int xuanz_y) super();game_miji=true;this.d = d;this.l = l;this.xuanz_x=xuanz_x;this.xuanz_y=xuanz_y;null_x=
37、xuanz_x-1;null_y=xuanz_y-1;is=new MyImagexuanz_xxuanz_y;jishu=0;jishi=0;this.setCommandListener(this);bRUN=true;Thread th=new Thread(this);th.start(); /画布函数protected void paint(Graphics arg0) arg0.setColor(255, 255, 255);arg0.fillRect(0, 0, this.getWidth(), this.getHeight();for(int i=0;ixuanz_x;i+)
38、for(int j=0;jxuanz_y;j+) if(isij!=null) arg0.drawImage(isij.getImage(), isij.getX(), isij.getY(), 0);elseif(xuanz_x=3&xuanz_y=4)arg0.fillRect(null_x*80, null_y*80, 75, 75);if(xuanz_x=3&xuanz_y=3)arg0.fillRect(null_x*80, null_y*80, 75, 75);if(xuanz_x=4&xuanz_y=4)arg0.fillRect(null_x*60, null_y*60, 55
39、, 55); if(game_key)if(xuanz_x=3&xuanz_y=4)arg0.drawImage(image, 0, 0, 0);if(xuanz_x=3&xuanz_y=3)|(xuanz_x=4&xuanz_y=4)arg0.drawRegion(image, 0,this.getHeight()-240, 240, 240, Sprite.TRANS_NONE, 0, 0,Graphics.LEFT|Graphics.TOP); if(xuanz_x=3&xuanz_y=3)|(xuanz_x=4&xuanz_y=4)arg0.setColor(0, 0, 0);Font
40、 font = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD|Font.STYLE_ITALIC,Font.SIZE_LARGE);arg0.setFont(font);arg0.drawString(时间+:+ +Integer.toString(jishi)+(秒)+ + 移动次数+ +:+ +Integer.toString(jishu), this.getWidth()-20, this.getHeight()-10, Graphics.BOTTOM|Graphics.RIGHT); if(jishu=9999|jishi=99
41、99) Form fom=new Form(别浪费时间了); d.setCurrent(fom); /所用时间太长 移动次数太多 自动跳转 fom.setCommandListener(this); fom.addCommand(new Command(返回, Command.BACK, 1); /加入图片public void addImage(String p_name)try image=Image.createImage(p_name+.gif); catch (IOException e) e.printStackTrace();/分割图片public void allimages(
42、)for(int i=0;ixuanz_x;i+)for(int j=0;jxuanz_y;j+)if(xuanz_x=3&xuanz_y=4)isij=new MyImage(Image.createImage(image, i*80, j*80, 79, 79, Sprite.TRANS_NONE), i*80, j*80);if(xuanz_x=3&xuanz_y=3)isij=new MyImage(Image.createImage(image, i*80, this.getHeight()-240+j*80, 79, 79, Sprite.TRANS_NONE),i*80, j*8
43、0);if(xuanz_x=4&xuanz_y=4)isij=new MyImage(Image.createImage(image, i*60, this.getHeight()-240+j*60, 59, 59, Sprite.TRANS_NONE), i*60, j*60); Nimage=isnull_xnull_y;isnull_xnull_y=null; /打乱图片public void Fenge()MyImage is_temp=new MyImagexuanz_xxuanz_y;Random r=new Random();for(int i=0;ixuanz_x;i+)for(int