AS3连连看核心算法详解
连连看

6
using System.Collections; //ArrayList命名空间 private void StartNewGame() { //初始化地图,将地图中所有方块区域位置置为空方块状态 for(int iNum=0;iNum<(m_nCol*m_nRow);iNum++) { m_map[iNum] = BLANK_STATE; } Random r = neWRandom(); //生成随机地图 //将所有匹配成对的动物物种放进一个临时的地图中 ArrayList tmpMap=neWArrayList (); for(int i=0;i<(m_nCol*m_nRow)/4;i++) for(int j=0;j<4;j++) tmpMap.Add(i); //每次从上面的临时地图中取走(获取后并在临时地图删除) //一个动物放到地图的空方块上 for (int i = 0; i < m_nRoW* m_nCol; i++) { //随机挑选一个位置 int nIndex = r.Next() % tmpMap.Count ; //获取该选定物件放到地图的空方块 m_map[i]=(int)tmpMap[nIndex]; //在临时地图除去该动物 tmpMap.RemoveAt(nIndex); } }
} //一个转弯(折点)的联通方式 if(OneCornerLink(x1,y1,x2,y2)) { LType = LinkType.OneCornerType ; return true; } //两个转弯(折点)的联通方式 else if(TwoCornerLink(x1,y1,x2,y2)) { LType = LinkType.TwoCornerType; return true; } return false;
基于深度优先搜索的连连看游戏路径查找算法

【关键词】连 连 看 游 戏 ; 路 径 ; 深 度 优 先 搜 索 ; 栈 ; 轨 迹
连连看原理

用 JAVA 开发游戏连连看其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。
那么,在我们动手之前,让我们先简单的分析一下吧。
由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。
由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。
现在,让我们现在来看一看 QQ 中的连连看吧。
“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。
分析游戏规则找出算法通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。
通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。
那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。
至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。
并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)怎么样,算法够简单了吧:)用伪代码来描述程序的结构现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:消除两点;上次选择的点 = null ;if ( 地图上已没有可消除的点 ) { 游戏结束;}}else {上次选择的点 = 当前点;}}else {上次选择的点 = 当前点;}}游戏结束;看看有没有什么问题?如果没有问题,我们进入下一步吧:)确定程序需要的模块当伪代码完成后,并且在我们的大脑里转了几圈发现没有问题后,现在就可以开始进行模块的划分工作了。
连连看算法详谈

游戏连连看的算法探究及源码实现(1)------ 综述述---转载时请注明原文出处(/wyw1976)及作者邮箱(wyw1976@)“连连看”是一款老少皆宜、百玩不厌的休闲类小游戏。
各种“连连看”也层出不穷、五花八门,例如“果蔬连连看”、“宠物连连看”、“麻将连连看”等。
各种“连连看”大同小异,无非就是界面图片不同,其核心算法应该是类似的。
闲暇时,自己也编了一个“连连看”小游戏,大约有1000行代码,功能如下:(1)纯C、纯字符界面,下面是截图:(2)10种游戏模式:∙普通模式∙左移模式∙右移模式∙上移模式下移模式∙左右分离模式∙上下分离模式∙水平中线聚集模式∙垂直中线聚集模式中心点聚集(3)随机产生游戏初始布局。
(4)随时进行“死锁”监控(5)“死锁”发生时,重新生成游戏残局(6)“路径输出”。
在连通时,输出连通路径。
(7)支持“自动”和“手动”两种模式。
在“自动”模式中,计算机模拟用户完成整个游戏。
这在算法测试时显得尤为重要,因为靠人工来完成算法的测试,十分低效甚至不可能全覆盖,而“自动”模式中,计算机完成一局的时间只要几秒,很容易发现算法中的漏洞。
(8)支持性能统计。
这对于算法优化很重要。
游戏"连连看"的算法探究及源码实现(2)----- 流程图下面是“连连看”的流程图:说明:(1)在"死锁"判定时,只要找到了一对匹配的点,就立即退出并记录该匹配点对,(在需要提示的时候,只要输出该点对即可)。
(2)如果用户的输入点对是连通的,而且与匹配点对中的任何一个是相同的,则需要重新进行“死锁”判定。
(3)在“连通”判定过程中,会生成连通路径。
(4)“更新游戏布局”包括移动相关的点,及消除匹配点。
(5)“初始布局”和“残局”的处理是不同的,这点我们还会详细说明(6)从上述流程图中,可以看出程序主要包含以下几个模块:∙随机生成游戏初始布局∙“死锁”判定∙随机产生游戏残局∙连通判定∙游戏布局更新∙生成联通路径我们将详细描述以上模块的算法及其实现。
AS3.0算法大全

[AS 功能代码教程15] 点间距离公式 [FL基础理论大师]■[Flash基础理论课16] 矩阵革命 [双重循环]■[AS 功能代码教程14] 鱼眼放大镜 [FL基础理论大师]■[AS 功能代码教程13] 贪吃蛇游戏制作 [FL基础理论大师]■[Flash基础理论课15] 绚酷鼠标 [目标移动]■[Flash基础理论课14] 制作Loading [Loading]■[杂谈四] JavaScript就这么回事 [二次编辑贴]■[AS 功能代码教程12] 填色游戏 [FL基础理论大师]■[Flash基础理论课13] FL记事本 [SharedObject]■[杂谈四] AS代码优化技巧 [综合贴]■[AS 功能代码教程11] 图片转场效果 [FL基础理论大师]■[Flash基础理论课12] 倒计时系统 [getTime]■[杂谈四] 程序员应该学C语言的十个理由■[AS 功能代码教程10] 数据结构排序算法 [FL基础理论大师]■[Flash基础理论课11] AS文本计算器 [文本类]■[AS 功能代码教程09] 点阵字效果 [FL基础理论大师]■[AS 功能代码教程08] BitmapData动态效果 [FL基础理论大师]■[Flash基础理论课10] 缓动效果 [Tween类]■[杂谈三] 微软Silverlight和Flash短兵相接■[AS 功能代码教程07] 百变图 [FL基础理论大师]■[AS 功能代码教程06] AS绘图总结及补充 [FL基础理论大师]■[Flash基础理论课09]满天星及变幻线[MC.onEnterFrame]■[Flash基础理论课08]旋转花朵[for...in]■[游戏赏玩]吸泡泡■[Flash基础理论课07]制作控制滑块[startDrag]■[杂谈二]人类的15个欲望与游戏设计■[AS 功能代码教程04] 进阶三角函数及应用 [FL基础理论大师]■[Flash基础理论课06]制作移动角色[Key类]■[Flash基础理论课05]制作摇奖盘[onEnterFrame]■[AS 功能代码教程05] 打字机效果及字符串概念 [FL基础理论大师] ■[AS 功能代码教程03] 基础三角函数及应用 [FL基础理论大师]■[AS 功能代码教程02]数字魔方及数组概念[FL基础理论大师]■[AS 功能代码教程01]通用延迟代码及FPS概念[FL基理大师原创] ■[Flash基础理论课04] 制作音乐播放器[Sound类]■[Flash基础理论课03]制作简易涂鸦板[画线指令]■[Flash基础理论课02]制作个性鼠标[updateAfterEvent]■[Flash基础理论课01]制作时钟[Date类]■[杂谈一] 什么是真正的Flash高手?希望朋友们多提保贵议建,您的题问和课题将成文我前进的最大动力。
基于Flash as3的“连连看”游戏型课件制作实例

基于Flash as3的“连连看”游戏型课件制作实例通过开发教学小游戏,让学生在游戏中学习,可以使原本枯燥的教学内容变得富有情趣,做到寓教于乐。
现通过Flash cs5制作一个简单的“连连看”小游戏课件,探索Flash as3游戏型课件的制作。
一、创建一个“Movie Clip”类的派生类启动Flash cs5(使用as3的其他Flash版本也可以),新建一个Action Script 3.0类文件,类名输入“llk”,然后在其中输入以下内容(以llk.as为文件名存盘):package{import flash.display.MovieClip;//导入必要的类import flash.events.MouseEvent;public class llk extends MovieClip{private static var SelectName:String=““,ParentName:String=““;//声明两个静态变量,保存选中的“连连看按钮”实例名和其父影片剪辑实例名public function llk(){this.addEventListener(MouseEvent.CLICK,f1);function f1(e:MouseEvent){if (llk.SelectName == && llk.ParentName != )//选择正确时执行{parent.parent[llk.ParentName][llk.SelectName].gotoAndPlay(3);//两选项同时闪动gotoAndPlay(3);parent.parent[llk.ParentName][llk.SelectName].removeEventListener (MouseEvent.CLICK,f1);//取消两选项的鼠标帧听e.currentTarget.removeEventListener(MouseEvent.CLICK,f1);llk.SelectName = ““;//清空保存的选中“连连看按钮”实例名}else{if (llk.SelectName != ““){parent.parent[llk.ParentName][llk.SelectName].gotoAndStop(1);//取消选中状态}llk.SelectName = ;// 保存选中的“连连看按钮”实例名和其父影片剪辑实例名llk.ParentName = ;gotoAndStop(2);//改变选中状态}}}}}二、创建一个基类为“llk”的影片剪辑元件,作为“连连看按钮”使用在Flash cs5中创建一个ActionScrtip3.0文件,并将其与“llk.as”保存在同一文件夹中。
《连连看》算法c语言演示(自动连连看)

《连连看》算法c语⾔演⽰(⾃动连连看)(图⽚是游戏的⽰意图,来⾃互联⽹,与本⽂程序⽆关)看题⽬就知道是写给初学者的,没需要的就别看了,⾃⼰都觉得怪⽆聊的。
很多游戏的耐玩性都来⾃精巧的算法,特别是⼈⼯智能的⽔平。
⽐如前⼏天看了著名的Alpha GO的算法,⽤了复杂的⼈⼯智能⽹络。
⽽最简单的,可能就是连连看了,所以很多⽼师留作业,直接就是实现连连看。
连连看游戏的规则⾮常简单:1. 两个图⽚相同。
2. 两个图⽚之间,沿着相邻的格⼦画线,中间不能有障碍物。
3. 画线中间最多允许2个转折。
所以算法主要是这样⼏部分:1. ⽤数据结构描述图板。
很简单,⼀个2维的整数数组,数组的值就是图⽚的标志,相同的数字表⽰相同的图⽚。
有⼀个⼩的重点就是,有些连连看的地图中,允许在边界的两个图⽚,从地图外连线消除。
这种情况⼀般需要建⽴的图板尺⼨,⽐实际显⽰的图板,周边⼤⼀个格⼦,从⽽描述可以连线的空⽩外边界。
本例中只是简单的使⽤完整的图板,不允许利⽤边界外连线。
2. ⽣成图板。
通常⽤随机数产⽣图⽚ID来填充图板就好。
⽐较复杂的游戏,会有多种的布局⽅式,例如两个三⾓形。
这种⼀般要⼿⼯编辑图板模板,在允许填充的区域事先⽤某个特定的整数值来标注,随后的随机数填充只填充允许填充的区域。
本例中只是简单的随机填充。
3. 检查连线中的障碍物。
确定有障碍物的关键在于确定什么样的格⼦是空。
通常定义格⼦的值为0就算空。
要求所有的图⽚ID从1开始顺序编码。
复杂的游戏还会定义负数作为特定的标志,⽐如允许填充区之类的。
4. 检查直接连接:两张图⽚的坐标,必然x轴或者y轴有⼀项相同,表⽰两张图⽚在x轴或者y轴的同⼀条线上才可能出现直接连接。
随后循环检查两者之间是否有障碍物即可确定。
5. 检查⼀折连接:与检查直接连接相反,两个图⽚必须不在⼀条直线上,才可能出现⼀折连接,也就是x/y必须都不相同。
随后以两张图⽚坐标,可以形成⼀个矩阵,矩阵的⼀对对⾓是两张图⽚,假设是A/B两点。
《Flash AS3从入门到精通》90天综合课程提纲912

《Flash AS3 从入门到精通》90天综合课程提纲前言:为了更好的满足广大游戏开发爱好者不同层次的需求,解决游戏公司用人要求中注重开发质量和项目经验的问题,天地培训特推出Flash游戏开发,"基础+进阶+实训"的90天综合课程。
基础课程:帮助基础较差的学员学习编程语言的基本用法,系统的学习JavaScript基本语法,以及如何用程序化的思想去分析,思考和设计游戏。
进阶课程(AS3游戏编程):1.学习FlashProfessional的基本用法,系统的学习AS3基本语法,以及如何用程序化的思想去分析,思考和设计游戏.课程结束后一般学员可独立完成"打砖块"等简单游戏.2.FlashBuilder的用法,继承封装等OOP概念和方法,以及核心显示架构,事件,事件流,位图,声音,网络通信等重要内容,重点是如何使用面向对象的方法去分析,设计和实现一些较复杂的项目.如<雷电>,塔防游戏等.实训课程:主要是模拟现实中游戏公司如何立项,制定项目计划,团队成员之间如何协作开发,如何对项目资源和代码的版本化管理等,让学员在进入公司工作以后,可以很快的融入到公司正常项目中.本阶段课程要求学生在讲师的指导下独立设计和开发一款完整的游戏.学习目标1、打下牢固的编程语法基础,学习面向对象编程思想,能够理解类、对象、继承、多态、接口等OOP 概念,学习简单常用的设计模式;2、建立良好的编程习惯,能够写出高可读性的代码,能够按照规范命名变量、定义方法、流程控制等;3、学习标准的面向对象开发流程,严格按照OOA——OOD——OOP的流程开发应用程序、网页游戏、手机游戏等。
4、熟悉如何与设计师、后台技术工程师协同工作,能熟练掌握常用的Flash开发工具。
第一部分:基础课程一、JavaScript编程语言1.了解什么是程序?目前主流的编程语言有哪些。
了解从事IT行业所应具备的技能和知识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[教程] 连连看核心算法详解最近做了个连连看游戏,综合网上各种不同的思路,整理出了个人认为大家都比较好理解的一套思路。
游戏规则:很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。
(说明:下面的行和列按照现实的行和列,并不是按照flash坐标系的坐标,请大家按需转换)连通算法:1.直连型2.一折型3.两折型下面我们来分析每一种情况:直连型直连性又分为两种情况:横向直连,纵向直连。
首先是横向检测:a(1,2) , b(1,7)1.private function horizon(a:Point,b:Point):Boolean2.{3. if (a.x == b.x && a.y == b.y) return false; //如果点击的是同一个图案,直接返回false;4. var x_start:int = a.y < b.y?a.y:b.y; //获取a,b中较小的y值5. var x_end:int = a.y < b.y?b.y:a.y; //获取a,b中较大的值6. //遍历a,b之间是否通路,如果一个不是就返回false;7. for (var i:int = x_start + 1; i < x_end;i ++ )8. {9. if (mapData[a.x][i] != 0)10. {11. return false;12. }13. }14. return true;15.}16.其次是纵向检测:1.a(1,1) , b(4,1)2.3.private function vertical(a:Point,b:Point):Boolean4.{5. if (a.x == b.x && a.y == b.y) return false;6. var y_start:int = a.x < b.x?a.x:b.x;7. var y_end:int = a.x < b.x?b.x:a.x;8. for (var i:int = y_start + 1; i < y_end; i ++ )9. {10. if (mapData[i][a.y] != 0)11. {12. return false;13. }14. }15. return true;16.}一个拐角的检测如果一个拐角能连通的话,则必须存在C、D两点。
其中C点的横坐标和B相同,纵坐标与A相同,D的横坐标与A相同,纵坐标与B相同1.* a(4,2) , b(2,7)2.* c(2,2) , d(4,7)3.private function oneCorner(a:Point,b:Point):Boolean4.{5. var c:Point = new Point(b.x, a.y);6. var d:Point = new Point(a.x, b.y);7. //判断C点是否有元素8. if (mapData[c.x][c.y] == 0)9. {10. var path1:Boolean = horizon(b, c) && vertical(a, c);11. return path1;12. }13. //判断D点是否有元素14. if (mapData[d.x][d.y] == 0)15. {16. var path2:Boolean = horizon(a, d) && vertical(b, d);17. return path2;18. }else19. {20. return false;21. }22.23.}两个拐角的检测:这个比较复杂,如果两个拐角能连通的话,则必须存在图中所示的连线,这些连线夹在A、B的横、纵坐标之间,这样的线就以下这个类存储,direct是线的方向,用0、1表示不同的方向.Line类结构如下:1.package2.{3. import flash.display.Sprite;4. import flash.geom.Point;5.6. /**7. * ...8. * @author icekiller9. */10. public class Line extends Sprite11. {12. public var a:Point;13. public var b:Point;14. public var direct:int; //连线方向1:水平直连 0:垂直直连15. public function Line(a:Point,b:Point,direct:int)16. {17. this.a = a;18. this.b = b;19. this.direct = direct;20. }21.22. }23.24.}从A、B点的横纵两个方向进行扫描,就是Scan函数做的事情,把合适的线用LinkList存起来。
判断是否是二连型的算法需要做两个方向上的扫描:水平扫描和垂直扫描。
先看水平的,首先,要找到棋子往左右可以延伸的范围,这里的延伸是指左右有多少空的位置;然后,计算水平坐标上两个棋子延伸出来的公共部分;最后,找公共的水平坐标里有没有可以“垂直直连”的.用图6,7,8说明图(6)图(7)水平延伸图(8)求得水平延伸公共范围从图(8)可以看出,左边缘(第零列)有一对叉可以直连,所以红色棋子是可以“二折连通”的!1.2.private function scan(a:Point,b:Point):Vector.<Line>3.{4. linkList = new Vector.<Line>();5. //检测a点,b点的左侧是否能够垂直直连6. for (var i:int = a.y; i >= 0; i -- )7. {8. if (mapData[a.x][i] == 0 && mapData[b.x][i] == 0 && vertical(new Point(a.x,i),new Point(b.x,i)))9. {10. linkList.push(new Line(new Point(a.x,i),new Point(b.x,i),0));11. }12. }13. //检测a点,b点的右侧是否能够垂直直连14. for (i = a.y; i < col;i ++ )15. {16. if (mapData[a.x][i] == 0 && mapData[b.x][i] == 0 && vertical(new Point(a.x,i),new Point(b.x,i)))17. {18. linkList.push(new Line(new Point(a.x,i),new Point(b.x,i),0));19. }20. }21. //检测a点,b点的上侧是否能够水平直连22. for (var j:int = a.x; j >= 0; j -- )23. {24. if (mapData[j][a.y] == 0 && mapData[j][b.y] == 0 && horizon(new Point(j,a.y),new Point(j,b.y)))25. {26. linkList.push(new Line(new Point(j, a.y), new Point(j, b.y), 1));27. }28. }29. //检测a点,b点的下侧是否能够水平直连30. for (j = a.x; j < row; j ++ )31. {32. if (mapData[j][a.y] == 0 && mapData[j][b.y] == 0 && horizon(new Point(j,a.y),new Point(j,b.y)))33. {34. linkList.push(new Line(new Point(j, a.y), new Point(j, b.y), 1));35.36. }37. }38.39. return linkList;40.}取出LinkList里面的线,测试A与B到该线的两点是否连通1.2.private function twoCorner(a:Point,b:Point):Boolean3.{4. var ll:Vector.<Line> = scan(a, b);5. if (ll.length == 0)6. {7. return false;8. }9. for (var i:int = 0; i < ll.length; i ++ )10. {11. var tmpLine:Line = ll[i];12. if (tmpLine.direct == 1)13. {14.15. if (vertical(a,tmpLine.a) && vertical(b,tmpLine.b))16. {17. return true;18. }19. }else if (tmpLine.direct == 0)20. {21. if (horizon(a, tmpLine.a) && horizon(b, tmpLine.b))22. {23. return true;24. }25. }26. }27. return false;28.}前面的函数有以下这个总的调用函数来调用,传入两个点,就可以判断这两个点是否符合连连看的算法了:1.2.//总函数3.private function checkLink(a:Point,b:Point):Boolean4.{5.6. if (a.x == b.x && horizon(a, b))7. {8. return true;9. }10. if (a.y == b.y && vertical(a, b))11. {12. return true;13. }14. if (oneCorner(a, b))15. {16. return true;17. }18. else19. {20. return twoCorner(a, b);21. }22.}。