1、 2012 届 本 科 毕 业 设 计(论 文) 基于JAVA的手机游戏开发 Based on JAVA mobile phone game development 学 院: 工学院 专 业: 计算机科学与技术0801 姓 名: 刘洋 学 号: 080102060004 指导教师: 高文玲 完成时间: 2012年4月18日 二 〇 一 二 年 四 月
2、 基于JAVA的手机游戏开发 摘 要 本拼图游戏前期是基于J2SE平台开发的,是一个Application,它的实现过程是将一张大图切割成N张小图,然后在其中任意挑出N-1张小图,使它们随机出现在N个位置。通过鼠标或键盘的方向键移动已经切割的N-1张小图,让其复原成原来的顺序,玩家就胜利,游戏就结束了。在游戏结束之后,会自动将游戏得分及时间计算出来。让有些玩家可以查看自己的成绩。游戏可以设置多个等级,所拼的图片也可以进行选择,让游戏玩家可以根据自己的喜好进行选择。 关 键 词:JAVA语言;应用程序;游戏 Based on JAVA mobile phone game
3、 development Abstract This puzzle is based on the J2SE platform, it is one the Application of the rules of the game and jigsaw puzzle Noah. This game will cut to a picture N Zhang diagram, then any single out N-1 Zhang diagram, so that they appear randomly in the N position. By mouse or keyboard
4、 direction keys to move the N-1 has been cut Zhang diagram, allowed to recover to their original order, the players on the victory, the game ended. After the end of the game, the game score calculated. The game can set up multiple levels, you can play complex, you can play simple, and so on Keywo
5、rds: Java language ;application;game 前 言 随着计算机技术的不断发展,网络技术的普及范围也越来越广,网络能够提供的服务多样、便捷,已经成为人们生产生活中不可缺少的重要组成部分。特别是当今手机用户队伍的不断壮大,人们在使用手机进行交流的同时,也对手机的娱乐功能有了要求。智能机的出现,使得人们可以从网上下载各种游戏,在空闲的时间进行娱乐。人们对手机游戏种类、画面的流畅,丰富的颜色也有了一定的要求。手机游戏发展迅速,它凭借健康、方便、互动性强、益智等诸多优点,已经成为大部分现代人休闲娱乐的首选。 该课题所设计实现
6、的拼图游戏是使用Java语言开发的一款游戏。这款游戏是一个小巧、益智的游戏。无论是服务器还是客户端的实现都相对容易。通过对该游戏软件的编写,还可以巩固学生对以上各种知识的掌握和理解。 目 录 第一章 概述 1 1.1项目开发的背景 1 1.2项目开发的目的 1 1.3 开发环境介绍 1 1.3.1. java语言 2 1.3.2 myeclipse介绍 2 第二章 可行性分析及总体设计原则 4 2.1可行性分析 4 2.1.1技术可行性 4 2.1.2 经济可行性 4 2.1.3社会可行性 4 2.2 总体设计原则 4 第三章 系统分析 6 业务流程分析 6
7、 第四章 系统设计 7 模块流程图 7 第五章 系统演示 8 5.1程序主界面 8 5.2 等级设置 12 5.3图片选择 19 5.4 拼图画面 20 5.5 显示原图 21 5.6拼图成功 22 5.7打破拼图记录界面 23 5.8拼图成功后排名情况 24 结 论 25 致 谢 26 参考文献 27 西安外事学院工学院毕业论文 第一章 概述 1.1项目开发的背景 随着科技的发展,现在手机的功能越来越多,越来越强大,手机游戏开发行业也应运而生。手机游戏画面也日趋细腻、流畅,规则复杂,具有很强的娱乐性和交互性。加之手机携带方便,人们可
8、以随时随地可以沉浸在自己喜欢的游戏中,成为人们消遣时间的首选。庞大的用户群使得手机游戏的发展具有潜在的前景。 由于大多数的手机都内置了Java的运行环境,加上Java语言自身的跨平台特性,Java成为了编写手机游戏时最常使用的语言之一。 拼图游戏很多人都玩过,它的游戏规则是将图片进行分割,然后将顺序打乱,要求游戏玩家从左至右的顺序进行移动分割好的图片,把打乱顺序的小图片拼成一个完整的图。前提要求是,每次只可以移动一个小图。这个程序实现了拼图游戏中的基本功能。首先你可以载入自己喜欢的图片,然后进行难易程度的选择,在打乱顺序的图片右侧有排列正确的原图,可以对比进行排列。在你点击开始的时候,同
9、时开始计时,如果你成功地拼好,此时时间停止,同时给出成功提示信息,要求输入游戏玩家的姓名,并按照时间的长短进行比较、排名,每个等级只保留用时最少的游戏玩家的资料。如果发现自己完成不了,可以放弃当前正在进行的游戏,重新开始新游戏。 1.2项目开发的目的 1) 实现程序GUI图形界面; 2) 实现游戏开始、重来、退出功能; 3) 设计实现游戏主要算法; 4) 实现鼠标或键盘事件响应模块; 5) 实现用户可选难度等级功能; 6) 实现输赢自动判别功能。 7) 查看原图功能 8) 图片选择功能 9) 关于游戏 1.3 开发环境介绍 由于手机游戏开发普遍采用java语言
10、该游戏采用的开发环境为:JDK1.6,Myeclipse集成开发环境。下面简要介绍一下开发语言及开发工具。 23 西安外事学院工学院毕业论文 1.3.1. java语言 (1) 简单性 Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。 (2) 面向对象 Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。 (3) 多线程
11、 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。 (4) 分布性 Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。 (5) 体系结构中立 Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包
12、时,可以确保它能运行在各种支持Java的平台上。 (6) 安全性 用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。 1.3.2 myeclipse介绍 MyEclipse,是一个十分优秀的用于开发Java, J2EE的Eclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。 MyEclipse企业级工作平台(MyEclipse Enterprise Workbench
13、简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript ,Spring ,Hibernate。 在结构上,MyEclipse的特征可以被分为7类: 1. J2EE模型 2. WEB开发工具 3. EJB开发工具 4. 应用程序服务器的连接器 5. J2EE项目部署服务 6. 数据库服务 7. MyEclip
14、se整合帮助 对于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。 Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集。 简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。 MyEclipse是Eclipse的插件,也
15、是一款功能强大的JavaEE集成开发环境,支持代码编写、配置、测试以及除错,MyEclipse6.0以前版本需先安装Eclipse。MyEclipse6.0以后版本安装时不需安装Eclipse。 西安外事学院工学院毕业论文 第二章 可行性分析及总体设计原则 2.1可行性分析 为避免开发失误,保证新系统的成功开发和运行,从技术、经济和社会三方面对本系统的可行性进行了分析和研究。 2.1.1技术可行性 本系统的开发基于Swing技术的拼图游戏开发。Swing可以轻松开发功能丰富
16、的应用程序。现有的技术已较为成熟,硬件、软件的性能要求、环境条件等各项条件良好,利用现有技术条件可以达到该系统的功能目标。本人在学校期间已经掌握Java设计思想和代码编写。同时,考虑给予的开发期限也较为充裕,预计系统是可以在规定期限内完成开发的。 因此,java拼图游戏具有技术可行性。 2.1.2 经济可行性 具有信息化的处理设施,并且拥有支持本系统的应用平台。因此无需再投入资金购买其他设施。系统的开发基于本人对程序开发的实践学习而来,无需资金投入,并且软件开发过程投入的成本不高,因此开发经费完全可以接受。 游戏开发成功后可以提供娱乐、休闲等。 因此,java拼图游戏开发也具有经济可
17、行性。 2.1.3社会可行性 本系统的社会可行性主要从法律因素、用户使用可行性两方面进行研究。 (1)法律因素 系统的软件设计是在独立的环境下完成的,无可供抄袭的软件产品。 (2)用户使用可行性 本系统对用户的要求,除了需要具备在Microsoft Windows平台上使用个人电脑的知识外,并不需要特别的技术能力。在投入使用前,无需对操作系统的人员进行培训。这样既减少投入成本又简化了操作环节。 因此,java拼图游戏也具有社会可行性。 2.2 总体设计原则 本系统为了设计、实现和后期维护的方便,以及系统用户使用的便利,所以必须采取一定的设计原则。其主要设计原则有: 简单
18、性:在实现系统的功能的同时,尽量让系统操作简单易懂,这对于一个系统来说是非常重要的。 针对性:本系统设计是针对java拼图游戏的需求定向开发设计,所以具有专业突出和很强的针对性。 实用性:要求本系统能够满足java拼图游戏的需要,因此具有良好的实用性。 一致性:页面整体设计风格以及命名规则的一致性:整体框架和用图用色风格及变量、类名和其他元素的命名规则保持一致。 功能一致性:完成同样的功能应该尽量使用同样的元素。 元素风格一致性:界面元素的美观风格、摆放位置在同一个界面和不同界面之间都应该是一致的。 变量命名规则的一致性:变量应该用统一的规则进行命名,做到任意变量均能从上下文推断
19、其义。 先进性:本系统采用Myeclipse做为开发工具,使用swing技术开发,软件具有良好的兼容性和系统稳定性。因此本设计具有良好的先进性 。 西安外事学院工学院毕业论文 第三章 系统分析 业务流程分析 在进行业务流程分析时,需要按照原有信息流动过程,逐个地调查分析所有环节的处理业务、处理内容、处理顺序和对处理时间的要求,弄清各个环节需要的信息、信息来源、流经去向、处理方法、计算方法、提供信息的时间和信息形态。 业务流程分析可以帮助开发者了解该业务处理过程,发现和处理系统调查工作中的错误和疏漏。 java拼图游戏的具体的业务流程
20、图,流程如图3.1所示。 图3-1 程序启动后,玩家进行难度的选择,再进行图片选择。 然后就可以点击开始游戏,游戏中移动分割后的小块,使其成为一幅完整的图片。拼图成功后会显示玩家的用时和步骤数,同时还会要求玩家输入姓名并查看排名。 第四章 系统设计 模块流程图 图4-1 主程序运行后,进行难度选择,难度分为高级、中级、初级三种等级,等级越高,图片被分割的块数越多,拼接的难度也越大。然后再进行图片的选择,本游戏中已经预先载入了三张图片可供玩家选择。最后点击开始游戏。 西安外事学院工学院毕业论文 第五章 系统演示 5
21、1程序主界面 运行程序得到如下主界面,界面中有游戏操作菜单栏和操作提示。 菜单栏中有三个选项:开始,设置,关于。 主界面上还有操作提示,有助于我们快速了解该游戏的如何使用。 图5-1 主要代码: import java.awt.image.BufferedImage; import javax.swing.JButton; import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.JRadioButtonMenuItem; public class M
22、ainPinTu extends CardFrame { private boolean start; private int fWidth = this.getWidth(); private int fHeight = this.getHeight(); private GameOver gOver; private boolean index = true; public MainPinTu() { start = false; ImageIcon icon = new ImageIcon("icon/ico.png"); this.s
23、etSize(200 + fWidth, 200 + fHeight); this.setIconImage(icon.getImage()); this.setVisible(true); } private void startGame() { if (start) return; start = true; updateMenuBegin(); } public void endGame() { updateMenuBegin(); initMenuBackground(); start = fals
24、e; JOptionPane.showMessageDialog(null, "时间:" + gOver.getTime() + "s\n" + "步骤:" + gOver.getStep() ); Grades g = new Grades(this); g.set((int)gOver.getTime(), gOver.getStep()); } protected void FrameLostFocus() { if (start && index) { nextCard(); if (gOver !=
25、null) gOver.pause(); index = false; } } protected void FrameGetFocus() { nextCard(); if (gOver != null) gOver.pause(); index = true; } public void menuNewClick() { Split sp = Split.get(); BufferedImage [][] image; if (!sp.set(getFilename()) || (image = sp.div
26、id(getType())) == null) { JOptionPane.showMessageDialog(null, "文件 "+getFilename()+" 不存在!\n请选择~"); return; } startGame(); this.setSize(fWidth, fHeight); this.setVisible(true); int len = Split.level[getType()]; int row = image.length; int cal = image[0].length; g
27、Over = new GameOver(this); JButton [][] button = new JButton[row][cal]; Matrix matrix = new Matrix(button, panel[0], len, gOver); matrix.init(image); this.setSize(cal * len + fWidth, row * len + fHeight); this.setVisible(true); } public void menuGradesClick() { Grades g =
28、 new Grades(this); g.show(); } public void menuShowClick() { new ShowImage(getFilename()); } public void menuExitClick() { System.exit(0); } public void menuHelpClick() { String help0 = "移动小图片,使其成为原始图像。\n\n"; String help1 = "触摸周围的空白块小图片,使其走向空白块移动。"; JOptionP
29、ane.showMessageDialog(null, help0 + help1); } public void menuAboutClick() { String version = "名称: java拼图游戏 \n"; String author = "作者: 文之秀创意工作室\n"; String email = "E-mail: 295199087@"; JOptionPane.showMessageDialog(null, version + author + email); } public static void main(S
30、tring [] argv) { MainPinTu app = new MainPinTu(); app.setSize(400, 300); } } 5.2 等级设置 在设置菜单中有等级选择项,等级分为Hard,Normal,Easy。难度不同,对图片所分割的块数就不同,等级越高,分块数越多,拼图的难度也就相应的增加。 图5-2 代码如下: import java.io.File; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
31、import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.ButtonGroup; import javax.swing.KeyStroke; public abstract class MenuFrame extends JFrame { public final static int
32、heightTitle = 30; public final static int widthTitle = 6; public final static int heightMenu = 27; private JMenu [] m = { new JMenu("开始(B)"), new JMenu("设置(O)"), new JMenu("关于(A)") }; private JMenu [] mm = { new JMenu("等级(L)"), new JMenu("图片(B)") }; private boolean upd
33、ate; private int type; private String filename; protected ButtonGroup bgrp = new ButtonGroup(); protected ButtonGroup fgrp = new ButtonGroup(); public MenuFrame() { super("Java拼图游戏"); addMenu(); this.setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE);
34、this.setSize(widthTitle, heightTitle+heightMenu); this.setLocation( this.getToolkit().getScreenSize().width/3 - this.getWidth()/3, this.getToolkit().getScreenSize().height/3 - this.getHeight()/3 ); } private void addMenu() { JMenuBar mBar = new JMenuBar(); this.setJMenuBa
35、r(mBar); mBar.add(m[0]); mBar.add(m[1]); mBar.add(m[2]); m[0].setMnemonic('B'); m[1].setMnemonic('O'); m[2].setMnemonic('A'); initMenuBegin(); initMenuOption(); initMenuAbout(); update = false; } public abstract void menuNewClick(); public abstract void me
36、nuGradesClick(); public abstract void menuShowClick(); public abstract void menuExitClick(); private void menuLevelClick(String nm) { type = 3; if (nm.equals("Hard")) type = 0; else if (nm.equals("Normal")) type = 1; else if (nm.equals("Easy")) type = 2; } pri
37、vate void menuBackgroundClick(String nm) { filename = nm; } public abstract void menuHelpClick(); public abstract void menuAboutClick(); public int getType() { return type; } public String getFilename() { return filename; } private void initMenuBegin() { J
38、MenuItem [] mI = { new JMenuItem("新建(N)"), new JMenuItem("等级(G)"), new JMenuItem("退出(E)") }; mI[0].setMnemonic('N'); mI[1].setMnemonic('G'); mI[2].setMnemonic('E'); mI[0].setAccelerator(KeyStroke.getKeyStroke("ctrl N")); mI[2].setAccelerator(KeyStroke.getKeyStroke("
39、ctrl W")); mI[0].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuNewClick(); } } ); mI[1].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuGradesClick();
40、 } } ); mI[2].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuExitClick(); } } ); m[0].add(mI[0]); m[0].add(mI[1]); m[0].add(mI[2]); m[0].insertSeparator(2); } private void initMenuOption() {
41、 mm[0].setMnemonic('L'); mm[1].setMnemonic('B'); m[1].add(mm[0]); m[1].add(mm[1]); initMenuLevel(); initMenuBackground(); } private void initMenuLevel() { JRadioButtonMenuItem [] mi = { new JRadioButtonMenuItem("Hard"), new JRadioButtonMenuItem("Normal"),
42、 new JRadioButtonMenuItem("Easy") }; for (int i = 0; i < 3; i++) { mi[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JRadioButtonMenuItem mi = (JRadioButtonMenuItem)e.getSource(); menuLevelClick(mi.getText());
43、 } } ); bgrp.add(mi[i]); mm[0].add(mi[i]); } mi[1].setSelected(true); menuLevelClick(mi[1].getText()); } public void initMenuBackground() { mm[1].removeAll(); File bkg = new File(Arg.path); if (!bkg.exists()) return; File [] list = bkg.listFiles
44、); JRadioButtonMenuItem mi; int j = 0; for (int i = 0; i < list.length; i++) { if (!list[i].isFile() || list[i].isHidden()) continue; mi = new JRadioButtonMenuItem(list[i].getName()); mi.addActionListener(new ActionListener() { public void actionPerformed(Act
45、ionEvent e) { JRadioButtonMenuItem mi = (JRadioButtonMenuItem)e.getSource(); menuBackgroundClick(mi.getText()); } } ); fgrp.add(mi); mm[1].add(mi); mi.setSelected(j == 0); if (j == 0) menuBackgroundClick(mi.getText()); j++; } } pri
46、vate void initMenuAbout() { JMenuItem [] mI = { new JMenuItem("帮助(H)"), new JMenuItem("关于(A)") }; mI[0].setMnemonic('H'); mI[1].setMnemonic('A'); mI[0].setAccelerator(KeyStroke.getKeyStroke("F1")); mI[0].addActionListener(new ActionListener() { public void
47、actionPerformed(ActionEvent e) { menuHelpClick(); } } ); mI[1].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuAboutClick(); } } ); m[2].add(mI[0]); m[2].add(mI[1]); } public void update
48、MenuBegin() { update = !update; if (!update) { m[0].remove(2); return; } JMenuItem mi = new JMenuItem("显示原图(S)"); mi.setMnemonic('S'); mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuShowClick(); }
49、 } ); m[0].insert(mi, 2); } } 5.3图片选择 在工具栏中的设置菜单中有如下两项:可以对游戏难易程度选择的等级设置菜单以及可以选择不同图片的菜单。如下界面是对图片进行选择,该游戏中预先载入了三张图片可供选择。 图5-3 5.4 拼图画面 这个是等级为初级的拼图画面,把一张图片分割成了9块,其中右下角一块为空的,可以移动空方格周围的任意一块到空方格处,每次只能移动相邻的一块,直到拼出整张图片。 图5-4 5.5 显示原图 在拼图过程中,如果想查看原图,可在工具菜单开始选项中找到原图显示。有原图可帮助玩家更好、更快的完成拼图。 图5-5 5.6拼图成功 这是拼图成功后的显示界面,会显示玩家在本局中拼图成功后所用的时间以及所用的步骤数。让玩家清楚的了解自己的在游戏中的详细情况。 图5-6 5.7打破拼图记录界面 如果你打破了记录,点击上图的确定按钮后会显示如下界面,让玩家输入自己的姓名。玩家可在菜单开始选项中的等级排名查看记录。如果没有打破记录就没有此界面。 图5-7 5.8拼图成功后排名情况 这






