连连看原理
连连看算法

连连看所要求的是: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。
连连看原理

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

小学一年级综合算式算式连连看通过连连看认识加减法运算综合算式连连看是一种以游戏的形式,通过连连看来认识和学习加减法运算的方法。
它能够激发小学一年级学生的兴趣,让他们在玩游戏的过程中不知不觉地学习了解加减法运算。
本文将重点介绍小学一年级综合算式算式连连看的规则和玩法,帮助小学生更好地掌握基本的加减法运算。
一、综合算式连连看规则介绍综合算式连连看是一种以数字和运算符号组成的算式作为游戏元素,通过连接相同的算式来消除的游戏。
在小学一年级中,综合算式连连看多以简单的加减法算式为主,适合小学生认识和练习加减法运算。
游戏中,玩家需要通过连接两个相同的算式来消除它们,以获得得分。
玩家需要注意以下规则: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,表示没有牌阻挡。
连连看锻炼幼儿的观察力和联想能力

连连看锻炼幼儿的观察力和联想能力连连看游戏作为一种经典的益智游戏,受到了许多幼儿的喜爱。
它通过要求玩家通过观察和联想,找出相同的图片并将它们连接在一起,从而锻炼了幼儿的观察力和联想能力。
本文将探讨连连看游戏的益处并提供一些方法和技巧,以帮助幼儿更好地发展这两项重要的认知能力。
连连看游戏可以促进幼儿的观察力发展。
观察力是指通过对细节和整体的观察,获取信息并做出正确判断的能力。
在连连看游戏中,幼儿需要仔细观察不同的图片,并辨认出它们是否相同,从而将它们连接在一起。
这个过程需要幼儿集中注意力,聚焦于细节,并将细节组织成整体。
通过反复进行这个过程,幼儿的观察力会得到锻炼和提高。
除了观察力,连连看游戏还可以培养幼儿的联想能力。
联想是指通过将已有的概念和信息与新的概念和信息联系起来,从而形成新的认知结构和理解。
在连连看游戏中,当幼儿看到一对相同的图片时,他们需要将这两个相同的图片联系起来,并通过线条将它们连接在一起。
这个过程需要幼儿能够快速地将已有的信息和概念与新的信息和概念进行联想和联系。
通过反复进行这个过程,幼儿的联想能力会逐渐得到提高。
为了帮助幼儿更好地发展观察力和联想能力,以下是一些方法和技巧可以被用于连连看游戏的实践中。
首先,建议家长和教师在幼儿玩连连看游戏时提供适度的指导和支持。
他们可以向幼儿提供一些启示,例如告诉幼儿在连接图片时可以首先寻找相同颜色的图片,或者首先寻找具有相似形状的图片。
这些启示可以帮助幼儿更加有条理地寻找相同的图片,从而提高他们的观察力和联想能力。
其次,幼儿可以通过玩不同难度级别的连连看游戏来逐渐提高他们的观察力和联想能力。
最初,他们可以从简单的连连看游戏开始,选择只有几对相同图片的小游戏。
随着时间的推移,他们可以逐渐挑战更难的游戏,例如选择有大量图案和较多难度的游戏。
通过逐步增加游戏的难度,幼儿将能够逐渐提高他们的观察力和联想能力。
此外,定期进行连连看游戏可以帮助幼儿保持对观察力和联想能力的训练。
连连看算法详谈

游戏连连看的算法探究及源码实现(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. 挑战模式:一些连连看游戏还提供挑战模式,其中玩家需要在有限的时间内尽可能多地消除图标,以获得更高的分数。
通过运用这些技巧和策略,玩家可以在连连看游戏中取得更高的分数,并享受到游戏带来的乐趣和挑战。
玩家可以尝试不同的方法和策略,以发现最有效的消除图标的方式,并在游戏中创造出更高的分数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用 JAVA 开发游戏连连看(注:这篇文章是在2004.12完成的,当时是为了向《电脑爱好者》投稿,这是原稿,由于此杂志面向的读者原因,因此文章中有些地方显得过“白”,在此后,稿子经过两次修改,虽然最终得以发表,但已改得基本上没有太多的技术性了,而且两次改稿下来,一共写了近6万字,累~~~,现在将其略作修改放在主页上,希望对大家有所帮助)提起 JAVA ,相信大家也不会陌生了吧, JAVA 是一门相当优秀的语言。
目前 JAVA 领域 J2EE 、 JSP 、STRUTS 等技术不知有多么的热门,他们的主要用途是用来进行企业开发, J2ME 也由于能够被大量的移动设备所支持,因此,也有不少的程序,特别是游戏是在 J2ME 平台上开发的,反而是 J2SE ,似乎只是被人们用来做一做程序界面的,就连 APPLET 也很少有人使用了(有了 FLASH ,谁还用 APPLET 啊)。
用 JAVA 来开发桌面平台的游戏,似乎很少有人这么做,也可能大家一想到做游戏都会想到 C 、 C++ 、汇编等。
前段日子我迷上的 QQ 游戏中的“连连看”,游戏之余,突发奇想,也想自己用做一个试试,经过十来天的奋战,终于完成了。
我选择了 JAVA 来开发这个游戏,之所以选择 JAVA ,是因为:1.很少有人用 JAVA 来开发桌面游戏,是因为 JAVA 在网络方面的强大优势使人们忽略了 JAVA在桌面平台上的开发,特别是游戏方面,而并不是因为 JAVA 做不到,而我,却希望通过我的尝试来告诉大家:原来 JAVA 也能做出漂亮的桌面游戏的(我可不是在夸我的程序:))2.由于 JAVA 生来就是为网络服务的,因此,一旦有需要,很容易将单机版的游戏改为网络版的(我现在就在做:))3.由于现在有很多手机都支持 J2ME ,而 J2ME 和 J2SE 是一脉相承的,因此,用 JAVA 编写的游戏可以很容易移植到 J2ME 平台上,想想当你的游戏在手机上运行是一样多么愉快的事情啊。
开发的周期并不是很长,可是开发过程中我也遇到不少困难,也有不少收获,我希望将我的开发过程写下来,与大家共同进步:)在我的开发过程中,你可以发现我是这么做的:1.使用数组实现算法的核心2.使用布局和按钮来实现操作3.使用布局实现用户界面4.使用线程在同一时间做更多的事情5.使用静态变量来减少内存的开销,并且保持信息的一致性6.使用文件来保存用户的配置信息7.使用声音让程序更有生气(之一)动手前的准备看看别人现成的游戏在盖房子之前,我们都会先打好地基,然后搭起框架,最后再就是一点一点添砖加瓦,做软件也是一样的道理,都是从大体的框加向细节部分设计实现,现在,我们开始吧。
其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。
那么,在我们动手之前,让我们先简单的分析一下吧。
由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。
由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。
现在,让我们现在来看一看 QQ 中的连连看吧。
“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。
分析游戏规则找出算法通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。
通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。
那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。
至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。
并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)怎么样,算法够简单了吧:)用伪代码来描述程序的结构现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:if ( 存在上次选择的点 ) {if ( 当前点与上次选择的点可消除 ) {消除两点;上次选择的点 = null ;if ( 地图上已没有可消除的点 ) {游戏结束;}}else {上次选择的点 = 当前点;}}else {上次选择的点 = 当前点;}}游戏结束;看看有没有什么问题?如果没有问题,我们进入下一步吧:)确定程序需要的模块当伪代码完成后,并且在我们的大脑里转了几圈发现没有问题后,现在就可以开始进行模块的划分工作了。
我们还是再看一看 QQ 中的“连连看”,整个程序只需要通过鼠标操作就可以了,按照 MVC 的结构来进行程序设计,那么我们需要一个 Model ,用来完成整个程序的核心算法;一个 View ,用来显示用户界面,当然还需要一个 Control ,用来处理用户鼠标的操作,这样一来,只需要三个模块就可以完成了。
1.算法模块2.控制模块3.显示模块现在我们再细想一下,这样真的就可以了吗? Model 是一定需要的,这是整个程序的灵魂。
然而对于Control (控制)来说,控制会分为用户游戏中的操作和游戏提供的功能性操作,如果所有的操作包括游戏中的游戏控制、游戏界面上的帮助、设置等都要通过一个 Control 来完成,那么这个 Control 一定会比较大,并且会比较复杂,而过于复杂的模块通常都是比较容易引起错误,或者导致编码困难的,因此,我们就有必要将具有类似功能的操作分开,以减少各个模块的复杂程度,同时,也可以使模块的功能更单纯(这也是 OO 中所倡导的)。
现在我们将菜单操作和游戏操作分开,分开后的模块如下:∙菜单显示∙菜单控制∙游戏显示∙游戏控制∙游戏核心算法以上是程序的最主要的模块,除此之外,由于开发过程中的需要,对于每个模块,我们可能还需要一些辅助的模块来使程序更加完善,由于这些模块并不会对程序有太大的影响,因此,我们可以在需要的时候再来添加。
(之二)实现游戏的算法将游戏地图转换为数组来描述算法总是很枯燥的,没有直接设计界面来得舒服,然而,算法却是整个程序的核心,所以,仅管枯燥,我们还是得耐心地完成这一步。
在进行程序算法的设计时,我们首先要尽可能抛开一些无关紧要的部分,这样可以使算法看起来直接明了,但同时也要考虑弹性,以便将来扩充。
在前面已经说过了,整个游戏的核心算法也就是以二维数组为主体的算法,那么,定义一个二维数组是必不可少的了。
二维数组究竟应该有多大呢? 10X10 是不是小了, 20*20 呢,大了?究竟多大比较合适?为了考虑到程序以后改动的需要,我们还是定义成变量吧,这样以后要改动的时候,只需要改动一下变量的值就行了,因此,我们现在为程序增加一个类,使之专门用来保存与程序有关的一些数据。
至于为什么要定义成 public static final ,这个,自己想想就知道了:)还不知道?晕,看看书吧:(现在,我们将这个类起名为 Map ,同时,我们规定,为了描述地图中空白的区域,我们使用 0 来表示。
初始化游戏地图在地图初始化的时候,我们需要用一些“随机”的数字来填充这张地图,之所有将“随机”用引号括起来,是因为这些数字并不是真正意义上的随机:首先,数组中具有相同值的元素只能出现 4 次(具有 0 值的元素除外),其次,这些数字是被散乱的分布在数组中的。
要使元素出现 4 次,那么数组中所有不重复的元素个数最大为数组的大小 /4 ,为了简单起先,我们使这些元素的值用 1 、 2 、 3 ……进行编号。
要想将这些分配好的元素再分配到二维数组中,我们需要一个一维数组来辅助完成这项工作。
首先,我们按照二维数组的大小来建立一个大小相同的一维数组,并且,我们规定数组中出现的不重复的元素的个数(元素个数的多少代表了地图的填充率,填充率越高,表示游戏难度越高),同时,我们也要保证数组的长度能被 4 整除(目前是这样,其实不是必需的),因为相同的元素会出现 4 次。
因此,我们定义一个变量,用来表示地图上可能出现元素种类的最大个数,同时也定义一个变量,表示目前地图上出现的元素的个数。
在,我们将这些元素放置在一维数组中:这时,一维数组初始化完成了,可惜数组中的元素是规规矩矩按顺序出现的,如果不打乱就填充到地图中,这游戏似乎也太简单了(因为相邻的点一定可以消除啊),现在,我们得想个办法打乱这个数组。
怎么打乱这个数组呢?好办,我们来看看,假设数组的原始排列是这样的:[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]从最后一个元素 [15] 起,依次与此元素之前的某一个元素将值互换,完成后再从 [14] 起,与在 [14] 之前的某一个元素将值互换,直到 [1] 与 [0] 的值互换后,如此一来,数组就被完全打乱了,如果还不明白,我们来看一看下图:[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]在 [15] 之前有 15 个元素,产生一个 15 以内的随机数,比如说 8 ,再将 [15] 和 [8] 的值互换,变成了如下:[0] [1] [2] [3] [4] [5] [6] [7] [15] [9] [10] [11] [12] [13] [14] [8]再从 [14] 号元素开始,产生一个 14 以内的随机数,比如说 10 ,互换 [14] 和 [10] 的值:改变前:[0] [1] [2] [3] [4] [5] [6] [7] [15] [9] [10] [11] [12] [13] [14][8]改变后:[0] [1] [2] [3] [4] [5] [6] [7] [15] [9] [14] [11] [12] [13] [10][8]怎么样,略施小技就搞定了,简单吧?算法如下:现在,一维数组中的元素已经被打乱了,现在我们只需要按顺序依次填充回二维数组中就行了,这样,二维数组中的值就一定是乱的。