甜品消消乐

甜品消消乐这款游戏本质其实就是一个三消类游戏,(交换甜品后,满足一行,或一列至少三个就可以消除)

下面主要讲讲游戏的思路和代码的实现 

A.首先我们需要创建一个格子的Prefabs(预制体),然后实例化出一个9*8的(规格自己确定)大网格出来

B.有了大网格之后我们就要填充甜品,填充甜品的方法分为两种 一种直线填充,一种是斜向填充(因为在游戏中设置了障碍,甜品下落会受到阻碍,就要斜向填充)

C.填充完成之后,就要交换甜品进行消除,消除之前首先需要判断是否满足消除的条件 ,这个游戏有这么几个条件

行消除(一行之中至少有三个) 列消除(一列之中至少有三个) L,T型消除(满足行消除或列消除的前提下,对行消除每个甜品进行遍历(只要任意一个甜品满足(行消除是它的上方或下方,列消除它是左边或右边)加起来同色的甜品至少有两个))

下面的图是游戏的示例图(图中的饼干即是障碍)

这里我们用图的形式来讲解一下

这是行消除的基本格式,当然也可以有四个或五个等等

接下来是列消除

最后是L型  , T型消除

        

        

B.首先来讲一讲直线填充的思路

填充分为两部,先是分部填充,后是全部填充(在这之中会用到协程(目的是使甜品的下落等待几秒,使得下落更加自然))

1。首先写两个for循环遍历一下这个大网格(需要注意的是先遍历行,从倒数第二行开始遍历,(因为最后一行下面是没有格子的不需要填充))首先得到当前甜品的对象X,(判断一下它是否可以移动的)在得到它下面一格的甜品对象Y,(判断Y是否是空的甜品对象)如果是空的甜品对象,则销毁Y,将X移动到Y的位置,在X的位置创建一个空的甜品对象Z,继续填充

这样一直遍历到第0行,才出现了特殊的情况(上面没有空甜品对象填充下来了)解决的办法是先得到第0行的甜品对象A,(如果是空的甜品对象)在它的上方创建一个正常的甜品对象B,将A初始化到B的位置,并且类型置为正常甜品对象,然后将A移动到原来第0行的位置,再继续填充。 部分填充的返回值是bool类型的 填充完成 false; 需要填充 true;

2.分布填充完成之后,我们就可以全部填充,全部填充用到了协程方法 方法里是  一个while()循环(条件是部分填充的方法,是否完成填充),yield return new WaitForSeconds(time);,使甜品的下落更加字然,这样在Start中放置,就可以一直 缺少了就填充。

B.接下来讲一下斜向填充。(首先讲一下为什么要斜向填充) 因为在游戏中设置了甜品障碍物(不能移动),所以当下落的过程中,甜品下落会被堵住,所以需要两边下落的甜品去补充。不然中间会填充不到。

1.在直线填充的基础上,得到当前的甜品对象X,在得到下面一格的甜品对象Y(假如Y甜品对象不为空,(为障碍的情况下)),就需要填充,填充分左右两种情况,左右道理是一样的,左边的话,先得到甜品对象X左下方的甜品对象Z(假如甜品对象Z是空的话才可以进行填充)得到Z上方的甜品对象 A 但在次之前需要判断的A和A上方,(假设有不能移动的甜品,且不为空的话(障碍的话)直线填充就不能满足需求),这个时候我们就需要斜向填充,销毁Z甜品对象 将甜品对象X移动到Z处,然后在X甜品对象位置创建一个空的甜品对象。右边的道理也是一样的

C.紧接着我们来讲消除的条件,先讲行,列消除。

我们要创建三个List<Sweets>类型的集合 ,一个存储行匹配的甜品集合listRow,一个存储列匹配的甜品集合listCloum,一个存存储完成匹配的甜品l集合istFinished

因为L,T型消除是基于(行消除,和列消除的),1.行消除的条件--首先还是一样,遍历这个大网格 假设取得甜品A 把它加入listRow,同样是从它的左右开始遍历。往左的话---如果发现是相同的颜色的甜品把它加入 listRow,如果是不同的颜色,则停止。

往右的话---如果发现是相同的颜色的甜品把它加入 listRow,如果是不同的颜色,则停止。然后判断集合中listRow的数量是否大于3.如果大于3的话则把listRow的元素全部添加进listFinished集合中

2.列消除的 假设取得甜品B 把它加入listCloum,同样是从它的上和下开始遍历。往上的话---如果发现是相同的颜色的甜品把它加入 listRow,如果是不同的颜色,则停止。往下的话---如果发现是相同的颜色的甜品把它加入 listCloum,如果是不同的颜色,则停止。然后判断集合中listCloum的数量是否大于3.如果大于3的话则把listCloum的元素全部添加进listFinished集合中

3.L,T,型消除的条件 首先假设满足行消除条件,在它基础上遍历每一个甜品,假设从第一个甜品A,进行列消除条件的判定,如果,lisCloum集合的元素小于 2个的话,就清楚listCloum中的元素(因为至少要有三个甜品才能满足列消除的条件),否则的话,就把listCloum集合中的元素添加至listFinished中去。然后再把集合listRow,listCloum清空。

首先假设满足列消除条件,在它基础上遍历每一个甜品,假设从第一个甜品A,进行行消除条件的判定,如果,lisRow集合的元素小于 2个的话,就清楚listRow中的元素(因为至少要有三个甜品才能满足行消除的条件),否则的话,就把listRow集合中的元素添加至listFinished中去。

得到了完成匹配的列表,清楚的方法就很简单了-------------------------------------------------------

这个就是博主总结的甜品消消乐的基本的思路(由于代码关联性太大,在此就没有写出)

猜你喜欢

转载自blog.csdn.net/weixin_41765385/article/details/81514788
今日推荐