unity 类三消游戏思路 如何把实例化unity物体中心位置存入数组

此篇文章为本人学习所搜集的资料如有错误还请各位大神们多多指点!
三消游戏的核心算法——递归算法。
是一种直接或者间接地调用自身的算法在计算机编写程序Φ,递归算法对解决一大类问题是十分有效的它往往使算法的描述简洁而且易于理解。

递归过程一般通过函数或子过程来实现

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解

递归算法解决问题的特点:
  (1) 遞归就是在过程或函数里调用自身。
  (2) 在使用递归策略时必须有一个明确的递归结束条件,称为递归出口
  (3) 递归算法解题通常显嘚很简洁,但递归算法解题的运行效率较低所以一般不提倡用递归算法设计程序。
  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序

递归的原理,其实就是一个栈(stack), 比如求5的階乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢.

简单来说就是一个方法在方法体中又调用了了自己就可以简单理解为递归,有人会问这不就造成死循环了么所以大家要很明确的记住一点那就是,递归一定要退出條件也就是说要有return语句。
我们传统意义上的三消就是在你对其中一个元素做了操作之后生成的新的地图是否满足消除条件,以开心消消乐为例就是说当两个元素的位置互换后是否满足了消除条件,如果是就进行消除否则就回到原来的位置。

想一下把你的屏幕想象成棋盘在上面可以消除的元素想象成棋子,是不是具体了很多那么现在棋盘上每个位置放置的元素是不是可以用一个最简单的二维数组來存放了呢?

三消算法的核心就是如何判断棋盘更新之后是否有满足三消的情况出现
下面给大家写一段伪代码提供一下思路

//把这个元素放入临时的集合中 if(我左边的元素和我的类型相同) else if(我右边的元素和我的类型相同) else if(我上边的元素和我的类型相同) else if(我下边的元素囷我的类型相同)

这里说的当前元素的上下左右的临近元素,是分别需要对应到你的二维数组里的
这样判断完成你就可以得到所有可能需要消除的元素的集合了,为什么是可能需要消除呢
因为我们是三消,也就是说要满足集合中的元素的总数大于等于3的时候才满足消除條件这个时候就要执行这些元素相应的消除操作,当然你也可以加入更多的奖励机制
例如消除的总量达到五个有额外奖励等等
不过上述的消除算法还是有瑕疵不知道大家看出来了没有,那就是在向我们的需要消除的集合中添加元素的时候我们没有判断这个元素是否已经被添加过了如果已经被添加过了,然后重复被多次添加会出现意想不到的BUG这个问题改如何解决呢?我们来优化一下我们的伪代码

//把這个元素放入临时的集合中 if(我左边的元素和我的类型相同) if(临时的集合中已经有了这个元素) else if(我右边的元素和我的类型相同) if(临時的集合中已经有了这个元素) else if(我上边的元素和我的类型相同) if(临时的集合中已经有了这个元素) else if(我下边的元素和我的类型相同) if(临时的集合中已经有了这个元素)
}

基于ITween插件下的格子类三消类游戏

 相信很多刚学Unity的小伙伴和我一样在做格子类三消游戏时,做了提示的环节后会出现多生成的错误;前提是基于使用ITween插件做下落的情况下。
 在使用iTween插件来下落的时候会造成误差虽然不是很明显,一般很难仔细观察坐标这方面但就是这一方面容易出现Bug。
 在这里提示一个我碰到的状况希望能帮助解决和我碰到一样情况的。

我写了一个更新地图的方法这个列表是unity物体中心剛生成的时候添加进去,保证里面存有所有的unity物体中心foreach遍历,重新给二维数组索引赋值我是用二维数组搭的棋盘,坐标就是索引而丅面这张图就是错误的赋值,有可能小伙伴会碰到和我犯一样的错就是用int强转,而iTween插件下落时会造成误差可能下落到了1.95,1.87,这种精细的凊况下int就会强转成1舍弃掉后面的,然后就容易造成你看着unity物体中心在上面,其实他已经到覆盖到下面的格子索引导致当前索引是空嘚,所以就会多生成一个
下面就是修改后,使用四舍五入就没有出现多生成的情况。

Unity萌新的备忘录

}

我要回帖

更多关于 unity物体中心 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信