基于MTK的连连看游戏的开发与实现
2012-07-06匡皓璐易叶青
匡皓璐,易叶青
(湖南人文科技学院计算机科学技术系,湖南娄底417000)
由于手机拥有庞大的潜在用户群体以及便携性、网络化等特点,手机游戏的出现就是一个必然的结果[1-2]。手机游戏发展到今天,无论是在种类和内容都有着飞速的发展,现有的手机游戏大体可分为模拟类、战略类、动作类和益智类等,各类游戏的市场份额如图1所示。连连看游戏起源于《四川麻将》和《中国龙》,游戏的主要内容是从给出的一堆图像中寻找相同图像进项简单的配对[3]。连连看游戏在PC上实现后,立即吸引了众多玩家,并迅速传遍了世界各地[1—4]。
图1 各类手机游戏的市场份额
由于连连看游戏规则简单,只要将相同的两个图标用三根以内(包括三根)的直线连在一起就可以消除,游戏速度节奏快,画面可以根据不同类型用户的需要而设计,清晰可爱,因此比较适合细心、反应敏捷的玩家[5]。多样式多变化的地图,使玩家在各个游戏水平都可以找到挑战的目标,长期保持游戏的新鲜感。连连看游戏也吸引了众多程序员开发出多种版本。随着移动通信的飞速发展,各种大屏幕触摸手机的推出,使得在手机上玩连连看这一类的游戏成为可能,如果在手机上能成功地开发出连连看游戏则必然会受到用户的青睐。然而不幸的是这种针对传统PC机的连连看游戏很难直接移植到MTK手机平台上,这是因为[1-2]:(1)手机的内存容量和处理速度还远达不到PC机的水平;(2)手机大都采用电池供电其能量受限。
为此,笔者对已有针对PC机的连连看游戏的核心算法和代码质量进行了优化,并在MTK手机平台上成功实现了一款连连看游戏软件。
二 连连看游戏软件的总体设计
连连看游戏应具有基本功能:图像处理、声音处理和事件处理。这些功能均需要在MTK手机上运行(如图2)。
Windows XP系统下提供的开发环境包括MRE SDK和Microsoft Visual Studio 2008,采用C语言实现图像处理,声音处理,调用MTK底层借口实现事件处理等基本功能。实现完成后,在载入MTK手机硬件运行之前,可以在Windows环境进行模拟调试工作。MTK平台提供的MRE SDK模拟器可以使开发人员省去了在真实手机设备中的测试麻烦,从而提高了应用程序的开发效率。
图2 连连看游戏的总体方案
关于图像处理的问题,MTK提供了mimoResourceDrawPairImage和mimoDrawImg FromBuf接口,它们可以实现各种不同格式的图形的绘制。
关于声音的处理,MTK提供了 mimoAudio-SetVolume接口,由于不同的手机使用的声音播放软件不同,所以支持的声音格式也不相同。声音格式有 WMV、MP3、MIDI等,手机支持的声音格式,可以根据手机型号不同去查阅文档。
事件处理是通过MTK应用程序中注册的事件处理函数来处理的。
三 连连看游戏软件的界面设计
(一)Logo界面设计
Logo界面是应用程序启动后显示的第一个界面,目的是展示开发游戏的公司和增加游戏的炫彩效果。在界面中,应用程序在屏幕中间位置绘制了动态图像,并绘制了动态的进度加载效果,同时提示用户在游戏过程中可能出现的收费问题。
(二)主菜单界面设计
Logo界面演示完了之后程序自动进入主菜单界面。设计菜单界面的目的是为了对即将运行的游戏做些相关设置,从而产生不同的游戏效果,同时菜单也提供了一些与游戏有关的信息介绍,帮助新老玩家更快的熟悉该游戏。
根据功能需求,菜单主界面包括:开始游戏、声音设置、美女图库(游戏过关的奖励,第一次进入游戏未过关之前不能选择)、帮助菜单、以及退出应用游戏。每个菜单项都对应了一个属于自己的功能界面。只要事件触发,就会切换到相应界面。游戏主菜单界面的层次结构(如图3)。
开始游戏:直接进入游戏界面(如图4),游戏正式开始,游戏界面的设计及事件处理在后面小结介绍。
声音设置:设置游戏音乐的音量大小。程序中设置5个等级,调用KDE底层的接口函数mimoAudioSetVolume(MIMO_AUDIO_VOLUME_LEVEL level)来实现,参数level代表音量的大小,取值范围在0-5之间,其中0表示静音,5表示最大音量。主要事件:触屏点击调节音量大小,触屏点击返回主菜单。
图3 主菜单界面
图4 游戏的游戏界面
美女图库:进入美女图库查看过关奖励,每过一关解锁一张美女图片,共15张,全部解锁就通关。第一次进入游戏未过关之前不能选择,图标呈灰色状态。主要事件:触屏点击前后翻看美女图片,触屏点击返回主菜单。
帮助菜单:图片显示帮助信息,显示游戏规则,怎样消除图片,只处理一个事件,返回主菜单。
退出菜单:关闭应用程序。
(三)游戏界面设计
根据连连看游戏的特点和对用户需求的分析,游戏界面设计为全屏模式,包括屏幕下方的时间进度条和工具,屏幕中央的游戏区域,以及屏幕下方的返回区域(即暂停),如图4所示的布局去设计。
游戏界面的主要功能包括时间控制,布局算法,连通算法,绘制屏幕,消除效果动画,将在以下各小结进行描述(如图5)。
用户的每一次有效操作都会触发一个事件,程序将调用相应的事件处理机制,如连通算法。程序每隔一段时间进行一次刷屏。它将根据当前剩余时间和处理事件时改变了的地图参数信息,重新绘制屏幕。
图5 连连看游戏界面功能
用户的事件操作包括触屏点击选中图片。如果当前选中的是第一个图形,则不做任何操作,只将该图形变灰处理,改变结构curPic中的参数。如果选中的是第二个图表,先判断选中的是否是相同的图片,如果是的,就需要进行连通判断,即调用连通算法mmHavePath。连通的算法的实现后面部分详细介绍。
四 核心算法的优化
(一)连通算法的优化
在本文的游戏系统中,对已有连连看的连通算法[6-7]进行了优化,减少运算,优化了执行效率,分为以下两种情况讨论:
1.直线连通:两个图片的纵坐标或横坐标相等,且两者连线间没有其他图片阻隔。实现代码:
if(c1.x==c2.x&& absolute(c1.y -c2.y)= =1||c1.y= =c2.y && absolute(c1.x -c2.x)==1)
return mimoTrue;
2.不相邻的两个图片,分为水平方向和垂直方向:如图6和图7,为了找出A,B两点之间的连接路径,首先过这两点作4条线段,线段的两端便是地图边缘,两条与横坐标轴平行,另两条与纵坐标轴平行,先考虑与横坐标轴平行的两条。
在两条线段上各取一点C和D,此两点处在一条与纵坐标轴平行的直线上,那么,ACDB这条路径便是一条可能的A,B两点的连通路径。
C,D两点在两条线段上移动,直到找出一条有效的连通路径,或者最终得出结论不存在这样的路径。
按同样的方式在与纵坐标轴平行的两条线段上查找。
图6 水平方向
图7 水平方向
两点的连通路径应该是最短的,所以,查找从A,B所处的矩形的中线开始,同时从上下左右4个方面查找,可以找到看起来最短的连通路径.
根据以上说明,可以看出,本游戏系统在连通算法上面相较于外面的连连看游戏连通算法思路更为清晰,也节约了运行时间(如图8)。
图8 为连通算法流程图
(二)游戏地图布局算法
由于连连看游戏的配对特性,在设计游戏地图时,一定要保证地图上生产的小方块是成对出现的[8]。如10*10的地图表示地图每行和每列均含10个地图块。每个地图块是随机给予赋值的,而这些值都来自图像资源编辑时对应的ID号,所以保证了载入的图像也是随机的。市面上已经发布的连连看游戏一般都是采用生成随机地图,将成对的图案放进临时地图存储空间中,然后从临时地图中取走一个图案放到空块上:随机挑选位置,int nIndex=(int(rand()*0.1+rand()*0.01+rand()))%tmpMap.GetSize();,再将选定的团放到空快上,最后在临时地图上删除该方块。如果采用这种方法,增加了内存的消耗,而手机因为自身的原因受到内存的限制,所以我对地图布局的算法进行了优化。为了尽可能保证各种图像出现机会的均等性,需调用mimoGetRandom函数获取随机数。首先,将所有地图块分两部分赋值。第一部分地图是为地图的前面一半随机赋值,而产生地图种类需要调用mimoGetRandom随机产生在18—24(一共有24种不同的地图图片)之间的一个数。第二部分是在第一部分完成之后,将第一部分的地图拷贝到整张地图的后半部分,这样就满足了所有的地图都是成对出现的。最后将整张地图上面的小方块随机排列。
(三)全地图搜索算法
图9 两次连通配对之间的相关操作流程
连连看游戏在每做一次连通配对之后,都有相应的后续操作,目的是为下次连通配对做准备。首先判断游戏地图上是否还有未消掉的图标对,即判断是否过关。然后需要对剩余的地图进行搜索,有无可连通图标对。若有,直接准备下一对图标的连通,若没有,则调用重列函数(mmDrawMap_Again),对地图上尚未配对的剩余图标重新布局,直到有可连通图标对为止。游戏在连续两次连通配对之间的相关操作流程图(如图9)。
全地图搜索可配对图标算法的实质是对每个地图块进行遍历,相互之间两两比较,图标值相等的话,则调用连通算法,直至找到第一对可连通的图标,搜索提前结束,对应流程图中返回true。如果都相互比较了一遍,搜索已经结束——仍无可连通图标,则返回false,此时,若要想游戏继续进行,必须调用重列机制,对地图上的剩余图标进行重新布局。
至此,我们在MTK平台上成功完成了连连看游戏的开发工作,游戏在手机模拟器上运转顺畅,也在真机上运行顺畅,可以满足用户要求。
[1]KENNETH A R.Pointers on C[M].北京:人民邮电出版社,2008.
[2]石民勇,税琳琳,等.手机游戏设计与制作教程[M].北京:中国传媒大学大学出版社,2007.
[3]罗伟坚.Visual C++经典游戏程序设计[M].北京:人民邮电出版社,2006.
[4]手机游戏未来发展趋势预测[EB/OL].http://wenku.baidu. com/view/0e563f335a8102d276a22f35. html,2012.1.
[5]陈凯.三维游戏引擎的设计与实现[D].浙江:浙江大学,2007(6).
[6]杨科选.人工智能寻路算法及其在游戏中的应用研究[D].长沙:中南大学,2009.
[7]张亮亮,夏正友.基于遗传算法求解游戏关卡问题[J].信息通信,2009,3(1):32 -36.
[8]威尔斯.J2ME游戏编程[M].北京:清华大学出版社,2005.