连连看算法
连连看思路算法及实现

连连看思路算法及实现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。
连连看的具体算法

2010年02月21日因为有朋友在站内信中问到连连看的具体算法,所以我就把算法post 出来,这个算法也是参考网上Flash游戏的算法改写的,原来的参考信息已经找不到了,不过非常感谢那些无私的朋友。
改写的连连看算法如下:前置条件:用一二维数组存放Map,-1表示没有图案可以连通,非-1表示不同的图案。
首先是横向检测:Java代码privateboolean horizon(Point a, Point b){if(a.x == b.x && a.y == b.y)//如果点击的是同一个图案,直接返回falsereturnfalse;int x_start = a.y <= b.y ? a.y : b.y;int x_end = a.y <= b.y ? b.y : a.y;for(int x = x_start + 1; x < x_end; x++)//只要一个不是-1,直接返回falseif(map[a.x][x] != -1){ returnfalse; } returntrue; }private boolean horizon(Point a, Point b){if(a.x == b.x && a.y == b.y)//如果点击的是同一个图案,直接返回false return false;int x_start = a.y <= b.y ? a.y : b.y;int x_end = a.y <= b.y ? b.y : a.y;for(int x = x_start + 1; x < x_end; x++)//只要一个不是-1,直接返回falseif(map[a.x][x] != -1){return false;}return true;}其次是纵向检测:Java代码privateboolean vertical(Point a, Point b){if(a.x == b.x && a.y == b.y)returnfalse;int y_start = a.x <= b.x ? a.x : b.x;int y_end = a.x <= b.x ? b.x : a.x;for(int y = y_start + 1; y < y_end; y++)if(map[y][a.y] != -1)returnfalse;returntrue;}private boolean vertical(Point a, Point b){if(a.x == b.x && a.y == b.y)return false;int y_start = a.x <= b.x ? a.x : b.x;int y_end = a.x <= b.x ? b.x : a.x;for(int y = y_start + 1; y < y_end; y++)if(map[y][a.y] != -1)return false;return true;}一个拐角的检测:如果一个拐角能连通的话,则必须存在C、D两点。
小学一年级综合算式算式连连看通过连连看认识加减法运算

小学一年级综合算式算式连连看通过连连看认识加减法运算综合算式连连看是一种以游戏的形式,通过连连看来认识和学习加减法运算的方法。
它能够激发小学一年级学生的兴趣,让他们在玩游戏的过程中不知不觉地学习了解加减法运算。
本文将重点介绍小学一年级综合算式算式连连看的规则和玩法,帮助小学生更好地掌握基本的加减法运算。
一、综合算式连连看规则介绍综合算式连连看是一种以数字和运算符号组成的算式作为游戏元素,通过连接相同的算式来消除的游戏。
在小学一年级中,综合算式连连看多以简单的加减法算式为主,适合小学生认识和练习加减法运算。
游戏中,玩家需要通过连接两个相同的算式来消除它们,以获得得分。
玩家需要注意以下规则:1. 算式连接的路径必须是水平或者垂直的直线路径,且路径上不能有其他的算式阻挡。
2. 算式连接的路径不能有超过两次的转弯,即路径不能有超过两个拐角。
3. 连接的算式必须是相同的,且它们的结果必须是相等的。
4. 连接的算式中可以包括加法和减法运算,但是不可以包括其他的运算符号。
通过以上规则,小学生可以通过综合算式连连看游戏来认识和练习加减法运算,提高他们的计算能力和逻辑思维能力。
二、综合算式连连看的玩法1. 游戏开始后,屏幕上会出现一些算式和运算符号,玩家需要通过观察和思考来找到可以连接的算式。
2. 玩家需要点击两个相同的算式并且路径满足规则的地方,可以进行连接消除。
3. 如果连接的算式路径符合规则且结果相等,这两个算式将会消失,并且玩家可以获得得分。
4. 如果连接的算式路径不符合规则或者结果不相等,这两个算式将不会消失,并且玩家不会获得得分。
通过不断的练习和尝试,小学生可以逐渐掌握综合算式连连看的技巧,提高自己的加减法运算能力。
三、综合算式连连看的学习价值综合算式连连看不仅仅是一种游戏,它还能够帮助小学生学习和掌握加减法运算。
具体有以下几个方面的学习价值:1. 激发兴趣:通过以游戏的形式来学习加减法运算,可以激发小学生的学习兴趣,使他们更加主动地去探索和学习。
连连看的算法

0, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 8, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 9, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 0这是一张连连看的地图,假设标8和9的部分是两张相同的牌。
在数组矩阵中,0表示没有牌,大于1表示有牌。
至于是什么牌,那是随机的了。
不要告诉我,你说的“布局算法”是指怎么把牌刚刚好放上去,那个无所谓什么算法,你只要首先在地图数组中准备好偶数个1,在布牌时保证每种牌是偶数个(不同种类的牌用大于1的数来表示),相应地放入每个1的位置上就可以了。
一、计算地图上这两张牌能不能连通(当然能了,哈哈)。
这是连连看寻路算法的第一步。
先定义一下两张牌能连的充分条件:1.两张牌是同一种。
2.两张牌之间有一条全是0的路可以连通。
3.这一条路不能有两个以上的拐角(corner)满足这三个条件,就可以认为这两张牌是可以连的。
首先,我们依据前两个条件来完成一个基本的寻路算法。
我们的目的是从8到9找出一条可以连通的路来。
那么很明显从8到9的第一步一其有四个方向可以选择,分别是东,南,西,北(e, s, w, n以中国地图方向为标准)四个方向,在第一步中我们首先假设四个方面没有任何优劣,那么我可以任意选择一个方向移动,那就是东面吧。
图二:0, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 8, -8, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 00, 0, 0, 0, 0, 0, 0, 0 , 9, 00, 0, 0, 0, 0, 0, 0, 0 , 0, 0我从8向东移动了一步,所以到达了-8的位置,我之所以可以移到-8位置,很明显,是因为-8的位置上原来是一个0,表示没有牌阻挡。
《连连看》算法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. 数字方块:每个数字方块上都有一个特定的数字,数字的种类和数量根据游戏设定而定。
常见的数字包括0到9。
3. 连接方式:玩家需要通过在相邻方块之间连接路径,将相同的数字方块连接起来。
4. 连接路径:连接路径通常有一定的限制条件,比如路径不能超过两次转弯或路径长度不能超过一定的限制。
5. 消除规则:当玩家成功连接两个相同数字的方块时,这两个方块将同时消失,如此类推。
6. 游戏目标:玩家的目标是通过消除所有数字方块来完成游戏。
二、培养观察力数字连连看作为一款观察力训练游戏,可以帮助玩家培养观察力的以下几个方面:1. 注意力集中:在数字连连看中,玩家需要注意每个数字方块的位置和数值。
只有通过集中注意力,才能准确找到相同的数字进行连接。
2. 形状辨识:数字方块的形状各不相同,玩家需要准确辨识各个方块的形状,以便快速找到相同的数字进行连接。
3. 图案记忆:通过玩数字连连看,玩家可以逐渐记住不同数字方块的图案,增强对数字方块的记忆力。
三、培养记忆力数字连连看作为一种记忆力训练游戏,可以帮助玩家培养记忆力的以下几个方面:1. 数字记忆:当玩家点击一个数字方块时,需要记住该方块的数值,并在之后的游戏中找到相同的数字方块。
通过不断重复这个过程,可以提高数字的记忆能力。
2. 位置记忆:数字连连看要求玩家找到相同数字方块的位置,这需要玩家同时记住不同方块的位置信息,通过找出相同的数字连接起来。
连连看小游戏

连连看小游戏连连看是一种经典的益智游戏,其目标是通过消除所有的配对方块来获得最高分数。
游戏板上有许多不同的方块,每个方块上都有一个图案或符号。
玩家需要找到相同的方块,并使用最多两个转折点的直线路径将它们连接起来。
连接路径不能被其他方块阻挡,且路径只能在水平和垂直方向上延伸。
以下是连连看游戏的一般规则和玩法:1. 游戏目标:消除所有的配对方块并获得最高分数。
2. 游戏板:游戏板由不同的方块组成,这些方块可以是图案、符号或数字。
方块通常以矩形或正方形的形式排列在游戏板上。
3. 方块配对:玩家需要找到相同的方块来进行配对。
方块可以是相同的图案、符号或数字。
一对配对方块之间的路径只能有两个转折点,并且路径不能被其他方块阻挡。
4. 方块连接:当玩家找到一对配对方块时,他们需要使用鼠标或手指在方块之间绘制一条连接路径。
路径只能在水平和垂直方向上延伸,并且不能穿过其他方块。
一旦路径连接完成,配对方块将被消除。
5. 难度级别:连连看游戏通常有多个难度级别,每个级别都有不同数量和类型的方块。
随着级别的提高,游戏板上的方块数量将增加,配对方块之间的距离也会增加,使游戏更具挑战性。
6. 时间限制:一些连连看游戏可能会设置时间限制,玩家需要在规定时间内消除尽可能多的配对方块。
时间限制可以增加游戏的紧张感和挑战性。
7. 得分系统:玩家在游戏中获得分数,可以根据完成配对和消除方块的数量来计算。
一般来说,完成配对的时间越短,得分越高。
以下是一些连连看游戏的术语和技巧:1. 转折点:在连接路径中,转折点是指路径改变方向的地方。
最多可以有两个转折点,超过两个将无法连接。
2. 视野:在游戏中,玩家需要通过观察游戏板上的方块来找到配对。
良好的视野可以帮助玩家更快地找到配对方块。
3. 记忆力:在连连看游戏中,记忆力是非常重要的技巧。
玩家需要记住方块的位置和图案,以便在游戏板上找到配对。
4. 规划路径:在连接配对方块时,玩家应该规划好路径,以确保路径没有被其他方块阻挡。
数学接龙数字连连看

数学接龙数字连连看数学接龙数字连连看是一种有趣的数学游戏,既考验了玩家的数学运算能力,又锻炼了逻辑思维能力。
在这个游戏中,玩家需要在一连串的数字中,找出满足特定要求的数字,进而进行连连看的消除操作。
下面,我们将介绍这个游戏的规则,并讨论一些解决问题的方法和技巧。
1. 游戏规则在数学接龙数字连连看中,一般以一个数字序列的方式呈现给玩家。
每个数字都代表着一个具体的数值。
玩家的任务是找出其中满足特定要求的数字对,进行消除操作。
要求如下:- 数字对中的第一个数字的个位数与第二个数字的十位数相等;- 数字对中的第一个数字的十位数与第二个数字的个位数相等。
例如,给定数字序列:2, 13, 46, 71, 24, 57, 68, 93。
玩家可以找到一些满足上述要求的数字对,比如:13和71、24和57、68和93。
完成一次数字对的消除后,游戏会将这些数字从序列中移除,然后将剩下的数字重新排列组成新的序列。
玩家需要在限定时间内消除尽可能多的数字对,以获取高分。
2. 解决问题的方法和技巧为了能在数学接龙数字连连看游戏中取得好成绩,玩家需要运用一些方法和技巧。
下面列举几种常用的解决问题的方法和技巧:2.1 从两位数开始由于游戏要求数字对的第一个数字的十位数与第二个数字的个位数相等,因此我们可以从两位数开始寻找数字对。
这是因为两位数的十位数与个位数是不同的数字,有更高的概率找到符合要求的数字对。
2.2 利用奇偶性奇偶性是一个重要的数学概念,也可以用于解决数学接龙数字连连看游戏中的问题。
例如,如果我们需要寻找一个数字对,其中第一个数字是奇数,那么第二个数字就必须是偶数。
这样,我们可以根据奇偶性来筛选候选数字,从而提高选出正确数字对的准确性。
2.3 遍历数字序列在寻找数字对的过程中,我们需要遍历给定的数字序列。
可以从头开始,依次检查每一对相邻数字,看其是否满足特定的要求。
若满足要求,则执行消除操作;若不满足要求,则继续向后遍历。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
连连看所要求的是:
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,j
if(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是否相连嘿,运行试试?
这个是上面这几个函数的测试源码
点击浏览该文件
根据这个原理,把图标对照数组,动态建立数组,加上一些效果啊,鼠标检测啊,就成了下面这个这样的基本《连连看》游戏模块啦
点击浏览该文件
这个是作成游戏后的源码
点击浏览该文件
>>>> 进入论坛交流<<<<。