到这里,笔者以为已经思路俱备,只欠实现了.而且,这样做有个好处,就是可移植性强.可以在别的跟折点连接有关的程序中.在本游戏中,就可以一个算法实现不同数目的折点连线的检查,并且可以随加随减.于是,笔者开始动笔写了.
写出来以后,测试才发现,这种算法在Flash中禁止执行,原因是递归超过256级,而且方阵只有5*5(把边缘算进去以后是7*7).笔者在草稿本上画了个5*5的方阵,尝试让左下方的点往右上方的点走,并且折线的折点数不超过2 这里可以用严密的数学方法排除大部分的路,但是笔者的数学比较烂,而且实际上也没有这个必要.在Flash游戏制作中,技术是为实现规则服务的,我们不应该通过规则来表现游戏作品的技术含量.
所以,这里用一种很直观很好理解的算法,来实现连接的检验.这种算法,笔者姑且把它称作逐级算法.就是先看能否直线连接,若不行,再拐一个弯,再不行,继续拐弯.这也符合一些游戏者玩游戏时判断连接的方法.
这里,笔者把检验连接是否成功定义为一个函数checkNoBarrier(x1,y1,x2,y2),true表示连接成功,false表示连接失败.所以,返回true一般比返回false快.因为只要有一根折线连上了,就可以退出函数.而false则要所有尝试都失败了才能返回(当然,如果一开始先检验一些特殊情况如某方块给障碍物紧紧包围的话,返回false的速度会快一些,不过这些情况在后面的一般检验中也包括了,所以代码会显得散乱,但如果追求运行效率的话,用该法也未尝不可)
一级连接检验,所谓一级连接检验,就是检验两方块之间能否直线连接,其必要条件之一就是两个块的横坐标或纵坐标相等,否则,马上离开一级检验,进入二级检验.这里很容易忽略的一个情况就是两个方块相邻.这时,y1与y2之间没有点.如果不检验就会错误地跳到二级检验里去.为了避免这种状况的出现,可以在循环之前,定义一临时变量temp=true,然后才到循环语句,遇到障碍物就让temp=false,并且跳出循环.这时,对于相邻的情况来说,因为循环次数为0,所以temp绝对为true.
综上所述,temp=true,checkNoBarrier就返回true,否则要进入二级检验.
二级连接检验
一级检验后,发现两方块无法通过直线连接起来,便尝试一个折点的折线能否把两个方块连接起来,这就是二级检验.
二级检验在排除了一级检验的条件后,对两方块的坐标关系没有要求.所以,若横坐标或纵坐标相等,就直接进入三级检验. 图10中,如果要让图中的两黄方块成功实现二级连接,必须且只需让红线或蓝线经过的地方没有障碍物.把横坐标相等时的一级检验函数定义为checky1(x,y1,y2),把纵坐标相等时的一级检验函数定义为checkx1(x1,x2,y)
那么,检验红线的结果将由如下表达式决定:
(checky1(x1,y1,y2+1) && checkx1(x1-1,x2,y2))
该表达式返回true,那么checkNoBarrier就返回true,否则检验蓝线能否连接:
(checky1(x2,y1-1,y2) && checkx1(x1,x2+1,y1))
希望读者注意到其中的加一和减一运算.这个问题很容易被忽略.至于为什么,请读者细心观察一级检验中要检验的点的分布特征.
该表达式返回true,那么checkNoBarrier返回true.否则二级检验结果为false;要进入三级检验
因此,以下表达式的真假决定是否不需要进入三级检验.
(checky1(x1,y1,y2+1) && checkx1(x1-1,x2,y2)) || (checky1(x2,y1-1,y2) && checkx1(x1,x2+1,y1))
图10中两绿块的分析方法类似.
三级连接检验
通过两方块,折点数为2的折线有很多条,如果像二级检验那样直接分解为一级检验,循环次数还是比较多的,并且需要多次读取某个点(比如图11中的红线跟蓝线就要重复读三个点,即黄色标记的部分).所以,从方块出发的一级检验用其它方法替代.在图13中,以下点对可以作一级检验,只要有一个返回true,checkNoBarrier就返回true.
(0,7),(0,9)如果觉得三级检验分两步麻烦,希望直接使用一级检验的话,也可以.
就把以下所有点对都检验就可以了(见图13).
(n,7),(n,9)
(2,m),(3,m)
其中,n为0~12的整数,m为0~10的整数.
这样代码可以简化,但由于一级检验本身就是循环,如果这里用这个办法的话,就要嵌套上一个更大的循环,运行效率不高,故这里还是不推荐用此法. 至此,连线算法已经介绍完毕.希望通过这个过程,大家可以从中悟出方块类游戏算法的一般思想. 至于该游戏的其它细节问题,在这里也稍微提一下.
1 检验的先后顺序
在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功.其中,配对只需要用个a+b==100就可以了,所以运算比检验连接快很多.所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算.当然,如果你在做这个游戏的时候,配对规则不像笔者的如此简单的话,那么就看哪个算起来麻烦就把它放在后面.
2 障碍物属性的存放位置
障碍物属性尽量不要用方块是否可见等外观因素来确定,外观因素应该由内部变量决定. 因为很可能,某天你要改成消方块只是需要让方块变灰,那么你的内部检验代码要修改,比较麻烦.尽量使用一个数组来存放这些属性.然后外观是另一套代码,这样便于维护,也方便放置动画效果.、
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |