当前位置:文档之家› 毕业论文-08220128-章盛远-基于J2ME的手机...

毕业论文-08220128-章盛远-基于J2ME的手机...

目录

摘要 ........................................................................................................................................................................... I 第一章绪论 . (1)

第二章J2ME相关知识 (2)

2.1J2ME的概念 (2)

2.2J2ME体系结构介绍 (2)

2.3J2ME手机编程的常用类 (3)

2.4MID LET应用程序的生命周期 (4)

第三章俄罗斯方块游戏设计与制作 (6)

3.1游戏的具体设计流程 (6)

3.1.1 俄罗斯方块游戏简述 (6)

3.1.2 游戏操作流程 (6)

3.1.3 系统设计思想 (6)

3.1.4 系统设计主要功能 (8)

3.2游戏代码分析 (9)

3.2.1 绘制方块 (9)

3.2.2 绘制方块 (9)

3.2.3 随机出现方块 (11)

3.2.3 最高分的设定 (12)

3.2.5 按键的判断 (14)

3.2.6 边界检测 (16)

3.2.7 得分与升级 (17)

3.3游戏演示 (18)

3.3.1 游戏帮助界面 (18)

3.3.2 最高分界面 (19)

3.3.3 游戏结束界面 (19)

3.3.4 变换方块演示 (19)

结论 (20)

致谢 (21)

参考文献 (21)

基于J2ME的手机俄罗斯方块游戏的开发

摘要

随着计算机技术的发展,手机游戏已经成为游戏行业的重要组成部分。同样也可以说是成为人们日常生活中不可或缺的部分。手机游戏具有很高的经济价值,是一项很值得探索与研究的领域。“俄罗斯方块”是一款非常普及而且经典的益智类游戏,它以其操作简单,上手容易等特点倍受玩家的青睐。而本文介绍的就是在J2ME技术下利用eclipse开发工具配合java虚拟机在电脑端实现俄罗斯方块手机游戏的开发

关键词:J2ME JAVA 移动设备手机游戏

第一章绪论

游戏作为人们日常生活的一个重要的娱乐项目,也带动了巨大的游戏相关产业市场的发展。游戏平台从游戏机、电视游戏,到pc游戏,到手机游戏。随着手机的日益普及,人们对手机的娱乐功能的需求也相应增强,尤其是近几年手机2D、3D技术的日益成熟,大大地提高了手机游戏的娱乐性、操作性和方便性等多方面的性能。而基于手机平台的手机游戏也就拥有了巨大的市场空间,随着3g的开通和应用,手机游戏必将迎来新的一轮游戏热潮!

J2ME在游戏开发方面的优势,由它开发的各种软件在手机上大规模的应用将会刮起一阵势不可挡的革命潮流。下面在本篇文章中就将详细的介绍J2ME这一技术在手机游戏制作方面的具体过程和应用。

第二章J2ME相关知识

2.1 J2ME的概念

J2ME的全称是Java2 Micro Edition(J2ME)——Java2技术微型版,与J2SE、J2EE 一样都是有美国SUM微系统公司提出的JAVA技术规范。

J2ME是为了能够开发运行在小型设备、独立设备、互联移动设备、嵌入式设备上的JA V A应用程序而被提出的。J2ME是建立在一个由概要描述、配置、JA V A虚拟机和操作系统等部分组成的标准架构之上的,这些内容共同组成了完整的J2ME实时运行环境。它的技术核心是由一个JA V A虚拟机(JVM )及一套适合运行在上述设备环境上的API 接口构成。

J2ME在1999年的JavaOne开发人员大会上初次亮相,它的目标是面向智能无线设备和小型计算设备的开发人员,这些开发人员需要在他们的产品中整合跨平台的能力。

开发Java ME程序一般不需要特别的开发工具, 开发者只需要装上Java SDK 及下载免费的 Sun Java Wireless Toolkit 2.xx系列开发报,就可以开始编写Java ME程式,编译及测试, 此外目前主要的IDE(Eclipse 及 NetBeans)都支持 Java ME 的开发,个别的手机开发商如 Nokia 、Sony Ericsson、摩托罗拉、Android系统都有自己的SDK, 供开发者在开发出兼容于他们的平台的程序。

2.2 J2ME体系结构介绍

J2ME的体系可划分JVM、配置、API信息类库和简表。如图1所示,其中JVM,配置和简表构成了J2ME运行环境。对于各个层次的详细解释和功能如下:

图1 J2ME体系结构

2.2.1 JVM

在J2ME中提供了2中JVM。由于JVM是java代码运行时必须的,只有任何设备上有了JVM才能改很好的解释“一次编译,到处运行”的关键技术。那么在嵌入式或移动设备中也需要JVM作为操作系统和java应用程序间的接口。但是由于内存的限制,嵌入式设备的JVM也要特殊提供。J2ME中提供的JVM分为CVM和KVM,是JVM的缩减版,KVM比CVM 功能稍弱。CVMCompactVirtualMachine,最初是这种解释的,但是后来对于C没有任何意义了。只是CVM虚拟机主要运行在存储量较大的嵌入式设备,比如可视电话.POS收款机等。KVM是最小运行时环境的一部分,也就是用于CPU和内存较小的设备,这里的K是千字节的意思。KVM主要用于移动电话,个人数字助理(PAD)等小型设备。

2.2.2 J2ME配置简介

当前提供的J2ME配置有两类,CDC和CLDC。CDC(ConnectionDeviceConfiguration)连接设备配置主要用于存储量较大,内存2MB以上的设备中,大多用CVM虚拟机。其用户接口较多。网络带宽有限,所以有很多不同的简表。而其最大的特点就是支持浮点数。包含了所有CLDC中定义的类和接口。CLDC(ConnectionLimitedDeviceConfiguration)有限连接设备配置。主要用于小型的资源较小的设备中,针对内存小于512Kb的嵌入式系统。采用KVM虚拟机。其特点是很多J2SE的类和接口没有实现,最大的特点就是不支持浮点数。比如银行的POS机,支持浮点数,内存较大,肯定是CDC类的设备。而个人移动电话内存小,肯定不支持浮点数。用的就是KVM虚拟机。

2.2.3 MIDP(MobileInformationDeviceProfile)移动信息设备简表

这里主要针对的是CLDC设备。包含3个生命周期和事件处理等机制。Paused状态:程序处于暂停状态,方法:pauseApp();Actived状态:程序处于运行活动状态。方法startApp()Destroy状态:程序运行销毁结束前的状态。DestroyApp();MIDP包含其他事件处理状态和机制。

2.3 J2ME手机编程的常用类

2.3.1 Display类

Display类代表了系统显示屏和输入设备的管理器,包含用来获取设备属性的方法,以及要求在设备上显示对象的方法,其他处理设备的方法主要应用在Canvas对象。Display 类直接从所有的祖先类Object继承而来。

2.3.2 Canvas类

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

2.3.3 Graphics类

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

2.3.4 RMS记录管理系统

移动信息设备框架(Mobile Information Device Profile)和移动Java 应用程序的平台为MIDP 应用程序提供一种跨多个调用持久存储数据的机制。这种持久存储机制可以被视为一种简单的面向记录的数据库模型,被称为记录管理系统(record management system (RMS))。通过这种机制,MIDlet 能够持久存储数据,并在以后检索数据。在面向记录的方法中,J2ME RMS 由多个记录存储构成。

可以将每个记录存储想像成一个记录集合,它将跨多个MIDlet 调用持久存在。设备平台负责在平台正常使用的整个过程(包括重新启动、换电池等)中,尽全力维护MIDlet 的记录存储的完整性。

记录存储在与平台相关的位置(比如非易失性设备存储器)创建,这些位置不直接公开给MIDlet。RMS 类调用特定于平台的本机代码,这种本机代码使用标准OS 数据管理器函数来执行实际的数据库操作。

记录存储实现确保所有单个的记录存储操作都是原子的、同步的以及序列化的,因此多个访问将不会出现数据毁坏。记录存储被盖上时间戳来指示它上次被修改的时间。记录存储还维护版本(version),它是一个整数,修改记录存储内容的操作每发生一次,这个数加一。版本和时间戳对于同步目的很有用。

当MIDlet 使用多个线程访问一个记录存储时,协调该访问是MIDlet 的责任;如果它不能这样做,可能出现无法意料的结果。同样,如果一个平台使用试图同时访问记录存储的多个线程执行记录存储的同步,那么对MIDlet 及其同步引擎之间的记录存储实施排外访问是平台的责任。

记录存储中的每个记录是一个字节数组,并且有唯一的整数标识符。

2.4 MIDlet应用程序的生命周期

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

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状态。图2说明了MIDlet状态改变情况:

图2 MIDlet生命周期

第三章 俄罗斯方块游戏设计与制作

3.1游戏的具体设计流程

3.1.1 俄罗斯方块游戏简述

俄罗斯方块是个老幼皆宜的小游戏,它是由四块正方形的色块组成,然后存储在一个数组的四个元素中,由计算机随机产生七种不同形状的方块,然后玩家可以根据键盘的四个方向键控制翻转、向左、向右和向下的操作来堆叠成各种不同的形状。(控制键的实现是由键盘的方向键的事件处理实现) 3.1.2 游戏操作流程

本游戏的操作流程非常简单,用户启动MIDlet 后,进入游戏运行界面,选择“帮助”进入游戏帮助界面,选择“退出游戏”则退出整个游戏。在游戏运行界面,当用户想暂停游戏时,按下[#]按钮,游戏就暂停了,在暂停的情况下按[#]按钮,游戏继续运行。在游戏结束界面按下“最高分”按钮进入最高分界面任何时候点击 [退出]按钮,游戏MIDlet 都会终止。如图3所示: 3.1.3 系统设计思想

图3 游戏框架

MIDP 的游戏设计,本质上就是用一个线程或者定时器重绘事件,用线程和用户输入改变游戏状态。这个俄罗斯方块也不例外,当启动MIDlet 以后,就立即生成一个重绘线程,

[启动]按钮

游戏开始界面 游戏暂停

界面

最高分界面

游戏结束界面

退出游戏 游戏帮助界面

游戏运行界面

[退出]按钮

[#]按钮

[#]按钮

按“返回”键

该线程每隔几ms 就重新绘制一次屏幕。当然重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择。比如游戏画布上那些已经固定下来的下坠物(下坠物有7种,由4个小砖块组成,可以上下左右旋转变形)就不需要重绘。游戏画布是一个CommandListener,可以接收用户键盘输入命令:控制下坠物的左移、右移、加速下落、变形旋转动作。

图4 游戏控制流程

整个游戏的控制流程体现在游戏画布的paint()方法里,paint()根据当前的游戏状态,

绘制出当时的游戏画面。而暂停画面的绘制,是通过设立标志,让paint ()无需真正的执行重绘动作。对于游戏处于运行状态的画面绘制,则需要在下坠物当前位置绘制下坠物。

下坠物能否下坠

下坠物下坠一格

在当前位置绘制下坠物

固定下坠物

是否需要删除行

重绘游戏地图

初始化一个新的下坠物

游戏是否结束

绘制游戏结束画面

绘制新下坠物

游戏处于运行状态

否 否

游戏处于暂停状态

游戏处于结束状态

结束游戏

执行空操作

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

3.1.4 系统设计主要功能

从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,本游戏总共设计了7种造型,每种造型又可以通过旋转而变化出4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是由时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用判断语句对得分进行判断,当达到一定的积分时游戏难度就会增加。

俄罗斯方块游戏设计的主要步骤包括以下5个方面:

1. 游戏界面的设计,以及游戏方块的造型

游戏界面分两大部分,左侧为游戏容器,为游戏运行提供空间;右侧用来显示得分、游戏难度及下一个下坠物。

游戏方块本质上为16个小砖块组成的正方形,一共有七种,如“田”字形、“L”字形等。每种方块一共有四种旋转变化,程序中是用16进制表示的这些方块,这些用16进制表示的方块可以换算成用一个4×4的二维数组来存储每种方块的一种状态。在有色砖块出现的位置,值为1,而只有背景颜色,无需绘制的位置,值为0。如图5所示为长条形

图5方块模型

种状态在数组中的存储方式。

2. 俄罗斯游戏方块的旋转和运动控制

该游戏方块的运动由键盘的方向键控制,左键表示让方块向左移动,右键表示让方块向右移动,向下的方向键让方块加速下落,上键及中间键实现游戏方块的旋转变化。

3. 俄罗斯游戏方块的颜色选择

该游戏中的4种方块都是固定的颜色,每种方块一种颜色。

4. 俄罗斯方块的自动消行功能和计分功能

游戏中当方块填满一行时便可以消行,每消去一行分数增加1,同时消去的行数越多,分数增长的越快。

5. 游戏的自动升级功能

该游戏设置的游戏等级是自动增加的。当玩家达到一定的分数时,游戏等级上升,当然游戏难度也会上升

3.2游戏代码分析

3.2.1 绘制方块

游戏操作区域就是由10*18个16*16的网格组成,这些网格实际上就是通过Graphics 方法画出一条条线组成的,当游戏开始后就会在界面上显示出来,实现代码如下:private void paintReseau( Graphics g ) //绘制网格

{

g.setColor( gameBG );

g.fillRect( 0, 0, s_line_between_x, s_height );

if( isShowReseau )

{

g.setColor( gameColor[0] );

for( int i=0; i

{

g.drawLine( i*s_box_h, 0, i*s_box_h, s_height );

}

for( int j=0; j

{

g.drawLine( 0, j*s_box_w, s_line_between_x, j*s_box_w );

}

}

}

3.2.2 绘制方块

游戏总共设计了7种造型,每种造型又可以通过旋转而变化出4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动。游戏方块本质上为16个小砖块组成的正方形,一共有七种,如“田”字形、“L”字形等。每种方块一共有四种旋转变化,程序中是用16进制表示的这些方块,这些用16进制表示的方块可以换算成用一个4×4的二维数组来存储每种方块的一种状态。在有色砖块出现的位置,值为1,而只有背景颜色,无需绘制的位置,值为0。如下图所示为“长条”形的四种状态在数组中的存储方式。

图5方块模型

这4种状态的16进制→{ 0x2222, 0x00F0, 0x2222, 0x00F0 }

游戏实例图如图6所示:

图6 方块实例

private static final short box_sum[][] = new short[][] //所有方块图形

{

{ 0x0660, 0x0660, 0x0660, 0x0660 },

{ 0x2222, 0x00F0, 0x2222, 0x00F0 },

{ 0x0264, 0x0630, 0x0264, 0x0630 },

{ 0x0462, 0x0360, 0x0462, 0x0360 },

{ 0x02E0, 0x4460, 0x0740, 0x0622 },

{ 0x0E20, 0x2260, 0x0470, 0x0644 },

{ 0x0464, 0x00E4, 0x04C4, 0x04E0 }

};

绘制代码如下:

private void paintBox( Graphics g, int off_x, int off_y )

{

for( int i=0; i<4; i++ ) //行

{

for( int j=0; j<4; j++ ) //列

{

if( (box[box_state] & matrix[i][j]) == matrix[i][j] )

{

g.setColor( gameColor[ boxColor ] );

g.fillRect( (off_x+j)*s_box_w, (off_y+i)*s_box_h, s_box_w, s_box_h );

g.setColor( gameBG );

g.drawRect( (off_x+j)*s_box_w+1, (off_y+i)*s_box_h+1, s_box_w-2, s_box_h-2 );

}

}

}

goDown(); //BOX是否下降

}

3.2.3 随机出现方块

游戏总共设计了7种不同的方块,每次游戏是方块的出现都是随机的,这种方法是通过random函数实现的,

public void setNextBox()

{

s_next_box = (short)rand.nextInt( box_sum.length );//random()方法

System.arraycopy( box_sum[s_next_box], 0, next_box, 0, next_box.length );

s_next_box++;

}

具体实现方法是用random函数产生下一个将要出现的方块,把该方块放到预览窗口,然后程序中通过自定义方法setBox()

private void setBox() //将next_box设置成当前可控制box

{

box_state = 0; //box 状态

s_box_x = init_x; //当前方块坐标X

s_box_y = init_y; //当前方块坐标Y

boxColor = s_next_box; //设置当前BOX颜色

System.arraycopy( next_box, 0, box, 0, next_box.length ); //box = next_box

goDownPreTime = System.currentTimeMillis(); //设置好当前BOX 后计时

setNextBox(); //设置下一个BOX

if( !isCanMove() )

{

setGameOver( true );

}

}

把随机产生的方块放入到游戏操作区域

具体调用方法如下:

private void initGame()

{

level = 1; //等级

success = 0; //得分

map = new short[s_box_h_sum][s_box_w_sum];

setNextBox(); //设置下一个BOX

setBox(); //将下一个BOX设置成当前BOX

setGameOver( false ); //恢复游戏

}

3.2.3 最高分的设定

图7 最高分界面

当游戏结束时在结束界面可以点击“最高分”按钮,该游戏记分系统的功能指定在RecordCanvas类内。采用的是手机专用的一种简化的数据库Record Managerment System(RMS),记分系统记录每次玩的最高的分数并在最高分界面显示出来。当玩家的得分超过上次的最高分时即打破记录,系统显示祝贺信息,没有通过最高分时也会出现激励信息提示。图7所示为界面图,以下是所需主要代码:

public void paihang(){

String s =Integer.toString(success);

frm2=new Form("最高分");

cmd3=new Command("返回",Command.BACK,1);

cmd4=new Command("退出游戏",Command.SCREEN,1);

frm2.addCommand(cmd3);

frm2.addCommand(cmd4);

addRecordToRMS(s);

frm2.setCommandListener(this);

try {

String a = null;

String b=null;

int number=Tetris.rs.getNumRecords();

s2=displayRecordFromRMS(number);

if(number==1){

a=s2;

}

else if(number>1){

a=displayRecordFromRMS(1);

int one=Integer.parseInt(s2);

int two=Integer.parseInt(a);

if(one>two){

a=s2;

b="真棒!!!你是最高分";

updateRecordToRMS(a,0,a.length());

}

else{

b="不是最高分,要加油哦!!!";

}

}

st1=new StringItem(null,"本次游戏分数:"+s+'\n'+"最高分为: "+a+"分"+'\n',Item.PLAIN);

st2=new StringItem(null,b,Item.PLAIN);

Font

f1=Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_LARGE);

Font

f2=Font.getFont(Font.FACE_SYSTEM,Font.FONT_STATIC_TEXT,Font.SIZE_LARGE);

st1.setFont(f1);

st2.setFont(f2);

} catch (RecordStoreNotOpenException e) {

System.out.println("记录存储打开异常");

}

st1.setLayout(https://www.doczj.com/doc/4a11617009.html,YOUT_CENTER);

frm2.append(zgfImg);

frm2.append(st1);

frm2.append(st2);

Tetris.s_display.setCurrent(frm2);

}

3.2.5 按键的判断

图8 游戏运行图

(有网格)(无网格)(帮助)开始游戏后,方块在游戏容器中实现向左移动、向右移动、下落及旋转变形。这些动作是通过手机导航键上、下、左、右或者数字2、4、6、8实现的,分别对应变形、下落、左移、右移。游戏中帮助键可以进入帮助界面,数字‘1’可以清楚网格,按#可以暂停游戏,按数字*可以重新开始游戏。游戏界面如图8所示,以下是实行代码:

public void keyPressed( int key )

{if (key == 35)

{ isPaused = !isPaused;

}

if (!isPaused){

key = getKeyCode( key );

switch( key )

{

case UP: //顺时针旋转

isKeyDown = 0; //0没有按下

box_state ++;

box_state %= 4;

if( !isCanMove() )

{

box_state --;

if( box_state<0 )

box_state = 3;

}

break;

case DOWN: //向下移动

if( isKeyDown == 2 )

isKeyDown = 1;

if( isKeyDown == 1 )

{

s_box_y ++;

if( !isCanMove() )

s_box_y --;

}

break;

case LEFT: //向左移动BOX

isKeyDown = 0; //0没有按下

s_box_x --;

if( !isCanMove() )

s_box_x ++;

break;

case RIGHT: //向右移动BOX

isKeyDown = 0; //0没有按下

s_box_x ++;

if( !isCanMove() )

s_box_x --;

break;

case -7:

Form frm=new Form("帮助");

frm.append("用导航键上、下、左、右或者数字‘2’‘5’‘4’‘8’可控制方快移动"

+"\n\n"+"数字‘1’可以清楚网格"+"\n\n"+"按“*”键可以重新开始游戏"

+"\n\n"+"按#可以暂停游戏");

cmd=new Command(" 返回",Command.STOP,1);

frm.addCommand(cmd);

frm.setCommandListener(this);

Tetris.s_display.setCurrent(frm);

break;

case 42:

initGame();

break;

case 48:

setBox(); //新的BOX

break;

case 49: //是否显示网格

isShowReseau = !isShowReseau;

break;

}

}

repaint(); //重新绘制屏幕

}

3.2.6 边界检测

游戏中可视的游戏操作的区域在程序中定义好了,

private static final int s_width = 240;

private static final int s_height = 288;

如果不处理的话方块会移动到可视范围外,对此我做了个边界检测处理方法,当方块移动到游戏操作区域边界时再移动就会失去效果,是方块不管怎么移动多是在可视界面中,而且当新方块与已在游戏界面中的方块接触时要停下来,不能越过去,

具体实行代码如下:

private boolean isCanMove()

{

for( int i=0; i<4; i++ ) //行

{

for( int j=0; j<4; j++ ) //列

{

if( ( box[box_state] & matrix[i][j] ) == matrix[i][j] ) //是格子

{

if( s_box_x+j < 0 ) //左边界检测

{

System.out.println( "left s_box_x="+s_box_x+" matrix["+i+"]["+j+"]="+matrix[i][j]);

return false;

}

if( s_box_x+j > s_box_w_sum-1 ) //右边界检测

{

System.out.println( "right s_box_x="+s_box_x+" matrix["+i+"]["+j+"]="+matrix[i][j]);

return false;

}

if( s_box_y+i > s_box_h_sum-1 ) //下边界检测

{

System.out.println( "down s_box_y="+s_box_y+" matrix["+i+"]["+j+"]="+matrix[i][j]);

return false;

}

//地图格子检测

if( map[s_box_y+i][s_box_x+j] > 0 )

return false;

}

}

}

return true;

}

3.2.7 得分与升级

在游戏中移动方块,当方块可以填满一行时改行就会消去,同时分数会增加,增加的分数值为行数的平方。当分数达到一定的有求后就可以升级,升级后游戏难度会增加,也就是游戏方块下落速度会加快,实际上就是方块下落的延迟时间减短了。

得分升级代码:

private void setMap()

{

for( int i=0; i<4; i++ ) //行

{

for( int j=0; j<4; j++ ) //列

{

if( ( box[box_state] & matrix[i][j] ) == matrix[i][j] ) //是格子

{

map[s_box_y+i][s_box_x+j] = boxColor;

}

}

}

//检测是否可以消去一行

int line_success = 0;

for( int i=0; i

{

if( isFullLine( i ) ) //这行可以消去

{

setNullLine( i ); //设置第i行为空

setGoDownMap( i ); //地图第i行以上的向下移动一行

line_success++;

}

}

success += line_success*line_success; //设置得分

level_up = (int)(goDownDelayTime[0]-goDownDelayTime[level]);

if( success >= level_up ) //设置升级

{

level %= goDownDelayTime.length;

level ++;

}

}

方块下落延迟数组:

private static long goDownDelayTime[] = //1800; //下降延迟时间

{

1000, 900, 800, 700,

600, 500, 400,

300, 200, 100

};

3.3游戏演示

3.3.1 游戏帮助界面

在游戏运行状态按下“帮助”键就会进入帮助界面,在帮助界面里介绍了本游戏的使用方法。

图9 帮助

相关主题
文本预览
相关文档 最新文档