基于JavaME的手机游戏 七彩连珠 的设计与实现
陈晖
(福建信息职业技术学院,福建福州350003)
完全二叉树求叶子结点个数摘要:Java M E技术为手机等智能消费类电子产品提供了一个安全的、可移植的嵌入式开发平台,可以支持多种设备和多个操作系统的应用环境。文章介绍了Java M E游戏开发技术的体系结构、功能特点;着重以七彩连珠游戏为例,探讨Java M E平台上手机游戏的设计与实现。
关键词:Java M E;手机游戏;M I DP;七彩连珠;E cli pse
中图分类号:TP311.11文献标识码:A文章编号:K124(2011)01-0024-04
0引言
随着移动通信技术和市场的快速发展,手机软件时代已经来临。手机硬件性能的提升和手机互联网的兴起,为手机软件行业提供了契机,当前正处于手机软件业高速发展的初期。就国内而言,庞大的手机用户量、手机互联网和游戏市场以及便捷的支付模式等优势都使得国内手机软件行业的发展更加乐观。Java ME是Sun公司针对手机、嵌入式等消费类电子产品推出的开发平台,与JavaSE 和Java EE共同组
成Java平台的3大分支。由于Java的跨平台性,Java M E手机软件开发具有移植性强的特点,使其能广泛应用于不同厂商的大多数智能手机和功能手机上。
1Java M E游戏开发概述
Java ME在设计之初就考虑到了对各类嵌入式平台的适应,它采用了模块化的结构,底层是宿主设备的操作系统,内部则分为Java虚拟机J VM(Ja va V irtualM achi n e)、配置Confi g uration和简表Pro file这3层。J VM保障与硬件设备和操作系统的交互;Confi g ura ti o n把各类设备分为运算能力较佳资源较充足的嵌入式装置CDC、运算能力和资源相对有限的嵌入式装置CLDC;而简表Pr o file则定义在Con fi g uration之上,更多针对了软件接口的定义,最重要的简表就是M I D P(M icr o Infor m ati o n Dev i c e Profile),它属于CLDC有限连接配置,目前已广泛应用于Java手机、PDA等设备中,成为移动设备应用开发的良好平台[1]。
一款优秀的游戏程序都具备交互性强、画面美观流畅、流程逻辑严密等特点,所以其复杂性不逊于中大型的信息管理系统。游戏程序往往代码利用率很高,一个实时运行的最终作品,每秒都可能要运行上百上千行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行后出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中[2]。游戏中为了美观、适用性强,可能需要采用外部文件引入的图
片、影音等,在M I D P2.0中提供了用于增强游戏功能的ga m e包,使得开发者对于静态或动态、画面背景、屏幕刷新的双缓冲等难题都有了较好的解决方案。
2 七彩连珠 游戏的程序结构、设计思路与相关技术
七彩连珠 (又名五连棋)是一款益智类棋盘游戏,在一个9!9的棋盘上,玩家移动棋子,使得同棋子在横竖斜方向上连成5子便可消去,即得分且不新出棋子;否则新生成3个颜和位置随机的棋子,如此直到填满棋盘则游戏结束。
以面向对象程序设计的思路来分析,该游戏中包含了棋盘、格子、棋子等对象,它们各自需包含宽
24
福建信息技术教育
自学编程能学到什么程度
Fu ji an Educati on of Infor m ati on Technol ogy2011年第1期
*收稿日期:2010-10-11
作者简介:陈晖(1979-),男,汉族,福建莆田人,实验师,硕士,研究方向为计算机软件与网络。
高、外观、坐标等属性以及绘图、显示、定位等方法;除了游戏内容对象外,Java ME游戏程序中还需设计一些辅助程序对象,比如游戏画布C anvas、游戏控制器M I D let、游戏菜单等对象。那么最终该游戏的对象结构包含如下内容:游戏入口为类Ga m e M I D le,t用于控制程序的启动暂停、屏幕的显示跳转以及程序对象的初始化等;游戏主画布Color C anvas,负责游戏内容对象的初始化、记录管理、用户交互响应和游戏流程控制等功能;棋盘类Board,设置棋盘背景,定位和绘制棋盘;棋子类G ri d,包含棋子颜、坐标等属性和定位、设置颜等方法;棋子辅助功能类M aze,提供获取指定棋子的四周格子、获取棋子走到目标格子的路径等方法;公共工具包,提供图像处理、游戏菜单、记录管理、公共画布等功能。
游戏开发中往往需要涉及大量图片、背景和层的处理,M I DP2.0以上版本提供了辅助类精灵Sprite,用于管理角动画,它可以实现图片分割、帧设置、旋转翻转和碰撞检测等功能;另外还提供了适合构建地图背景的类T il e dLayer;但在游戏角和背景图片大量增加时,程序开发的复杂性也随之增加了,M I DP2.0提供了图层管理类Layer M an ager,帮助我们有效管理程序中的各个Sprite和T iledLayer类。此外,本程序中还使用了PNG图片压缩、RecordStore记录管理工具类等技术[3]。
3 七彩连珠 游戏的关键点分析与解决
该游戏设计中有几个重点和难点的问题。比如,棋子走到目的格子的路径算法,如何判断2个格子间是
否有通路,以及搜索最短路径的问题关系到整个游戏的运行效率和用户体验,是该游戏的成败关键;游戏界面也是用户体验的关键所在,程序能根据不同的手机屏幕来动态地调整游戏界面,并支持触摸屏。接下来即对这些难点问题进行分析,并给出解决的办法思路。
java手机游戏下载搜索棋子到目标格子的行走路径,就要从当前格子开始,获取上下左右4个方向上的格子对象并判断它们是否可走,如果有可走格子则将棋子走过去,如果没有则回退一步,再重复这一过程直到到达目标格子或没有可回退的格子。依此思路,首先我们应创建一个二维数组grids用于记录棋盘的每个格子上棋子的数据;还需要创建2个数组型变量passed和bad,一个用于存储棋子走过的格子,另一个用于存储棋子回退过的格子;获取周边格子的过程会被循环调用,所以我们也应该创建一个函数get A roundG rids,用于获取上下左右4个方向上的格子,并根据当前位置优化获取次序,这也是本程序中对搜索最短路径的优化算法之一。创建完这些变量和函数之后,我们来探讨路径搜索的具体过程:在当前格子上根据与目标格子的位置关系,调整上下左右4个方向的优先次序,依次获取4个方向上的格子对象;依次判断4个格子上是否为空白位,并且不是棋子走过和回退过的格子,即不在passed和bad中,符合条件则棋子走过去并设置为当前格子,还要把该格子添加到passed中;若4个格子中都没有可走位置,则回退到上一个格子上,即passed中的最后一个格子对象,并把该格子从passed中转移到bad中,还要设置上一个格子为当前格子;循环此过程直到棋子到达目标格子,则passed中存储的格子即组成了最终的棋子行走路径。当然也有目标格子不可到达的情况:即在循环中,判断若不但当前
格子四周无可走位置,而且还无可退位置,即四周格子不是已有棋子就是bad中已回退过的格子,此时则说明该路径搜索失败,当前格子没有到目标格子的路径,路已经被现有棋子堵住了,则返回的passed数组为空。至此则完成了棋子到达目标格子的路径搜索。
根据手机屏幕大小动态调整游戏界面也是体现游戏兼容性的重要指标。本程序也实现了这个功能:在程序初始化时,根据屏幕大小调整棋子、格子图片的尺寸,并根据图片尺寸设置棋盘宽高、边距,以及格子、棋子的位置、间距等。
本游戏属于棋盘游戏,若用键盘进行移动则会显得很麻烦,所以对触摸屏的支持也是提高游戏质量和用户体验的重要环节。本程序也实现了这个功能:实现po i n ter Pressed方法,获取触摸位置坐标,根据相对位置换算成棋盘上的格子坐标,作为参数传递给 走棋 函数。但这里要设置游戏状态标识,以区分是在游戏状态触发事件,还是在选择菜单或非游戏状态下的事件。
以上较详细地描述了本程序的棋子路径搜索、屏幕自适应和支持触摸屏等问题的解决思路,接下来则结合代码,对一些具体过程进行更细致的探讨。
25
w3school绝对定位原理2011年1月陈晖:基于Java M E的手机游戏 七彩连珠 的设计与实现
4 七彩连珠 游戏的代码实现与描述说明
4.1判断是否有五连棋子
01public boolean judge(Grid gri d){
02boo lean good=fa lse;
03i n t color=grid.val u e,x=grid.x,y= gri d.y;
04i n t stepx[]={0,1,1,1},stepy[]={ -1,-1,0,1};//上、左上、左、左下
05V ector goodgri d s=ne w Vector();
mysql内连接查询语句
06i n t goodcount=0;
07for(int i=0;i<stepx.length;i++) {//4条直线上判断
08i n t sx=stepx[i],sy=stepy[i];
09x=gri d.x;y=grid.y;
10for(int j=0;j<2;j++){//反方向再一次
11wh ile(x>=0&&y>=0&&x<=8 &&y<=8
12&&board[y][x]==co lor){
13goodgr i d s.addE le m ent(g ri d s[y][x]);
14x+=sx;y+=sy;
15}
16sx*=-1;sy*=-1;
17x=gri d.x+sx;y=gr i d.y+sy;
18}
19i n t n=goodgrids.size()-1;//扣掉本身
20if(n>=4){//如果一条线上有5个以上同棋子则消掉
21goodcount+=n;
22Enum eration en=goodgr i d s.ele m ents();
23w hile(en.has M oreE le m ents()){
24G ri d g=(E le m ent();
25g.set V alue(0);
26board[g.y][g.x]=0;
27b lankgrids.addE le m ent(g);
28}
29good=true;
30}
31goodgr i m ove A ll E l e m en ts();
32}
33if(goodcount>=4){//有消棋子
34goodcount++;//加上本身
35sco re+=2*(goodcount-5)*(good count-5)+10;
36h i g hsco re=M ath.m ax(score,h ighscore);
37rsuti.l set R ecord(1,h i g hsco re);
38}
39retur n good;
40}
说明:函数的功能是判断当前棋子是否构成同棋子连珠,若有5个以上则返回true,否则返回false。代码行4定义了从上、左上、左到左下4个方向上的xy坐标矫正值;代码行7开始在以上4个方向上查是否有同棋子;代码行10在以上4个方向的反方向上再次查是否有同棋子,因为他们都是在同一
条直线上的;行11到15为如果当前格子是同棋子,则把它添加到同棋子数组goodg ri d s里,并且查该方向上的下一个格子;行19到30为如果一条直线上有5个以上同棋子时,则在棋盘上把它们都消去,然后累加消去的棋子数,并设置返回值标识为true;行31把goodgrids 清空,以便查下一个方向;行33到38为如果有消去棋子,则根据消去的棋子数计算加分;最后返回函数结果,是否有构成同五连珠。
4.2判断并获取棋子走到目的格子的路径
01pub lic V ecto r connect(Grid g1,G rid g2){
02G ri d nowgrid=g1,pregri d=no wg ri d;
03boo lean alive=tr ue;
04wh ile(!no wg ri d.equals(g2)&&alive){
05ali v e=fa lse;
06G ri d nextgrids[]=get A roundG ri d s(now g ri d,g2);//1.4个方向上的下一个格子
07for(int i=0;i<nextgrids.length;i++) {
08if(nex tgrids[i]==nu ll)
09conti n ue;
10//2.空白位置且不在bad,passed中的,则走过去
11if(nextgrids[i].val u e==BLANK&&! a i n s(nex tgrids[i])
12&&!a i n s(nex tgrids[i])){
13passed.addE le m ent(no w grid);
14nowgr i d=nex tgrids[i];
26福建信息技术教育2011年第1期
15alive=true;
16break;
17}
18alive=alive||(nex tgrids[i].value== BLANK&&!ai n s(nextgrids[i]))
19||ai n s(nextgrids[i]);
20}
21if(!alive)break;
22if(pregrid.equals(no wg ri d)){//3.4个方向上都没有未走过的空白格子,则回退
23bad.addE le m ent(no w gri d);
24nowgr i d=(Grid)passed.lastE le m ent();//回退到passed中的最后一个格子
< move E le m ent(nowgrid);
26}
27preg ri d=nowgrid;
28}
29return passed;
30}
程序行6寻棋子在上下左右4个方向上的下一个格子;代码11到17判断该格子是否为空白,且在本次路径搜索时没有走过也没有回退过,即不在bad、passed记录中,若符合条件则棋子走过去,并把该格子记录到passed中;代码15为当有可走格子时,把alive标识为tr ue;代码18到21再次标识ali v e,表示在棋子有新格子可走或有格子可退时,当前棋子还没有走到死路,搜索程序还将继续工作,否则退出搜索;代码22到26为若4个方向上都没有可走格子则把该格子记录到bad中,然后把棋子回退到上一个格子中,即passed里的最后一个格子,并把它从passed中删除掉。以上过程一直循环执行,在两种情况下结束:一种是到棋子走到目标格子是结束,即到了该路径;另一种是passed 中无记录,棋子无格子可退时结束,即棋子无法到达目标格子。而经过以上循环,数组passed中保存的格子就是棋子走到目的格子的路径记录。4.3程序截图
编写简单的shell脚本程序测试环境为J DK1.6、WTK2.5,程序运行截图如图1所示,屏幕中央为游戏棋盘,浅绿方框表示当前选定的格子,可用方向键或触摸屏进行移动;上方一行从左往右依次为历史最高分、下一
轮出现棋子提示和本局得分。
图1程序运行截图
5总结
本文通过对Java手机软件开发的相关基础知识的阐述,辅以七彩连珠游戏设计与开发的全过程,探讨了基于Java M E的手机软件开发的关键技术与实现。基于Java ME平台的手机软件开发已得到广泛的应用,特别在手机游戏方面具有十分广阔的应用前景。
参考文献:
[1]托普雷.J2M E技术手册[M].张伶,译.北京:中国电力出版社,
2004.
[2]万辉,王军.基于E cli p s e环境的J2M E应用程序开发[M].北
京:清华大学出版社,2009.
[3]杨军,秦冬,王莹.J2M E嵌入式开发案例精解[M].北京:电子
工业出版社,2007.
27
2011年1月陈晖:基于Java M E的手机游戏 七彩连珠 的设计与实现