现在的位置: 首页 > 综合 > 正文

泡泡龙游戏算法实现简介

2018年01月20日 ⁄ 综合 ⁄ 共 1858字 ⁄ 字号 评论关闭

最近在公司新接了一个游戏的修改任务。游戏名字叫《彩色泡泡》。主要是参考经典的泡泡龙实现的。这个游戏从接手到修改,走了很多弯路。我修改后的代码简直是惨不忍睹。也许再过一段时间我看自己的代码,可能会说“靠,哪个SB写的代码”。所以写这份文档一是对我代码的一个补充,二是对泡泡龙出现的算法自己做一个小小的总结。

    言归正传,泡泡龙的主要算法有下面几个:1、发射泡泡的运动轨迹。2、发射泡泡的碰撞检测。3、发射泡泡运动停止的后的位置定位。4、泡泡的自动消除。5、泡泡的掉落。下面就这5个算法,一一简单介绍算法的实现。

    发射泡泡的运动轨迹。发设泡泡的运动轨迹主要是根据发射前泡泡的角度与初始化的发射速度来确定泡泡的运动轨迹。需要注意两个问题:一是发射速度不能过小,不然泡泡移动缓慢。二是移动的过程需要慢慢移动,比如在Y方向上每次移动的距离为20,那么就可以分成20次,每次移动1个距离,否则会由于移动速度的过大,导致碰撞检测有较大的偏差。

    发射泡泡的碰撞检测。碰撞检测是泡泡龙中的一个核心算法。如果碰撞做的不好,会发现泡泡从静止的泡泡上穿过去了,进而对泡泡的定位造成影响,使得泡泡定位的时候或出现泡泡重叠的现象。这会给用户造成非常不好的影响。

    移动的泡泡在什么时候会与屏幕上的泡泡相撞呢?我们可以把泡泡抽象成一个圆。圆与圆之间的关系有下面种:相离,外切,相交,内切,内含。很显然,如果泡泡如要相撞,必须要泡泡之间相交(相交的时候就必须把泡泡停止,然后修正位置,所以不考虑内切)。如果两圆心距用d来表示,两圆的半径分别用r,RR r)来表示。根据初中学的几何知识即可知,如果两元圆相交,其圆心之间的距离小于他们的半径之和,大于他们之间的半径之差。即当R-r<d<R+r 时,两圆相交。使用此方法与屏幕中的泡泡逐一进行碰撞检测。这样,就完成了对泡泡的碰撞检测。

    发射泡泡运动停止的后的位置定位。考虑这个问题之前,必须要知道如果发射泡泡与与屏幕上的一泡泡进行碰撞,它跟被碰撞的泡泡的关系。发射的泡泡必然在被碰撞泡泡的周围的六个位置,如下图所示。(发射的泡泡为红色泡泡,被碰撞的泡泡为绿色)。

 

    发射泡泡位于被碰撞的泡泡同一列或下一列情况很常见所以很容易理解,但位于被碰撞泡泡的上一列也是有可能的。当发射泡泡与被碰撞泡泡的上部分发生碰撞的时候就会是这样的情况。

    泡泡的自动消除。泡泡龙游戏的核心规则是当发射泡泡定位以后如果跟三个或三个以上相连的泡泡同色,那么就可以进行消除。很显然,这个可以使用递归来优雅而又简单的解决。从新放上去的泡泡开始,检查跟那个新泡泡相切的四周的泡泡,如果有同色的泡泡,将泡泡的状态设为BUBBLE_CAN_POP,然后继续检查被标为BUBBLE_CAN_POP四周的泡泡是否与它同色,如果同色,也将它标为BUBBLE_CAN_POP……如果被标为BUBBLE_CAN_POP的数目大于3,那么满足消除条件。否则,需要将状态还原。

    泡泡的掉落。如果泡泡发生消除,可能由于一些泡泡失去“连接点”而导致泡泡掉落。当然,最顶部的泡泡的“连接点”是永远都不会失去的。因为他的连接点是顶部的墙壁,而其他泡泡的连接点只能是依附在其他泡泡之上。所以,当泡泡消除这个动作完成之后,我们检查所有的泡泡通过泡泡之间的联系而与上面一排的泡泡是否相连。只要与上面一排的任何一个泡泡相连,那么该泡泡就不会掉落。反之,该泡泡就会掉落。所以,我们循环上面一排所有的泡泡,使用递归的方法把跟上面泡泡直接相连或间接相连的泡泡的状态标记为BUBBLE_LINK_TO_TOP,然后理所当然的,未标记为BUBBLE_LINK_TO_TOP就是失去连接点的泡泡。

    整个泡泡龙算法基本介绍完毕。最后两个算法都是使用递归的方法。尤其要注意递归的出口。整个算法基本由同事提供,自己做了一定的修正。有兴趣的可以讨论。


    试玩demo:http://download.csdn.net/detail/luchenqun/8429481  (0积分下载)

    源码地址:http://download.csdn.net/detail/luchenqun/8429463  (10积分下载。由于我有时要点积分下载csdn的东西,各位谢谢。没有积分的新注册一个csdn账号会送20积分。注意:由于我们是在一个平台下开发这个游戏的,平台相关代码不允许上传的,所以各位只能看源码里面的算法,直接下载下来是肯定不可以编译运行的,请各位理解)

抱歉!评论已关闭.