android开发学习之路——连连看之游戏逻辑(五)Ling先生

GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类。

(一)定义GameService组件接口

根据前面程序对GameService组件的依赖,程序需要GameService组件包含如下方法。

·start():初始化游戏状态,开始游戏的方法。

·Piece[][]getPieces():返回表示游戏状态的Piece[][]数组。

·booleanhasPieces():判断Pieces[][]数组中是否还剩Piece对象;如果所有Piece都被消除了,游戏也就胜利了。

·PiecefindPiece(floattouchX,floattouchY):根据触碰点的X、Y坐标来获取。

·LinkInfolink(Piecep1,Piecep2):判断p1、p2两个方块是否可以相连。

为了考虑以后的可拓展性,需先为GameService组件定义如下接口。

接口代码如下:src\org\crazyit\link\board\GameService

1publicinterfaceGameService2{3/**4*控制游戏开始的方法5*/6voidstart();78/**9*定义一个接口方法,用于返回一个二维数组10*11*@return存放方块对象的二维数组12*/13Piece[][]getPieces();1415/**16*判断参数Piece[][]数组中是否还存在非空的Piece对象17*18*@return如果还剩Piece对象返回true,没有返回false19*/20booleanhasPieces();2122/**23*根据鼠标的x座标和y座标,查找出一个Piece对象24*25*@paramtouchX鼠标点击的x座标26*@paramtouchY鼠标点击的y座标27*@return返回对应的Piece对象,没有返回null28*/29PiecefindPiece(floattouchX,floattouchY);3031/**32*判断两个Piece是否可以相连,可以连接,返回LinkInfo对象33*34*@paramp1第一个Piece对象35*@paramp2第二个Piece对象36*@return如果可以相连,返回LinkInfo对象,如果两个Piece不可以连接,返回null37*/38LinkInfolink(Piecep1,Piecep2);39}

(二)实现GameService组件

GameService组件的前面三个方法实现起来都比较简单。

前3个方法的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl

(三)获取触碰点的方块

当用户触碰游戏界面时,事件监听器获取的时该触碰点在游戏界面上的X、Y坐标,但程序需要获取用户触碰的是哪块方块,就要把获取的X、Y坐标换算成Piece[][]二维数组中的两个索引值。

考虑到游戏界面上每个方块的宽度、高度都是相同的,因此将获取得X、Y坐标除以图片得宽、高即可换算成Piece[][]二维数组中的索引。

根据触碰点X、Y坐标获取对应方块得代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

getIndex(intrelative,intsize)方法的实现就是拿relative除以size,只是程序需要判断可以整除和不能整除两种情况:如果可以整除,说明还在前一块方块内;如果不能整除,则对应于下一块方块。

getIndex(intrelative,intsize)方法的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1//工具方法,根据relative座标计算相对于Piece[][]数组的第一维2//或第二维的索引值,size为每张图片边的长或者宽3privateintgetIndex(intrelative,intsize)4{5//表示座标relative不在该数组中6intindex=-1;7//让座标除以边长,没有余数,索引减18//例如点了x座标为20,边宽为10,20%10没有余数,9//index为1,即在数组中的索引为1(第二个元素)10if(relative%size==0)11{12index=relative/size-1;13}14else15{16//有余数,例如点了x座标为21,边宽为10,21%10有余数,index为217//即在数组中的索引为2(第三个元素)18index=relative/size;19}20returnindex;21}

(四)判断两个方块是否可以相连

判断两个方块是否可以相连是本程序需要处理的最繁琐的地方:两个方块可以相连的情形比较多,大致可分为:

·两个方块位于同一条水平线,可以直接相连。

·两个方块位于同一条竖直线,可以直接相连。

·两个方块以两条线段相连,有1个拐点。

·两个方块以三条线段相连,有2个拐点。

下面link(Piecep1,Piecep2)方法把这四种情况分开进行处理。

代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

为了实现上面4个方法,可以对两个Piece的位置关系进行归纳。

·p1于p2在同一行(indexY值相同)。

·p1与p2在同一列(indexX值相同)。

·p2在p1的右上角(p2的indexX>p1的indexX,p2的indexY

·p2的p1的右下角(p2的indexX>p1的indexX,p2的indexY>p1的indexY)。

至于p2在p1的左上角,或者p2在p1的左下角这两种情况,程序可以重新执行link方法,将p1和p2两个参数的位置互换即可。

(五)定义获取通道的工具方法

这里所谓的通到,指的是一个方块上、下、左、右四个方向的空白方块。

下面是获取某个坐标点四周通道的4个方法的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

(六)没有转折点的横向连接

如果两个Piece在Piece[][]数组中的第二维索引值相等,那么这两个Piece就位于同一行,如前面的link(Piecep1,Piecep2)方法中,调用isXBlock(Pointp1,Pointp2,intpieceWidth)判断p1、p2之间是否有障碍。

下面是isXBlock方法的代码:src\org\crazyit\link\board\impl\GameServiceImpl.java

1/**2*判断两个y座标相同的点对象之间是否有障碍,以p1为中心向右遍历3*4*@paramp15*@paramp26*@parampieceWidth7*@return两个Piece之间有障碍返回true,否则返回false8*/9privatebooleanisXBlock(Pointp1,Pointp2,intpieceWidth)10{11if(p2.x

(七)没有转折点的纵向连接

如果两个Piece在Piece[][]数组中的第一维索引值相等,那么这两个Piece就位于同一列,如前面的link(Piecep1,Piecep2)方法中,调用isYBlock(Pointp1,Pointp2,intpieceWidth)判断p1、p2之间是否有障碍。

下面是isYBlock方法的代码:src\org\crazyit\link\board\impl\GameServiceImpl.java

/***判断两个x座标相同的点对象之间是否有障碍,以p1为中心向下遍历**@paramp1*@paramp2*@parampieceHeight*@return两个Piece之间有障碍返回true,否则返回false*/privatebooleanisYBlock(Pointp1,Pointp2,intpieceHeight){if(p2.y

(八)一个转折点的连接

对于两个方块连接线上只有一个转折点的情况,程序需要先找到这个转折点。为了找到这个转折点,程序定义一个遍历两个通道并获取它们交点的方法。

/***遍历两个通道,获取它们的交点**@paramp1Chanel第一个点的通道*@paramp2Chanel第二个点的通道*@return两个通道有交点,返回交点,否则返回null*/privatePointgetWrapPoint(Listp1Chanel,Listp2Chanel){for(inti=0;i

当p2位于p1的右上角时,应该计算p1的向左通道与p2的向下通道是否有交点,p1的向上通道与p2的向左通道是否有交点。

当p2位于p1的右上角时,应该计算p1的向右通道与p2的向上通道是否有交点,p1的向下通道与p2的向左通道是否有交点。

根据p1与p2具有上面两种分布情形,程序提供如下方法进行处理。

在上面程序中用到isLeftUp、isLeftDown、isRightUp、isRightDown四个方法来判断p2位于p1的左上、左下、右上、右下4种情形。这4个方法的实现,只要对它们的X、Y坐标进行简单判断即可。

4个方法的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

1/**2*判断point2是否在point1的左上角3*4*@parampoint15*@parampoint26*@returnp2位于p1的左上角时返回true,否则返回false7*/8privatebooleanisLeftUp(Pointpoint1,Pointpoint2)9{10return(point2.xpoint1.y);23}2425/**26*判断point2是否在point1的右上角27*28*@parampoint129*@parampoint230*@returnp2位于p1的右上角时返回true,否则返回false31*/32privatebooleanisRightUp(Pointpoint1,Pointpoint2)33{34return(point2.x>point1.x&&point2.ypoint1.x&&point2.y>point1.y);47}

(九)两个转折点的连接

两个转折点的1连接又是最复杂的一种连接情况,因为两个转折点又可分为如下几种情况。

·p1、p2位于同一行,不能直接相连,就必须有两个转折点,分向上与向下两种连接情况。

·p1、p2位于同一列,不能直接相连,也必须有两个转折点,分向左与向右两种连接情况。

·p2在p1的右下角,有6种转折情况。

·p2在p1的右上角,有6种转折情况。

对于上面4种情况,同样需要分别进行处理。

1.同一行不能直接相连

p1、p2位于同一行,但它们不能直接相连,因此必须有两个转折点。当p1与p2位于同一行不能直接相连时,这两个点既可在上面相连,也可在下面相连。这两种情况都代表它们可以相连,我们先把这两种情况都加入结果中,最后再去计算最近的距离。

实现时可以先构建一个Map,Map的key为第一个转折点,Map的value为第二转折点,如果Map的size()大于1,说明这两个Point有多种连接途径,那么程序还需要计算路径最小的连接方式。

2.同一列不能直接相连

p1、p2位于同一列,但它们不能直接相连,因此必须有两个转折点。当p1与p2位于同一列不能直接相连时,这两个点既可在左边相连,也可在右边相连。这两种情况都代表它们可以相连,我们先把这两种情况都加入结果中,最后再去计算最近的距离。

同样的,我们实现时也是构建一个Map。当size()大于1,还要计算最小的连接方式。

3.p2位于p1右下角的六种转折情况

有一条垂直通道与p1的向右通道和p2的向左通道相交的方式。有一条水平通道与p1的向下通道和p2的向上通道相交的方式。即可在上面相连,也可在下面相连。即可在左边相连,也可在右边相连。共6种相连情况。

4.p2位于p1右上角的六种转折情况

与3类似,不再叙述。

对具有两个连接点的情况进行处理的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

getYLinkPoints、getXLinkPoints两种方法的代码如下:src\org\crazyit\link\board\impl\GameServiceImpl.java

但point1、point2之间有多种连接情况时,程序还需要找出所有连接情况中的最短路径,,上面代码中调用了getShortcut(Pointp1,Pointp2,turns,getDistance(Pointp1,Pointp2))方法进行处理。

(十)找出最短距离

为了找出最短路径,程序可分为两步。

1.遍历转折点Map中所有key-value对,与原来选择的两个点构成了一个LinkInfo。每个LinkInfo代表一条完整的连接路径,并将这些LinkInfo收集成一个List集合。

2.遍历第一步得到的List集合,计算每个LinkInfo中连接全部连接点的总距离,选与最短距离相差最小的LinkInfo返回即可。

通过连连看游戏的分析与学习,加强了开发者界面分析与数据建模的能力。通过自定义View来实现游戏的主界面。连连看中需要判断两个方块是否可以相连,需要开发这对两个方块的位置分门别类地进行处理,也加强开发者冷静、条理化的思维。

THE END
1.宠物连连看宠物连连看安卓版下载宠物连连看游戏推荐游戏简介 《宠物连连看》是一款有趣的消除类休闲游戏,关卡丰富画风精简可爱,点击两个相同的两个小动物即可将它们消除,在规定时间内将游戏中的动物消除完即可通关。关卡内还有炸弹、洗牌和提示等道具帮助你更好地完成挑战,感兴趣的小伙伴快来挑战一下吧~ https://a.4399.cn/game-id-256626.html
2.2019年2月28日第二批国产网络游戏审批信息版号公布ISBN 978-7-498-06073-0 ISBN 978-7-498-06066-2 江苏凤凰电子音像出版社有限公司 苏州大禹网络科技有限公司 ISBN 978-7-498-0605…https://www.sohu.com/a/298246448_100204787
3.精彩电视节目一览14:02 小品连连看 14:38 影像世界 14:59 魅力人生 15:29 经典系列 16:00 百草方和 16:30 百草方和 17:05 大课堂 留学世界 12:30 留学看...幼儿-一起玩游戏 14:07 幼儿-爱水果的小狐狸 14:20 小学初级-宠物比赛 14:31 小学初级-儿童节派对 14:48 小学高级-TheFarmerandtheDevil 15:02 小学...https://www.cctv.com/soushi/35/201407181218.shtml
1.耐玩的连连看游戏合集2022经典的连连看游戏排行榜1、《乐游连连看》 传统模式下,玩家们可以挑战相对简单的游戏关卡。而本作为大家带来了无尽模式和挑战模式,适合喜欢不断挑战高难度游戏的各位。 》》》#乐游连连看#《《《 2、《宠物连连消》 宠物元素的加入让单纯的连接玩法变得更有趣,玩家们只需要在关卡当中快速寻找到相同的动物图标即可,多种挑战模式任由大家...https://www.9game.cn/news/7049016.html
2.游戏作文(精选34篇)游戏作文 26 最近,我迷上了一种游戏叫“宠物连连看”,就是把相同的宠物图片给找出来连起来。 我一有时间就玩,“连连看”的影子似乎每时每刻都在我的脑海里晃动,不过几个月,我就从”连连看”“小学”升级到“研究生”。 有一天,我无意中低头看见我的睡衣上的许多图片:蹲着的小黄狗、摇着尾巴的大狗、啃着骨...https://www.ruiwen.com/zuowen/youxi/1752236.html
3.《生化危机6》详细图文攻略(26)生化危机6攻略游戏攻略6 宠物连连看2.6 7 Q版泡泡堂 8 美少女斗地主 9 拳皇wing1.0体验版 10 森林冰火人 奥特曼 拳皇 最后的殖民地 地下城与勇士最新更新TOP10 1 《反间谍》美版 2 《火焰限界》美版 3 《无限传说2》PS3版 4 《植物大战僵尸:花园战争》PS 5 《失落的维度》PS3版 6 《暗黑破坏神3:夺魂之镰》PS 7 《暗黑...https://gl.ali213.net/html/2013-1/32773_26.html
4.宝儿作文(通用32篇)最进,我们家刮进了一阵“网络”风,这下,从来不爱聊天的我,上网的频率也越来越多了,甚至还加入了最新潮流——领养QQ宠物。说到QQ宠物,那可真是好玩儿...奶奶还是一个追随潮流的人,什么节奏大师连连看植物大战僵尸等,这些小游戏奶奶都会玩,每逢假日,爸爸妈妈就会和爷爷奶奶杀上一局,我则是裁判。奶奶打游戏的水平...https://www.yuwenmi.com/zw/501958.html
5.新连连看游戏下载新连连看v2022.05.26最新版版本:v2022.05.26 最新版 时间:2022-06-09 14:48 星级: 官网:暂无 厂商: 平台:Android 解压又上头的无敌连连看。 应用截图 应用介绍 新连连看是一款好玩的休闲类的消除游戏,简单轻松的消除玩法,只需要移动你的手指,点击两个相同的东西,然后他们就会连接,最后消失。 https://www.qqtn.com/azgame/780338.html
6.七年语文同步训练26、结合全文分析“人生的秘密”是什么?(2分) ___ 三、综合学习与探究(10分) 27、黄河石一条奔腾不息的河流,她用她的甘甜的乳汁哺育了一代又一代中华儿女,孕育出灿烂的华夏文化。某班在“黄河,母亲河”的综合性学习中开展了如下活动,请你踊跃参加。 http://www.360doc.com/content/13/0417/18/11923171_279030420.shtml
7.街机连连看安卓版下载街机连连看正版手游下载街机连连看是一款特别有意思的消除类手游,会让玩家玩起来感到特别的轻松愉快,当你闯过的关卡越来越多时,也可以获得丰富的红包奖励,还能够提取到自己的个人账户当中,首页还有专门的排行榜,你可以查看全网排名情况。 《街机连连看》游戏优势: 1:除了经典的连连看模式之外,也加入了街机模式,不断的挑战自我可以获得更高的...https://xin.52pk.com/game/100082.html
8.运动嘉年华,凝聚团队力量,彰显企业文化26、珠行万里 5-10名队伍组成的队伍,手持PC管,传输乒乓球,将球从一端传输到另一端,用时短的队伍获胜。 27、趾压板挑战 男生要完成,仰卧起座、金鸡独立等游戏,完成游戏后背起女生,完成后面的任务……用时短的队伍获胜! 28、八仙过海 8位队员,钻进道具内,手拉道具,一起向前冲,完成规定距离,用时少的队伍,...https://www.meipian.cn/2g7yuzex
9.拼音汉字连连看最新版拼音汉字连连看3.1它以喜闻乐见的连连看游戏为手段,采用过关方式增加学习兴趣,使之在不知不觉中巩固拼音汉字基础,可自定义更换底图,更换皮肤,界面漂亮使用简便,纯净绿色免安装版,放在任何磁盘目录下都能正常运行,没有插件也无任何不良代码,希望能成为您硬盘上的保留节目,如能为您的孩子在学习上带来帮助,是我的万分荣幸,请关注大河...https://xiazai.zol.com.cn/detail/49/480162.shtml
10.连连看游戏消除算法连连看判断两个点是否可以消除连连看游戏消除算法 今天在收到一道的面试题,觉得比较有意思,决定记录下来,整个题目与解答过程大概如下。 连连看是一种很受大家欢迎的小游戏。下面四张图给出了最基本的消除规则: 图A 中出现在同一直线上无障碍的圈圈可以消除;图 B 中两个圈圈可以通过一次转弯消除;图 C 和图 D 中,两个圈圈可以通过两次转弯消除...https://blog.csdn.net/zhelong19830726/article/details/98394184
11.宝宝巴士亲子游戏(第226集)少儿高清在线观看PP视频46-小云朵旅行记 295 47-宝宝认知大全 295 48-宝宝爱记忆 295 49-宝宝小牙医 295 50-宝宝不怕 295 看过的人也爱看换一换 10集全 超变武兽之超变连连看第二季 26集全 玥玥的折纸世界 智绘彩蛋 智绘涂鸦 第三季 更新至19集 碰碰狐动物儿歌 智绘纽扣...https://m.pptv.com/show/ayZX1DyiaElCzMZk.html