Flash小游戏-连连看算法大揭密

算法

  个题目有些夸张了,因为这个游戏本来是个比较简单的游戏.

  不过,这个简单游戏的技术问题是一类游戏如俄罗斯方块,纸牌游戏等制作的基础.通过对这个游戏算法的分析,特别是对检查连线的探讨,大家可以基本掌握这类游戏算法的基本思维方法.

  连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉.所以,下图的三种情况可以把方块消掉.笔者的游戏中,配对规则是两数相加等于100.

  配对的检查比较简单,只要用一个if语句,条件a+b==100就可以检验了.而两方块能否实现折线连接,则是个相对复杂的问题.笔者在这里把整个思路告诉大家.连连看的方块类似于棋盘,从一个格走到另一个格容易让笔者联想到小学数学奥林匹克竞赛中经常遇到的方格问题.虽说是小学的题目,但难度对笔者来说还是蛮大的,现在,那些题目的解答思路,笔者大概都忘光了.不过,作为计算机,可以尝试让程序把所有的走法列出来,再直接代入到条件来检验.这个算法的思路大致如下:让一个点往各方向走,走到障碍物为止.然后,其中经过的点,再往别的方向继续走下去.其中使用数组来标识各方块的相对位置.
  到这里,笔者以为已经思路俱备,只欠实现了.而且,这样做有个好处,就是可移植性强.可以在别的跟折点连接有关的程序中.在本游戏中,就可以一个算法实现不同数目的折点连线的检查,并且可以随加随减.于是,笔者开始动笔写了.

  写出来以后,测试才发现,这种算法在Flash中禁止执行,原因是递归超过256级,而且方阵只有5*5(把边缘算进去以后是7*7).笔者在草稿本上画了个5*5的方阵,尝试让左下方的点往右上方的点走,并且折线的折点数不超过2

  图中可以发现的确好恐怖,要走的路N多,并且有些路还会相交,相交的时候,还得检查哪根线的折点少.并且还有不少的路是根本不可能行得通的.所以,才导致递归级数高(如果用循环的话,次数也将很多).
  这里可以用严密的数学方法排除大部分的路,但是笔者的数学比较烂,而且实际上也没有这个必要.在Flash游戏制作中,技术是为实现规则服务的,我们不应该通过规则来表现游戏作品的技术含量.
所以,这里用一种很直观很好理解的算法,来实现连接的检验.这种算法,笔者姑且把它称作逐级算法.就是先看能否直线连接,若不行,再拐一个弯,再不行,继续拐弯.这也符合一些游戏者玩游戏时判断连接的方法.

  这里,笔者把检验连接是否成功定义为一个函数checkNoBarrier(x1,y1,x2,y2),true表示连接成功,false表示连接失败.所以,返回true一般比返回false快.因为只要有一根折线连上了,就可以退出函数.而false则要所有尝试都失败了才能返回(当然,如果一开始先检验一些特殊情况如某方块给障碍物紧紧包围的话,返回false的速度会快一些,不过这些情况在后面的一般检验中也包括了,所以代码会显得散乱,但如果追求运行效率的话,用该法也未尝不可)

  一级连接检验,所谓一级连接检验,就是检验两方块之间能否直线连接,其必要条件之一就是两个块的横坐标或纵坐标相等,否则,马上离开一级检验,进入二级检验.

  下面以横坐标为例,说明一级连接检验的算法.   若横坐标相等,则需要检验的是在y1和y2之间的这些点中是否存在障碍物,这里可以用循环方法检验.如果没有障碍物,则checkNoBarrier马上返回true,函数马上退出.否则,需要进入二级检验.

  纵坐标的检验方法类似.
  这里很容易忽略的一个情况就是两个方块相邻.这时,y1与y2之间没有点.如果不检验就会错误地跳到二级检验里去.为了避免这种状况的出现,可以在循环之前,定义一临时变量temp=true,然后才到循环语句,遇到障碍物就让temp=false,并且跳出循环.这时,对于相邻的情况来说,因为循环次数为0,所以temp绝对为true.

  综上所述,temp=true,checkNoBarrier就返回true,否则要进入二级检验.

  二级连接检验

  一级检验后,发现两方块无法通过直线连接起来,便尝试一个折点的折线能否把两个方块连接起来,这就是二级检验.

  二级检验在排除了一级检验的条件后,对两方块的坐标关系没有要求.所以,若横坐标或纵坐标相等,就直接进入三级检验.

  图10中,如果要让图中的两黄方块成功实现二级连接,必须且只需让红线或蓝线经过的地方没有障碍物.

  在图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)
(1,7),(1,9)
(2,10),(3,10)

  如果都没有一个返回true的话,或者根本找不到可以作一级检验的点对(特别是当某个方块被障碍物紧紧包围的时候),那么三级检验结果为false,此时,折线的折点数已经达到2,根据游戏规则,此时checkNoBarrier返回false了.
  如果觉得三级检验分两步麻烦,希望直接使用一级检验的话,也可以.

  就把以下所有点对都检验就可以了(见图13).

(n,7),(n,9)
(2,m),(3,m)

  其中,n为0~12的整数,m为0~10的整数.

  这样代码可以简化,但由于一级检验本身就是循环,如果这里用这个办法的话,就要嵌套上一个更大的循环,运行效率不高,故这里还是不推荐用此法. 至此,连线算法已经介绍完毕.希望通过这个过程,大家可以从中悟出方块类游戏算法的一般思想. 至于该游戏的其它细节问题,在这里也稍微提一下.

  1 检验的先后顺序

  在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功.其中,配对只需要用个a+b==100就可以了,所以运算比检验连接快很多.所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算.当然,如果你在做这个游戏的时候,配对规则不像笔者的如此简单的话,那么就看哪个算起来麻烦就把它放在后面.

  2 障碍物属性的存放位置

  障碍物属性尽量不要用方块是否可见等外观因素来确定,外观因素应该由内部变量决定. 因为很可能,某天你要改成消方块只是需要让方块变灰,那么你的内部检验代码要修改,比较麻烦.尽量使用一个数组来存放这些属性.然后外观是另一套代码,这样便于维护,也方便放置动画效果.

时间: 2016-07-08

Flash小游戏-连连看算法大揭密的相关文章

flash小游戏网站靠什么盈利?

目前国内flash小游戏网站,很多,而且很多已经做大,例如 4399.com 3839.com yx007.com xiaoyouxi.com 7733.com  gameyes.com .据统计,目前流量超过1000个ip的小游戏网站已经达到4000家,另外还有小游戏频道 例如play.zol.com.cn 这样的频道4000家. 这么多小游戏网站,靠什么生存,靠说明盈利呢?    小游戏网站主要受众是中小学生,他们本身没有消费能力,另外小游戏本身不具备掘金能力,所以不能从页面之外赚钱.   

2009年flash小游戏站运营新模式探讨

中介交易 SEO诊断 淘宝客 云主机 技术大厅 首先,我想说身边做flash小游戏站的人很多,不少人靠小游戏站一个月稳定的收入几千元.几万元的.而国内前三的4399,7K7K,xiaoyouxi,估计一个月的收入都在几十上百万了. 说到底,flash小游戏的需求还是很强劲的.特别是对中小学生,还有一些没有太多时间玩大型游戏的大学生和上班族,小游戏作为休闲放松的一种方式,吸引力还是蛮大的.据艾瑞统计,国内flash小游戏的用户群超过6000万,可以说大部分的网民都有过玩小游戏的经历. 但是,fla

一个FLASH小游戏的制作过程与心得

过程|心得 这是笔者花了5天时间做的一个小游戏,是模仿QQ连连看的. 虽然现在已经没什么新意了,画面也很一般,也没加声音(其实是因为声音文件太大了),但是,笔者想借此跟大家交流FLASH游戏的制作经验,所以也在此献丑了. 鉴于上次写的教程看的人不会很多,所以这次,笔者没打算从头到尾把教程完整地写出来,而打算先让大家提问跟该游戏制作有关的问题,然后由笔者给大家回答.笔者认为,这样能取得更好的效果. 学了AS一段时间后,笔者以为做这样的游戏是易如反掌的事情. 真正做的时候,才发现有很多方面是要注意的

Wordpress搭建社交型小游戏网站10大步骤

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 1:购买虚拟主机 你需要购买一个虚拟主机空间,买之前强烈建议你有一张信用卡和paypal帐号. 我购买的是ixwebhosting的虚拟主机,比较稳定,并且速度也可以,我在国内ping值为200ms左右, 国外其他国家访问更快,最重要的是他们提供独立IP地址,这个对于建网站是很重要,独立IP地址可以防止被其他网站拖累. 我是用招商银行信用卡购

flash小游戏网站运营经验分享

半年以后也就是2008年6月份,我在网上遇到了他,我就问他,说你的小游戏站做的怎么样了?他说一般啊,大约5万ip吧!我就问他,那你收入多少了?他说大约5000-6000吧!税太高;我一听大吃一惊,难道这类站也能赚钱?就问他做什么广告,他和我主要做http://www.aliyun.com/zixun/aggregation/12579.html">baidu主题推广;我哪个后悔的啊!为什么当时不做1个呢? 我是去年开始做中国小说网(www.88106.com)的;当时和我一起做连接的朋友做

网页游戏风云 几大flash小游戏网站比拼

中介交易 SEO诊断 淘宝客 云主机 技术大厅 据了解,李兴平在2004年把hao123.com出售给百度并成功套现后,投资创办了4399在线游戏网,在Hao123和百度的大力协助下,4399小游戏流量一路飙升迅速成为国内最大的小游戏站.但一直没有找到商业模式的4399,很快业内很多人都嗅到了李兴平的二次创业跟风者蜂拥而上,这其中就不乏有百度前员工所创办的7K7K.com.直到去年网页游戏的火爆,让4399找到了新的生机.利用玩家定位的高度重合4399成功的运营了<热血三国>.<英雄之门

一个“蹦蹦跳跳”的flash小游戏,挺像编程的。

  脑子好,蹦两下!--程序员应该玩的小游戏 http://www.u148.net/game/month_0809/LightBot/u148.swf 这里介绍了一个游戏,感觉还挺好玩.一共12关,都通过了,不过第十关还是很费劲的,最后还是按照别人的做法做的. 贴几张图片吧,通关的一种方法.

寓教于乐 猫捉老鼠Flash小游戏自己做

在学习过程中,学习内容如果可以与适当的游戏相结合,必然可以提高大家生的学习兴趣,从而达到事半功倍的效果.为了说明方便,让我们以最常用的汉语拼音为例,在这里制作一个针对于汉语拼音的游戏,在轻松的气氛下,加深对汉语拼音的记忆.无论是家长还是孩子或者是学习汉语的外国友人都可以在游戏中学习到知识,玩一回"猫鼠游戏".   程序脚本: 我们确定要做一个猫捉老鼠的游戏,小猫和老鼠分别在屏幕的两端,每当答对一个问题,小猫就前进一步,当答对最后一个问题的时候,小猫到达老鼠的小屋,表示捉到老鼠了,这时候

海外玩家制作Flash小游戏嘲讽伍兹风流情事

(编译/林洁伊)美国大师赛当地时间4月7日将开幕,一年前因性丑闻而掀起轩然大波的老虎伍兹也将出赛.不过人们似乎对他那些花边新闻依然念念不忘,有海外"八卦"人士特地做一个Flash游戏,用来"嘲讽"伍兹的情事. 在这个游戏中,玩家扮演的是一个狙击手的角色,需要在伍兹比赛维持球场治安,把那些前来骚扰老虎打球的滋事者一一击毙.游戏一共有三个场景,第一个场景中有一些抗议者以及在国外赛场常见的裸奔者,第二个场景中则有各色的热辣女郎,而第三个场景--小编试了三次都没过关,还是留