软件技术毕业设计(论文)J2ME俄罗斯方块游戏设计_第1页
软件技术毕业设计(论文)J2ME俄罗斯方块游戏设计_第2页
软件技术毕业设计(论文)J2ME俄罗斯方块游戏设计_第3页
软件技术毕业设计(论文)J2ME俄罗斯方块游戏设计_第4页
软件技术毕业设计(论文)J2ME俄罗斯方块游戏设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计总结 俄罗斯方块游戏 院 (系) 信息工程与艺术设计系 专 业 软件技术 学生姓名 学生学号 指导教师 提交时间 2011 年 12 月 2 日 目目 录录 摘摘 要要 .i i 第一章第一章 绪论绪论 .1 1 第二章第二章 j2mej2me 相关知识相关知识 .2 2 2.1 j2me 的概念 .2 2.2 j2me 体系结构介绍 .2 2.2.1 jvm .3 2.2.2 j2me 配置简介 .3 2.2.3 midp(mobileinformationdeviceprofile)移动信息设备简表 .3 2.3 j2me 手机编程的常用类 .4 2.3.1 display类.4

2、2.3.2 canvas类.4 2.3.3 graphics类 .4 2.3.4 rms 记录管理系统 .4 2.4 midlet应用程序的生命周期 .5 第三章第三章 俄罗斯方块游戏设计与制作俄罗斯方块游戏设计与制作 .7 7 3.1 游戏的具体设计流程 .7 3.1.1 俄罗斯方块游戏简述 .7 3.1.2 游戏操作流程 .7 3.1.3 系统设计思想 .8 3.1.4 系统设计主要功能 .10 3.2 游戏代码分析 .11 图 6 游戏开始界面.11 开始游戏界面部分程序代码:.11 结结 论论 .2323 致谢致谢 .2424 参考文献参考文献 .2424 摘摘 要要 随着计算机技术的

3、发展,手机游戏已经成为游戏行业的重要组成部分。同样也可以 说是成为人们日常生活中不可或缺的部分。手机游戏具有很高的经济价值,是一项很值 得探索与研究的领域。 “俄罗斯方块”是一款非常普及而且经典的益智类游戏,它以其操 作简单,上手容易等特点倍受玩家的青睐。而本文介绍的就是在 j2me 技术下利用 eclipse 开发工具配合 java 虚拟机在电脑端实现俄罗斯方块手机游戏的开发 关键词:j2me java 移动设备 手机游戏 第一章第一章 绪论绪论 游戏作为人们日常生活的一个重要的娱乐项目,也带动了巨大的游戏相关产业市场 的发展。游戏平台从游戏机、电视游戏,到 pc 游戏,到手机游戏。随着手机

4、的日益普及, 人们对手机的娱乐功能的需求也相应增强,尤其是近几年手机 2d、3d 技术的日益成熟, 大大地提高了手机游戏的娱乐性、操作性和方便性等多方面的性能。而基于手机平台的 手机游戏也就拥有了巨大的市场空间,随着 3g 的开通和应用,手机游戏必将迎来新的一 轮游戏热潮! j2me 在游戏开发方面的优势,由它开发的各种软件在手机上大规模的应用将会刮起 一阵势不可挡的革命潮流。下面在本篇文章中就将详细的介绍 j2me 这一技术在手机游戏 制作方面的具体过程和应用。 第二章第二章 j2mej2me 相关知识相关知识 2.12.1 j2mej2me 的概念的概念 j2me 的全称是 java2 m

5、icro edition(j2me)java2 技术微型版,与 j2se、j2ee 一样都是有美国 sum 微系统公司提出的 java 技术规范。 j2me 是为了能够开发运行在小型设备、独立设备、互联移动设备、嵌入式设备上的 java 应用程序而被提出的。j2me 是建立在一个由概要描述、配置、java 虚拟机和操作系 统等部分组成的标准架构之上的,这些内容共同组成了完整的 j2me 实时运行环境。它的 技术核心是由一个 java 虚拟机( jvm )及一套适合运行在上述设备环境上的 api 接口 构成。 j2me 在 1999 年的 javaone 开发人员大会上初次亮相,它的目标是面向智

6、能无线设备 和小型计算设备的开发人员,这些开发人员需要在他们的产品中整合跨平台的能力。 开发 java me 程序一般不需要特别的开发工具, 开发者只需要装上 java sdk 及下载 免费的 sun java wireless toolkit 2.xx 系列开发报,就可以开始编写 java me 程式, 编译及测试, 此外目前主要的 ide(eclipse 及 netbeans)都支持 java me 的开发,个别 的手机开发商如 nokia 、sony ericsson、摩托罗拉、android 系统 都有自己的 sdk, 供开发者在开发出兼容于他们的平台的程序。 2.22.2 j2mej

7、2me 体系结构介绍体系结构介绍 j2me 的体系可划分 jvm、配置、api 信息类库和简表。如图 1 所示,其中 jvm,配置 和简表构成了 j2me 运行环境。对于各个层次的详细解释和功能如下: 图 1 j2me 体系结构 .1 jvmjvm 在 j2me 中提供了 2 中 jvm。由于 jvm 是 java 代码运行时必须的,只有任何设备上有 了 jvm 才能改很好的解释“一次编译,到处运行”的关键技术。那么在嵌入式或移动设 备中也需要 jvm 作为操作系统和 java 应用程序间的接口。但是由于内存的限制,嵌入式 设备的 jvm 也要特殊提供。j2me 中提供的 jv

8、m 分为 cvm 和 kvm,是 jvm 的缩减版,kvm 比 cvm 功能稍弱。cvmcompactvirtualmachine,最初是这种解释的,但是后来对于 c 没有 任何意义了。只是 cvm 虚拟机主要运行在存储量较大的嵌入式设备,比如可视电话.pos 收款机等。kvm 是最小运行时环境的一部分,也就是用于 cpu 和内存较小的设备,这里的 k 是千字节的意思。kvm 主要用于移动电话,个人数字助理(pad)等小型设备。 .2 j2mej2me 配置简介配置简介 当前提供的 j2me 配置有两类,cdc 和 cldc。cdc(connectiondeviceconfig

9、uration)连接设备配置主要用于存储量较大,内 存 2mb 以上的设备中,大多用 cvm 虚拟机。其用户接口较多。网络带宽有限,所以有很 多不同的简表。而其最大的特点就是支持浮点数。包含了所有 cldc 中定义的类和接口。 cldc(connectionlimiteddeviceconfiguration)有限连接设备配置。主要用于小型的 资源较小的设备中,针对内存小于 512kb 的嵌入式系统。采用 kvm 虚拟机。其特点是很 多 j2se 的类和接口没有实现,最大的特点就是不支持浮点数。比如银行的 pos 机,支持 浮点数,内存较大,肯定是 cdc 类的设备。而个人移动电话内存小,肯定

10、不支持浮点数。 用的就是 kvm 虚拟机。 .3 midpmidp(mobileinformationdeviceprofilemobileinformationdeviceprofile)移动信息设备简表)移动信息设备简表 这里主要针对的是 cldc 设备。包含 3 个生命周期和事件处理等机制。paused 状态: 程序处于暂停状态,方法:pauseapp();actived 状态:程序处于运行活动状态。方法 startapp()destroy 状态:程序运行销毁结束前的状态。destroyapp();midp 包含其他事 件处理状态和机制。 2.32.3 j2mej2me

11、手机编程的常用类手机编程的常用类 .1 displaydisplay 类类 display 类代表了系统显示屏和输入设备的管理器,包含用来获取设备属性的方 法,以及要求在设备上显示对象的方法,其他处理设备的方法主要应用在 canvas 对象。 display 类直接从所有的祖先类 object 继承而来。 .2 canvascanvas 类类 为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类, 尤其在游戏程序中,几乎完全依赖的就是 canvas 抽象类进行绘图。从程序开发的观点看, canvas 类可与高级 screen 类交互,程序可在需

12、要时在 canvas 中掺入高级类的组件。 canvas 提供了键盘事件、指点杆事件(如果设备支持) ,并定义了允许将键盘按键映射 为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并 不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便 硬件开发商能定义他们自己的游戏键布局。 .3 graphicsgraphics 类类 graphics 是图形处理的基础类,提供了简单的 2d 绘图功能。使用 graphics 类 可以在屏幕上绘制图片、线条、文字等多种低级的界面。它具有 24 位深度色彩的绘制 能力,以三原色分别各占一个字节表

13、示其颜色。程序只能在 paint() 函数中使用 graphics 绘制, gamecanvas 可调用 getgraphics()函数直接绘制在缓冲区上,可以在 任何时间请求传输到前台。其对象会被传给 canvas 的 paint()函数,以便最终显示。 .4 rmsrms 记录管理系统记录管理系统 移动信息设备框架(mobile information device profile)和 移动 java 应用程 序的平台 为 midp 应用程序提供一种跨多个调用持久存储数据的机制。这种持久存储机 制可以被视为一种简单的面向记录的数据库模型,被称为记录管理系统(record m

14、anagement system(rms) ) 。通过这种机制,midlet 能够持久存储数据,并在以后检索 数据。在面向记录的方法中,j2me rms 由多个记录存储构成。 可以将每个记录存储想像成一个记录集合,它将跨多个 midlet 调用持久存在。设 备平台负责在平台正常使用的整个过程(包括重新启动、换电池等)中,尽全力维护 midlet 的记录存储的完整性。 记录存储在与平台相关的位置(比如非易失性设备存储器)创建,这些位置不直接 公开给 midlet。rms 类调用特定于平台的本机代码,这种本机代码使用标准 os 数据管 理器函数来执行实际的数据库操作。 记录存储实现确保所有单个的记

15、录存储操作都是原子的、同步的以及序列化的,因 此多个访问将不会出现数据毁坏。记录存储被盖上时间戳来指示它上次被修改的时间。 记录存储还维护版本(version) ,它是一个整数,修改记录存储内容的操作每发生一次, 这个数加一。版本和时间戳对于同步目的很有用。 当 midlet 使用多个线程访问一个记录存储时,协调该访问是 midlet 的责任;如 果它不能这样做,可能出现无法意料的结果。同样,如果一个平台使用试图同时访问记 录存储的多个线程执行记录存储的同步,那么对 midlet 及其同步引擎之间的记录存储 实施排外访问是平台的责任。 记录存储中的每个记录是一个字节数组,并且有唯一的整数标识符

16、。 2.42.4 midletmidlet 应用程序的生命周期应用程序的生命周期 理解 j2me 的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大, 我们直接迈向 j2me 开发也许会对你理解 j2me 平台体系结构这个重要的概念有所帮助。 在 midp 中定义了一种新的应用程序模型 midlet,它是被 application management software(ams)管理的。ams 负责 midlet 的安装、下载、运行和删除等操作。在被 ams 管理的同时,midlet 可以和应用管理软件通信通知应用管理软件自己状态的变化,通常 是通过方法 notifydestroy

17、ed()和 notifypaused()实现的 midlet 有三个状态,分别是 pause、active 和 destroyed。在启动一个 midlet 的时 候,应用管理软件会首先创建一个 midlet 实例并使得他处于 pause 状态,当 startapp() 方法被调用的时候 midlet 进入 active 状态,也就是所说的运行状态。在 active 状态调 用 destroyapp(boolean unconditional)或者 pauseapp()方法可以使得 midlet 进入 destroyed 或者 pause 状态。值得一提的是 destroyapp(boolea

18、n unconditional)方法, 事实上,当 destroyapp()方法被调用的时候,ams 通知 midlet 进入 destroyed 状态。在 destroyed 状态的 midlet 必须释放了所有的资源,并且保存了数据。如果 unconditional 为 false 的时候,midlet 可以在接到通知后抛出 midletstatechangeexception 而保持在当前状态,如果设置为 true 的话,则必须立即进 入 destroyed 状态。图 2 说明了 midlet 状态改变情况: 图 2 midlet 生命周期 第三章第三章 俄罗斯方块游戏设计与制作俄罗斯方

19、块游戏设计与制作 3.13.1 游戏的具体设计流程游戏的具体设计流程 .1 俄罗斯方块游戏简述俄罗斯方块游戏简述 俄罗斯方块是个老幼皆宜的小游戏,它是由四块正方形的色块组成,然后存储在一 个数组的四个元素中,由计算机随机产生七种不同形状的方块,然后玩家可以根据键盘 的四个方向键控制翻转、向左、向右和向下的操作来堆叠成各种不同的形状。 (控制键的 实现是由键盘的方向键的事件处理实现) .2 游戏操作流程游戏操作流程 本游戏的操作流程非常简单,用户启动 midlet 后,进入游戏运行界面,选择“帮助” 进入游戏帮助界面,选择“退出游戏”则退出整个游戏。在游戏运行界面

20、,当用户想暂 停游戏时,按下#按钮,游戏就暂停了,在暂停的情况下按#按钮,游戏继续运行。 在游戏结束界面按下“最高分”按钮进入最高分界面任何时候点击 退出按钮,游戏 midlet 都会终止。如图 3 所示: 图 3 游戏框架 .3 系统设计思想系统设计思想 midp 的游戏设计,本质上就是用一个线程或者定时器重绘事件,用线程和用户输入 改变游戏状态。这个俄罗斯方块也不例外,当启动 midlet 以后,就立即生成一个重绘线 程,该线程每隔几 ms 就重新绘制一次屏幕。当然重绘时有一些优化措施,并不是屏幕上 所有的像素都需要重绘,而是有所选择。比如游戏画布上那些已经固定下来的下坠物

21、 (下坠物有 7 种,由 4 个小砖块组成,可以上下左右旋转变形)就不需要重绘。游戏画 布是一个 commandlistener,可以接收用户键盘输入命令:控制下坠物的左移、右移、加 速下落、变形旋转动作。 图 4 游戏控制流程 整个游戏的控制流程体现在游戏画布的 paint()方法里,paint()根据当前的游戏 状态,绘制出当时的游戏画面。而暂停画面的绘制,是通过设立标志,让 paint ()无需 真正的执行重绘动作。对于游戏处于运行状态的画面绘制,则需要在下坠物当前位置绘 制下坠物。在绘制下坠物之前,判断下坠物是否还能下坠,如果能下坠就让它下落一格, 再进行绘制,如果下坠物不能下坠,则把

22、下坠物固定下来,同时检查游戏画布上下坠物 当前下面所有的行,看是否能进行删行动作,如果需要进行删行动作,则清楚游戏画布 上被删行的数据,再把删行之上的所有行都下移一行,然后再初始化一个新的下坠物。 如果不需要删除行,则判断游戏是否处于结束状态,如果是处于结束状态,则设置游戏 状态为 game_over 状态,这样画布在下一次重绘时就给出游戏结束的画面。如果不是处 下坠物能否下坠 下坠物下 坠一格 在当前位置绘 制下坠物 固定下坠物 是否需要删除行 重绘游戏地图 初始化一个新 的下坠物 游戏是否结束 绘制游戏结束画面 绘制新 下坠物 游戏处于运行状态 是 是 否 否 否 是 游戏处于暂停状态游戏

23、处于结束状态 结束游戏 执行空操作 于 game_over 状态,则绘制新下坠物,然后判断下坠物能否下坠,重复以上动作。 .4 系统设计主要功能系统设计主要功能 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个 图片框中构造了一个 4*4 的网状小块,由这些小块组合成新的形状,每四个小块连接在 一起就可以构造出一种造型,本游戏总共设计了 7 种造型,每种造型又可以通过旋转而 变化出 4 种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展 示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控 制方块的运动,然后利用

24、递归语句对每一行进行判断,如果有某行的方块是满的,则消 除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是由时钟控件控制 的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进 行记录,最后就可以得出用户的分数,用判断语句对得分进行判断,当达到一定的积分 时游戏难度就会增加。 俄罗斯方块游戏设计的主要步骤包括以下 5 个方面: 1. 游戏界面的设计,以及游戏方块的造型 游戏界面分两大部分,左侧为游戏容器,为游戏运行提供空间;右侧用来显示得分、 游戏难度及下一个下坠物。 游戏方块本质上为 16 个小砖块组成的正方形,一共有七种,如“田”字形、 “l”字 形等。每

25、种方块一共有四种旋转变化,程序中是用 16 进制表示的这些方块,这些用 16 进制表示的方块可以换算成用一个 44 的二维数组来存储每种方块的一种状态。在有色 砖块出现的位置,值为 1,而只有背景颜色,无需绘制的位置,值为 0。如图 5 所示为长 条形: 图 5 方块模型 2. 俄罗斯游戏方块的旋转和运动控制 该游戏方块的运动由键盘的方向键控制,左键表示让方块向左移动,右键表示让方 块向右移动,向下的方向键让方块加速下落,上键及中间键实现游戏方块的旋转变化。 3. 俄罗斯游戏方块的颜色选择 该游戏中的 4 种方块都是固定的颜色,每种方块一种颜色。 4. 俄罗斯方块的自动消行功能和计分功能 游戏

26、中当方块填满一行时便可以消行,每消去一行分数增加 1,同时消去的行数越多, 分数增长的越快。 5. 游戏的自动升级功能 该游戏设置的游戏等级是自动增加的。当玩家达到一定的分数时,游戏等级上升, 当然游戏难度也会上升 3.23.2 游戏代码分析游戏代码分析 图 6 游戏开始界面 开始游戏界面部分程序代码: public gamescreen(russiaboxmidlet midlet) this.midlet = midlet; / 获取屏幕大小 screenwidth = getwidth(); screenheight = getheight(); / 添加屏幕命令 exitcommand

27、 = newnew command(退出, command.exit, 1); newgamecommand = newnew command(开始, command.screen, 2); addcommand(exitcommand); addcommand(newgamecommand); / 侦听命令按键 setcommandlistener(this); / 装载位图片段 try fangkuai = image.createimage(/fangkuai.png); catch (exception e) /* (非 javadoc) * see javax.microeditio

28、n.lcdui.commandlistener#commandaction(javax.microedition.lcd ui.command, javax.microedition.lcdui.displayable) */ public voidvoid commandaction(command arg0, displayable arg1) if (arg0 = exitcommand) timer.cancel(); isgameover = truetrue; try / 退出 midlet.quit(); catch (midletstatechangeexception e)

29、/ todo 自动生成 catch 块 e.printstacktrace(); else ifif (arg0 = newgamecommand) / 开始游戏 initialize(); 图 7 游戏运行中界面 private voidvoid initialize() / 初始化数据 for (i = 0; i square_amount; i+) for (j = 0; j square_amount; j+) isfilledji = false; for (i = 0; i 4; i+) sq.ps_xi = sq.ps_yi= 0; sq.type = 0; score = 0;

30、 / 白色清空画布 graph.setcolor(white); graph.fillrect(0, 0, screenwidth, screenheight); / 重绘屏幕 isgameover = falsefalse; isnextone = truetrue; repaint(); public voidvoid paint(graphics g) graph = g; if (isgameover = true) return; / 重绘 if (isnextone = true) onnewsquare(); public voidvoid erasebackground() /

31、 白色清空画布 graph.setcolor(white); / 擦除上次停留位置 for (i = 0; i = 0 /* * authorauthor administrator * * todotodo 要更改此生成的类型注释的模板,请转至 * 窗口 首选项 java 代码样式 代码模板 */ publicpublic classclass square publicpublic intint ps_x = newnew intint4; publicpublic intint ps_y = newnew intint4; publicpublic intint type; 图 8 游戏

32、结束界面 游戏结束界面全部代码: import java.util.timertask; import javax.microedition.lcdui.font; import javax.microedition.lcdui.graphics; public class thinking extends timertask private static final int white = 0 x00ffffff; private static final int black = 0 x00000000; private int i = 0; private int j = 0; publi

33、c gamescreen gamescreen; public thinking(gamescreen screen) this.gamescreen = screen; /* (非 javadoc) * see java.util.timertask#run() */ public void run() / 是否不能再往下落了 for (i = 0; i 4; i+) if (gamescreen.isfilledgamescreen.sq.ps_xigamescreen.sq.ps_yi = true) / 游戏结束 gamescreen.isgameover = true; cancel

34、(); / 状态信息 string statusmsg = 本局积分: + string.valueof(gamescreen.score); / 设置字体 font font = font.getfont(font.face_system, font.style_plain, font.size_medium); int strheight = font.getheight(); int strwidth = font.stringwidth(statusmsg); / 计算字符绘制位置 int x = (gamescreen.screenwidth - strwidth) / 2; x =

35、 x 0 ? 0 : x; int y = (gamescreen.screenheight - 2 * strheight) / 2; y = y 0 ? 0 : y; / 白色清空画布 gamescreen.graph.setcolor(white); gamescreen.graph.fillrect(0, 0, gamescreen.screenwidth, gamescreen.screenheight); / 黑色显示信息 gamescreen.graph.setcolor(black); gamescreen.graph.drawstring(statusmsg, x, y, (

36、graphics.top | graphics.left); gamescreen.repaint(); return; if (gamescreen.sq.ps_yi = gamescreen.square_amount - 1 | gamescreen.isfilledgamescreen.sq.ps_xigamescreen.sq.ps_yi + 1 = true) / 填充方块所占的区域 for (j = 0; j 4; j+) gamescreen.isfilledgamescreen.sq.ps_xjgamescreen.sq.ps_yj = true; cancel(); / 消

37、去方块 boolean flag = new boolean16; boolean full = false; for (i = 0; i = 0; i-) / y shaft for (j = 0; j = 0; i-) / 消去这一行 if (flagi = true) gamescreen.score = gamescreen.score + 100; for (j = 0; j = 0; i-) / 这行没有消去,进行下落处理 if (flagi = false) int temp = i + 1; int offset = 0; while (temp gamescreen.squa

38、re_amount) if (flagtemp = true) offset+; temp+; for (j = 0; j gamescreen.square_amount; j+) if (gamescreen.isfilledji = true) int ptx = j * gamescreen.unit_size; int pty = i * gamescreen.unit_size; / 白色清空画布 gamescreen.graph.setcolor(white); / 擦除上次停留位置 gamescreen.graph.fillrect(ptx, pty, gamescreen.u

39、nit_size, gamescreen.unit_size); gamescreen.graph.drawimage(gamescreen.fangkuai, ptx, pty + offset * gamescreen.unit_size, 0); gamescreen.isfilledji = false; gamescreen.isfilledji + offset = true; / 产生新的方块组合 gamescreen.isnextone = true; gamescreen.repaint(); return; / 擦除背景 gamescreen.erasebackground(); / 移动方块 for (i = 0; i 4; i+) gam

温馨提示

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

评论

0/150

提交评论