连连看游戏算法
连连看算法

连连看所要求的是:1:两个目标是相同的2:两个目标之间连接线的折点不超过两个。
(连接线由x轴和y轴的平行线组成)那么分析一下连接的情况可以看到,一般分三种情况1:直线相连2:一个折点3:两个折点如图:可以发现,如果有折点,每个折点必定有且至少有一个坐标(x或者y)是和其中一个目标点是相同的,也就是说,折点必定在两个目标点所在的x方向或y方向的直线上。
所以设计思路就是:假设目标点p1 , p2 ,如果有两个折点分别为z1 , z2 那么,所要进行的是1:如果验证p1 , p2 直线连线,则连接成立2:搜索以p1,p2的x,y方向四条直线(可能某两条直线会重合)上的有限点,每次取两点作为z1,z2 ,验证p1到z1/z1到z2/z2到p2 是否都能直线相连,是则连接成立。
(如果z1=z2也就是只有一个折点喽,对判断没影响)那么程序算法上,这里先就理论进行一个试验var mmap=new Array();mmap[0]=new Array(0,0,0,0,0,0);mmap[1]=new Array(0,1,2,8,1,0);mmap[2]=new Array(0,5,5,4,3,0);mmap[3]=new Array(0,4,6,7,3,0);mmap[4]=new Array(0,8,2,6,7,0);mmap[5]=new Array(0,0,0,0,0,0);p1=new Array(1,4);p2=new Array(1,2);//定义一个二维数组作为游戏的映像,相同的数字代表相同的图标,0是空处,p1,p2是选择的点linelink=function(o1,o2){var t=new Array(0,0);if(o1[0]==o2[0] || o1[1]==o2[1]){if(Math.abs(o1[0]-o2[0])+Math.abs(o1[1]-o2[1])<=1){return true;}else{t[0]=isNaN((o2[0]-o1[0])/Math.abs(o2[0]-o1[0])) ? o1[0] :o1[0]+((o2[0]-o1[0])/Math.abs(o2[0]-o1[0]));t[1]=isNaN((o2[1]-o1[1])/Math.abs(o2[1]-o1[1])) ? o1[1] :o1[1]+((o2[1]-o1[1])/Math.abs(o2[1]-o1[1]));return mmap[t[0]][t[1]]==0 ? linelink(t,o2) : false}}else{return false;}}// 上面这个函数是判断任意两个点是否能直线连接(中间的点全为0)var parr=new Array(); pickpoint=function(q1,q2){var j;parr.splice(0);for(j=0;j<mmap[q1[0]].length;j++){parr=mmap[q1[0]][j]==0?parr.concat([[q1[0],j]]):parr; }for(j=0;j<mmap[q2[0]].length;j++){parr=mmap[q2[0]][j]==0?parr.concat([[q2[0],j]]):parr; }for(j=0;j<mmap.length;j++){parr=mmap[j][q1[1]]==0?parr.concat([[j,q1[1]]]):parr; }for(j=0;j<mmap.length;j++){parr=mmap[j][q2[1]]==0?parr.concat([[j,q2[1]]]):parr; }}//上面这个函数是取出两个点的x和y直线方向上的所有空点保存进parr这个数组里面待搜索islink=function(p1,p2){var i,jif(p1==p2){return false;}if(mmap[p1[0]][p1[1]]<>mmap[p2[0]][p2[1]]){return false;}if(linelink(p1,p2)){return true;}else{for(i=0;i<parr.length;i++){for(j=0;j<parr.length;j++){if(linelink(p1,parr[i]) && linelink(p2,parr[j]) && linelink(parr[i],parr[j])) {trace(parr[i]+"->"+parr[j]);return true;}}} }return false;}//上面这个函数是校验两个目标点是否相连,//先判断是否同类点,再判断是否直线相连,最后搜索parr里的每对折点是否使目标点相连pickpoint(p1,p2); //取得parr数组trace(islink(p1,p2)); //测试p1,p2是否相连嘿,运行试试?这个是上面这几个函数的测试源码点击浏览该文件根据这个原理,把图标对照数组,动态建立数组,加上一些效果啊,鼠标检测啊,就成了下面这个这样的基本《连连看》游戏模块啦点击浏览该文件这个是作成游戏后的源码点击浏览该文件>>>> 进入论坛交流<<<<。
连连看思路算法及实现

连连看思路算法及实现1. 任务概述连连看是一款益智类图标消除游戏,玩家需要通过消除相同的图标来获得分数。
该游戏的思路算法主要包括图标布局、路径查找和消除逻辑。
本文将详细介绍连连看游戏的思路算法及其实现。
2. 游戏规则在连连看游戏中,通常会给出一个NxM的矩阵,矩阵中填充了各种不同类型的图标。
玩家需要通过点击两个相同的图标,使它们之间的路径最多只有两个直角转弯,从而消除这两个图标。
被消除的图标将被移除,并且上方的图标将下落填充空缺。
玩家的目标是在限定时间内消除尽可能多的图标,获得尽可能高的分数。
3. 思路算法及实现3.1 图标布局图标布局是连连看游戏的一个重要部分。
在游戏开始前,需要生成一个随机的NxM矩阵,并在每个格子中填充一个随机的图标。
为了保证游戏的可玩性,生成的矩阵需要满足以下条件: - 每个图标在矩阵中至少出现两次,确保存在与之相匹配的图标。
- 任意两个相同图标之间的路径不超过两个直角转弯,确保图标可以被消除。
其实现思路如下: 1. 随机生成NxM矩阵,并初始化为空。
2. 随机选择一个图标,将其填充到矩阵中某个随机的空格子。
3. 将该图标在矩阵中的位置存储到一个列表中。
4. 重复2-3步骤,直到每个图标至少在矩阵中出现两次。
5. 遍历矩阵,对于每一个空格子,随机选择一个已填充的图标填充进去,确保每个图标的数量相等。
6. 返回生成的矩阵。
3.2 路径查找路径查找是连连看游戏的关键算法之一。
在玩家点击两个图标后,需要通过路径查找算法判断这两个图标之间是否存在符合条件的路径。
一种常用的路径查找算法是深度优先搜索(DFS)算法。
其实现思路如下: 1. 从起点图标开始,将其标记为已访问。
2. 对于当前图标的每个相邻图标,判断是否满足消除条件(路径最多只有两个直角转弯)。
3. 如果相邻图标满足消除条件且没有被访问过,则递归调用步骤2。
4. 如果找到了与目标图标相匹配的路径,则返回True,否则返回False。
连连看小游戏

连连看小游戏
连连看是一种经典的益智小游戏,其目标是通过消除相同的图案,清空整个游
戏界面。
以下是游戏的规则和玩法:
规则:
1. 游戏界面上会出现一些图案,它们可以是动物、水果、数字等等。
2. 游戏界面上的图案都是成对出现的,玩家需要找到两个相同的图案,然后用
鼠标点击它们,消除它们。
3. 消除图案的条件是它们之间的连线不能超过两个转弯。
4. 当所有的图案都被消除后,游戏就胜利了。
玩法:
1. 连连看的游戏界面通常是一个矩形或正方形,其中包含许多不同的图案。
2. 玩家需要通过观察和记忆来找到相同的图案。
当玩家找到一对相同的图案时,可以用鼠标点击它们,消除它们。
3. 如果玩家找到的两个图案之间的连线超过两个转弯,那么这个操作就是无效的。
玩家需要继续寻找其他的相同图案。
4. 游戏界面上的图案会随着时间的流逝而不断变化,所以玩家需要尽快找到相
同的图案,以避免它们被其他图案遮盖。
5. 如果玩家在游戏过程中遇到困难,可以使用提示功能来帮助自己找到相同的
图案。
术语和技巧:
1. 连线:指两个相同图案之间的路径,玩家需要用鼠标点击这条路径来消除图案。
2. 转弯:指连线中出现的拐角,每个连线最多允许两个转弯。
3. 记忆:连连看需要玩家记住游戏界面上的图案,并快速找到相同的图案。
4. 灵活性:玩家需要在游戏中保持灵活性,随时调整自己的策略和方法,以适应游戏界面的变化。
总之,连连看是一种简单而有趣的益智小游戏,它需要玩家观察力、记忆力和灵活性。
通过练习和掌握技巧,玩家可以在游戏中获得更高的分数和更好的成绩。
连连看小游戏

连连看小游戏
连连看是一种流行的益智小游戏,目标是通过消除相同的图案来清空游戏区域。
以下是游戏的规则和玩法。
规则:
1. 游戏区域中有许多图案,玩家需要找到相同的图案并用线连接它们。
2. 连接线必须是水平或垂直的,不能斜向连接。
3. 连接线不能穿过其他图案或线。
4. 连接线的长度不能超过两个拐角。
玩法:
1. 打开游戏后,玩家将看到一个游戏区域,其中有许多图案。
2. 玩家需要找到相同的图案并用线连接它们。
3. 当两个相同的图案被连接时,它们将消失,为玩家腾出更多的空间。
4. 游戏结束时,当游戏区域中没有剩余的图案时,玩家获胜。
术语和技巧:
1. 连接线的长度不能超过两个拐角,这意味着玩家需要仔细思考如何连接相同
的图案。
2. 玩家应该尝试先消除游戏区域中较小的图案,这样可以为大图案腾出更多的
空间。
3. 玩家应该注意游戏区域中的时间限制,尽量在规定的时间内完成游戏。
4. 玩家可以使用提示功能来帮助他们找到相同的图案。
总之,连连看是一种有趣的益智游戏,需要玩家仔细思考和规划。
通过掌握游
戏规则和技巧,玩家可以更轻松地完成游戏并获得更高的分数。
连连看算法详谈

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

连连看小游戏连连看是一种益智类的小游戏,目标是通过消除相同的图案来清空游戏界面上的所有图案。
下面是游戏的规则和玩法:1. 游戏界面:游戏界面由一个方形的格子组成,每个格子上都有一个图案。
格子可以是任意形状,但通常是正方形。
格子的数量和大小可以根据游戏的难度级别而变化。
2. 图案:每个格子上的图案可以是各种各样的,例如动物、水果、字母等等。
图案通常是成对出现的,也就是说,每个图案都有一个与之相匹配的图案。
3. 连接:玩家需要通过连接相同的图案来消除它们。
只有两个图案之间可以进行连接的条件是它们之间的连线不超过两个转折点,并且路径上没有其他图案阻挡。
连线可以是直线、折线或曲线。
4. 消除:当两个相同的图案通过合法的路径连接在一起时,它们将被消除,并从游戏界面上移除。
同时,玩家的得分也会增加。
5. 游戏目标:游戏的目标是在限定的时间内或者特定的步数内消除所有的图案。
如果在规定的时间或步数内完成目标,则游戏胜利。
否则,游戏失败。
6. 提示功能:为了帮助玩家找到可连接的图案,游戏通常提供提示功能。
玩家可以点击提示按钮,游戏将会给出一个可连接的图案对的提示。
7. 时间和步数限制:游戏可以设置时间限制或者步数限制来增加游戏的挑战性。
时间限制意味着玩家需要在规定的时间内完成游戏目标,步数限制意味着玩家需要在规定的步数内完成游戏目标。
8. 技巧和策略:连连看是一款需要观察力和思考力的游戏。
玩家可以通过观察游戏界面上的图案位置和路径来制定最佳的连线策略。
一些常用的技巧包括:- 优先消除边缘的图案,因为它们更容易找到连接路径。
- 留意游戏界面上的障碍物,避免将图案困在障碍物中无法连接。
- 利用提示功能,尽量找到最长的连接路径,以获得更高的得分。
希望以上的解释能够帮助你理解连连看游戏的玩法和规则。
玩这款游戏时,记得保持专注和耐心,尝试不同的策略和方法,享受游戏带来的乐趣和挑战!。
《连连看》算法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两点。
连连看小游戏

连连看小游戏连连看是一种非常受欢迎的益智小游戏,目标是通过消除相同的图案或图标来清空游戏区域。
以下是连连看的玩法和规则:1. 游戏目标:清空游戏区域中的所有图案或图标。
2. 游戏规则:- 游戏区域中会有一些图案或图标,它们可以是动物、水果、数字等等。
- 你需要通过连接相同的图案或图标来消除它们。
连接的路径只能有一到两个转弯,且不能经过其他图案或图标。
- 连接路径上的图案或图标之间不能有其他图案或图标阻挡。
- 一次只能消除两个相同的图案或图标。
- 图案或图标之间的连接路径可以是直线、弯曲或组合,但不能超过两个转弯。
- 游戏区域中的图案或图标必须能够通过连接路径相互到达,否则它们无法消除。
3. 游戏术语和技巧:- 连接路径:连接两个相同图案或图标的路径,它可以是直线、弯曲或组合。
- 转弯:连接路径上的转角,每个连接路径最多只能有两个转弯。
- 阻挡:连接路径上的其他图案或图标,如果路径被阻挡,那么两个图案或图标之间无法消除。
- 观察:在开始消除之前,先观察游戏区域中的图案或图标,找到可以连接的最佳路径。
4. 玩法提示:- 观察整个游戏区域,找到可以连接的图案或图标,尽量选择长路径连接,这样可以消除更多的图案或图标。
- 如果游戏区域中没有可以连接的图案或图标,可以使用提示功能来帮助你找到可连接的图案或图标。
- 注意时间限制,有些连连看游戏可能有时间限制,所以要尽快消除图案或图标。
希望以上的解释能够帮助你理解连连看游戏的玩法和规则。
尝试不同的策略和方法,挑战自己的反应能力和观察力,享受游戏带来的乐趣吧!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 我们来采用逐级算法:先看能否直线连接, 若不行,再拐一个弯,再不行,继续拐弯.这也 符合一些游戏者玩游戏时判断连接的方法. • 这里,把检验连接是否成功定义为一个函数 checkNoBarrier(x1,y1,x2,y2),true表 示连接成功,false表示连接失败.所以,返回 true一般比返回false快.因为只要有一根折 线连上了,就可以退出函数.而false则要所 有尝试都失败了才能返回
连连看游戏算法
连连看游戏规则很简单,就是点中两 个互相匹配并且可以通过不多于两个 折点的折线连在一起的方块后,这两 个方块就可以消掉.
下图的三种情况可以把方块消掉.我们可以 假设,配对规则是两数相加等于100.
说明:配对的检查比较简单,只要用一个if 语句,条件a+b==100就可以检验了.而两 方块能否实现折线连接,则是个相对复杂的 问题.
我们来看一级连接检验,就是检验两方块之间能 否直线连接,其必要条件之一就是两个块的横坐标 或纵坐标相等。
• 下面以横坐标为例(纵坐标的检验方法类 似 ),说明一级连接检验的算法:若横坐标 相等,则需要检验的是在y1和y2之间的这些 点中是否存在障碍物,这里可以用循环方法 检验.如果没有障碍物,则checkNoBarrier 马上返回true,函数马上退出.否则,需要进 入二级检验.
注意其中的+1和-1的运算
• 该表达式返回true,那么checkNoBarrier 返回true.否则二级检验结果为false;要进 入三级检验
பைடு நூலகம்
可以发现,所有的折线都有一个特点.两个折点分别跟两方块 的横坐标相等或纵坐标相等,因此,我们只需要对折线的中段 进行一级检验.至于折点的位置,就让两方块往四个方向走,走 到障碍物或者方阵边缘.于是,走过的点都有可能成为折线的 折点,在这些点里,看看哪些点对(点的组合)可以作一级检验.
• 2 障碍物属性的存放位置 障碍物属性尽量不要用方块是否可见等外 观因素来确定,外观因素应该由内部变量决 定. 因为很可能,某天你要改成消方块只是 需要让方块变灰,那么你的内部检验代码要 修改,比较麻烦.尽量使用一个数组来存放这 些属性.然后外观是另一套代码,这样便于维 护.
谢谢大家!
• 把横坐标相等时的一级检验函数定义为 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) && heckx1(x1,x2+1,y1))
• 二级检验(只有一个折点)在排除了一级 检验的条件后,对两方块的坐标关系没有要 求.所以,若横坐标或纵坐标相等,就直接进 入三级检验.
在上图中,红线由两线段组成,所以,这个检验 相当于两个一级检验结果的"且"运算.可见,一 级检验的方法可以用到这里.所以,把一级检验 定义为函数,在二级检验中,会方便很多.
• 如果都没有一个返回true的话,或者根本找 不到可以作一级检验的点对(特别是当某个 方块被障碍物紧紧包围的时候),那么三级检 验结果为false,此时,折线的折点数已经达 到2,根据游戏规则,此时checkNoBarrier 返回false了.
•至此逐级算法结束
两点注意的问题:
• 1 检验的先后顺序 • 在检验两个方块能否消掉的时候,我们要让 两个方块同时满足两个条件才行,就是两者 配对并且连线成功.其中,配对只需要用个 a+b==100就可以了,所以运算比检验连 接快很多.所以,这里应该先检验配对,如果 该条件不成立的话,就不要再进行连线检查 了,这样可以避免很多不必要的复杂运算.
• 注意::这里很容易忽略的一个情况就是 两个方块相邻.这时,y1与y2之间没有点.如 果不检验就会错误地跳到二级检验里去.为 了避免这种状况的出现,可以在循环之前,定 义一临时变量temp=true,然后才到循环语 句,遇到障碍物就让temp=false,并且跳出 循环.这时,对于相邻的情况来说,因为循环 次数为0,所以temp绝对为true. • 综上所述,temp=true,checkNoBarrier就 返回true,否则要进入二级检验.