连连看原理

合集下载

连连看算法

连连看算法

连连看所要求的是: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是否相连嘿,运行试试?这个是上面这几个函数的测试源码点击浏览该文件根据这个原理,把图标对照数组,动态建立数组,加上一些效果啊,鼠标检测啊,就成了下面这个这样的基本《连连看》游戏模块啦点击浏览该文件这个是作成游戏后的源码点击浏览该文件>>>> 进入论坛交流<<<<。

连连看可行性分析报告

连连看可行性分析报告

连连看可行性分析报告连连看是一种益智类的游戏,通过连接相同的图标进行消除,是一种简单而具有挑战性的休闲娱乐方式。

本文将分析连连看游戏的可行性,包括市场需求、技术实现、竞争对手和商业模式等方面。

首先,连连看具有广阔的市场需求。

随着人们生活水平的提高和休闲文化的普及,越来越多的人愿意通过游戏来放松身心。

而连连看作为一种简单易上手的休闲游戏,适合各个年龄段的人群,市场需求很大。

尤其是在手机普及的今天,连连看以其简单而又有趣的玩法成为了很多人的选择。

其次,连连看的技术实现相对简单。

游戏的基本原理是通过画面上的图标进行连接消除,只需要通过编写算法来判断图标之间的可连接性即可。

这个技术实现相对容易,并且可以在各种平台上进行开发,包括移动端和PC端。

同时,连连看还可以加入音效、特效等元素,增加游戏的可玩性和娱乐性。

第三,连连看存在竞争对手。

由于连连看的简单易学,市面上已经存在了很多类似的连连看游戏。

例如,一些手机厂商自带的休闲游戏、独立开发者制作的游戏以及其他公司开发的休闲游戏等。

这就意味着已经存在了一定的竞争压力,需要在游戏设计和推广上有所创新。

最后,连连看的商业模式可以通过广告收入、内购等方式进行盈利。

连连看作为免费游戏,可以通过插播广告或者加入广告横幅来获取广告收入。

同时,游戏还可以提供一些虚拟道具供玩家购买,增加游戏的趣味性和竞争性。

此外,还可以通过赞助商合作等方式获得收入。

综上所述,连连看游戏具有较大的市场需求,技术实现相对简单,但需要在设计和推广上进行创新,同时也存在一定的竞争对手。

通过有效的商业模式,连连看游戏可以实现盈利。

因此,可以认为连连看具有可行性,是一款有潜力的游戏产品。

小学一年级综合算式算式连连看通过连连看认识加减法运算

小学一年级综合算式算式连连看通过连连看认识加减法运算

小学一年级综合算式算式连连看通过连连看认识加减法运算综合算式连连看是一种以游戏的形式,通过连连看来认识和学习加减法运算的方法。

它能够激发小学一年级学生的兴趣,让他们在玩游戏的过程中不知不觉地学习了解加减法运算。

本文将重点介绍小学一年级综合算式算式连连看的规则和玩法,帮助小学生更好地掌握基本的加减法运算。

一、综合算式连连看规则介绍综合算式连连看是一种以数字和运算符号组成的算式作为游戏元素,通过连接相同的算式来消除的游戏。

在小学一年级中,综合算式连连看多以简单的加减法算式为主,适合小学生认识和练习加减法运算。

游戏中,玩家需要通过连接两个相同的算式来消除它们,以获得得分。

玩家需要注意以下规则: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. 时间和步数限制:游戏可以设置时间限制或者步数限制来增加游戏的挑战性。

时间限制意味着玩家需要在规定的时间内完成游戏目标,步数限制意味着玩家需要在规定的步数内完成游戏目标。

8. 技巧和策略:连连看是一款需要观察力和思考力的游戏。

玩家可以通过观察游戏界面上的图案位置和路径来制定最佳的连线策略。

一些常用的技巧包括:- 优先消除边缘的图案,因为它们更容易找到连接路径。

- 留意游戏界面上的障碍物,避免将图案困在障碍物中无法连接。

- 利用提示功能,尽量找到最长的连接路径,以获得更高的得分。

希望以上的解释能够帮助你理解连连看游戏的玩法和规则。

玩这款游戏时,记得保持专注和耐心,尝试不同的策略和方法,享受游戏带来的乐趣和挑战!。

连连看小游戏

连连看小游戏

连连看小游戏连连看是一种经典的益智小游戏,目标是通过消除相同的图案来清空游戏区域中的所有图案。

下面将详细介绍连连看的玩法和规则。

1. 游戏目标:游戏的目标是通过消除相同的图案来清空游戏区域中的所有图案。

玩家需要找到两个相同的图案,并且两个图案之间的连线不能超过两个转弯。

2. 游戏规则:- 游戏区域:游戏区域通常是一个方形的网格,其中包含了各种图案,如动物、水果、数字等。

- 图案消除:玩家需要在游戏区域中找到两个相同的图案,并且两个图案之间的连线不能超过两个转弯。

一旦找到匹配的图案,玩家可以点击它们来消除它们。

- 连线路径:为了消除两个图案,玩家需要找到一条连线路径,该路径只能进行水平或垂直的移动,并且不能穿过其他图案。

连线路径可以有一个或两个转弯,但不能超过两个转弯。

- 障碍物:在游戏区域中可能会有一些障碍物,如墙壁或其他图案。

玩家不能穿过这些障碍物,必须绕过它们来找到连线路径。

- 时间限制:有些连连看游戏会有时间限制,玩家需要在规定的时间内消除所有的图案。

如果时间用尽而图案没有清空,则游戏失败。

3. 游戏术语和技巧:- 连线路径:玩家需要学会寻找最短的连线路径,以便更快地消除图案。

有时候需要先找到一部分路径,再找到另一部分路径,最后将它们连接起来。

- 视野扩展:在游戏区域中,有些图案可能被其他图案遮挡,玩家需要学会通过消除其他图案来扩大视野,以便更好地找到匹配的图案。

- 观察力和记忆力:连连看需要玩家具备良好的观察力和记忆力,因为在游戏开始时,所有的图案都是面朝下的,玩家需要记住它们的位置,以便在游戏过程中能够快速找到匹配的图案。

希望以上介绍能够帮助你理解连连看游戏的玩法和规则。

通过寻找匹配的图案并消除它们,你将能够享受到连连看带来的乐趣和挑战。

加油!。

连连看小游戏

连连看小游戏

连连看小游戏连连看是一种益智类小游戏,目标是通过消除所有的图标来获得最高分数。

游戏的规则是通过连接两个相同的图标来消除它们,但连接路径必须在两个图标之间没有其他图标阻碍的情况下才能有效。

玩家需要使用鼠标或触摸屏来点击并选择两个相同的图标。

一旦选中,图标之间会出现一条直线,并且如果这条直线路径上没有其他图标,那么这两个图标将被消除。

消除图标后,其他图标会向前移动以填补空缺,并且玩家将获得相应的分数。

游戏继续进行直到所有的图标都被消除或无法连接。

游戏中的图标通常根据主题进行设计,可以是水果、动物、数字、字母等。

图标通常以方块的形式排列在游戏界面上,玩家需要通过观察和分析找到可以连接的图标。

在连连看中,有一些常用的术语和技巧可以帮助玩家提高游戏的效果。

以下是一些常用的术语和技巧:1. 连接路径:连接两个图标的路径。

路径必须是直线的,并且没有其他图标阻碍。

2. 阻碍物:游戏界面上的其他图标,它们可能会阻碍连接路径。

3. 观察和分析:玩家需要观察和分析游戏界面上的图标排列,以找到可以连接的图标。

4. 快速反应:连连看是一种需要快速反应的游戏,玩家需要迅速选择和连接图标,以避免时间耗尽。

5. 策略:玩家可以制定一些策略,例如先消除较少的图标,以便在游戏进展中获得更多的选择。

6. 记忆力:有时候玩家需要记住图标的位置,以便在后续的回合中找到匹配的图标。

7. 挑战模式:一些连连看游戏还提供挑战模式,其中玩家需要在有限的时间内尽可能多地消除图标,以获得更高的分数。

通过运用这些技巧和策略,玩家可以在连连看游戏中取得更高的分数,并享受到游戏带来的乐趣和挑战。

玩家可以尝试不同的方法和策略,以发现最有效的消除图标的方式,并在游戏中创造出更高的分数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用 JAVA 开发游戏连连看其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。

那么,在我们动手之前,让我们先简单的分析一下吧。

由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。

由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。

现在,让我们现在来看一看 QQ 中的连连看吧。

“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。

分析游戏规则找出算法通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。

通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。

那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。

至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。

并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)怎么样,算法够简单了吧:)用伪代码来描述程序的结构现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:消除两点;上次选择的点 = 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]怎么样,略施小技就搞定了,简单吧?算法如下:int[] random(int[] array) {java.util.Random random = newjava.util.Random();for (int i = array.length; i > 0; i--) {int j = random.nextInt(i);int temp = array[j];array[j] = array[i - 1];array[i - 1] = temp;}return array; // 其实也可以不返回,因为数组的操作总是改变引用的}现在,一维数组中的元素已经被打乱了,现在我们只需要按顺序依次填充回二维数组中就行了,这样,二维数组中的值就一定是乱的。

( 打乱后的数组,感觉如何,虽然难看了点,但很有用)对数组中两个元素是否可以消除的判断地图的初始化已经完成了,现在的问题是,我们怎么样才能知道数组中的两个元素是否可以消除呢?根据游戏规则,如果两个点之间可以用不超过 3 条直线连接起来,这两点就可以消除,现在我们来分析一下所有可能的情况:两点之间只需要一条直线连接:(图略了……)由上图可以看出,如果两点间只需要一条直线能够连接起来,则 A 、 B 两点的横坐标或纵坐标必定相同,有了这个条件,我们判断 A 、 B 两点是否只需要一条直接连接就简单了许多。

这段代码比较简单,所以就不写出来了,大家可以看看源程序,只不过需要注意的是,我们将横线连接和竖线连接分开来处理,这样做是为了后面工作的简单。

( 注意:为了简单省事,我们用 java.awt 包中的Poin(x, y)t 来描述二维数组中元素的坐标,但是有一点要特别小心, x 和 y 与二维数组中元素的下标值恰好相反,如左上图中 A 的下标为array[1][0] , Point 的描述却是为 Point(0, 1) ,如果不注意这一点,程序会出错的。

)两点之间需要两条直线连接:如上图, A 、 B 两点如果需要两条直线连接起来,有可能有两种方式,于是,我们可以巧妙的构建一个C 点和一个 D 点,并且规定 C 点的横坐标为 A 点的横坐标, C 点的纵坐标为 B 点的纵坐标, D 点的横坐标为 B 点的横坐标, D 点的纵坐标为 A 点的纵坐标(这一点很重要,因为 C 、 D 决定了 AC 、BC 、 AD 、 BD 的连线方式),如下图:如果此时 C 点(或 D 点)能同时满足 AC ( AD )、BC ( BD )只需要一条直线相连,就表示 A 、 B 之前能够使用两条直线连接起来,并且 C 点( D 点)为拐点(以后会用上的)isMatch = horizonMatch(a, c) && verticalMatch (b, c);if (isMatch) {return isMatch;}}if (map[d.x][d.y] == 0) { //D 点上必须没有障碍isMatch = verticalMatch (a, d) && horizonMatch (b, d);return isMatch;}return false;}( 注意:由于 C 点和 D 点的构建方式确定了 AC 、BD 永远是竖连线、 BC 、 AD 永远是横连线)两点之间需要三条直线连接:这种方式是最复杂的了,我们还是先分析一下出现三条直线的所有可能性吧。

相关文档
最新文档