吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Fruit Ninja(写在前面的话)

   我曾经在大二的时候读过乔布斯的传记——《活着就为改变世界》,为我大学的世界观又增加了一笔,算是存在的意义吧!(注意,这本传记不是乔布斯去世后的正 传)这里也稍微谈谈乔布斯。我的印象中,乔布斯是一种类似于秦始皇这样的人物,有魅力,有自己的独断能力。早期的时候比较专权,在晚年的时候开始逐渐修正 自己的思想观念,没有错,就如同死亡笔记里面的L所说的那样——任何人都不可能改变世界!而正因为如此,这个世界才会变得那么美丽!

  

  

   乔布斯在五十岁出头就已经统治了全世界的三大产业,长年的发奋,加上早年的吸毒,自己的身体也日渐萎靡不振。但是,可以想见的是,乔布斯这位卓越的艺术家 的存在对于当今的世人的一个意义,真的仅仅就是一个榜样嘛?我觉得,至少,对于我来说,他最可贵的地方,在于被自己的董事会开除之后,又重新夺回了自己昔 日的位置,这真的不是常人可以做到的。人生苦短,几十年而已,能像乔布斯那样反复的又有几人呢?说乔布斯是伟人,一点错都没有。
  

  

  现在,乔布斯已经淡出了人们的视线,但是,不可否认的是,就算是几岁的小毛毛,目前也在用着平板ipad切水果呢!

  这里排开绚丽的画面,多样的道具,也不讨论各种计分规则以及最后的SCORE输出的算法,我们这里主要针对玩家,设计两个辅助的AI:

  (a)碰撞检测AI

  我们定格一个时间,假设这个时刻(固定的),我们如何切,才能让切到的水果最多(假设每个水果的积分是相等的,如果不相等也没有关系,只是在进行计算几何 的分析之后,要综合考虑到每种水果的积分权值是不相等的)。这样的话,就存在一个叫做碰撞检测的问题,这个在游戏的算法中很常见。怎样才叫做碰撞了呢?比 如,可能是只要这个图形所在的区域的一点遭到碰撞之后,就说明是碰撞的。当然,这个是可以的,但是,在有些游戏中,这又显得太“敏锐”了一些,比如一些剧 情游戏,但是,在有些游戏中,这些又是必须要遵循的——比如这款Fruit Ninja的游戏,还有一款游戏,也需要碰撞检测做出敏锐的反应,这个,我暂时不知道名字叫什么了,就是两个人控制两个控制台对中间的那个小球进行碰撞, 然后比谁先进洞,有知道名字的不妨回复一下,告诉我一下哈!

   

  

   而有些游戏的碰撞检测“灵敏度”则没有必要那么强烈,我们可以假设有两个小人,他们可以作为两个长方形进行近似,我这里只举出一个简单的例子,碰撞检测是一门很复杂的技术,这里只是提一下(我在以后的Round中会详细阐述的):

 

  

  如图所示,两个长方形,这里记为A和B,相交于一个区域,这个区域与长方形A和B的面积之后的比值就可以看做碰撞检测的标准,我们可以根据具体的灵敏度进行调节。当然,是越灵敏的话,比值应该是越小吧!

  还没有完,我们只是给定了灵敏度的概念,但是,我们在进行碰撞检测的时候,具体应该将那些水果的形状近似成什么好呢?矩形?还是圆形?直的还是方的?根据不同的形状进行,我们会采取不同的方法进行处理。

 

  

  对于具体的问题,应该作具体的分析,对于Fruit Ninja来说,这两种近似都是蛮好的。但是,虽然近似的形式不一样,方法确实一样的,都用的是计算几何+扫描线算法。这里,我会以两弹分别以这两种方式实现这款游戏的碰撞检测AI。

  (b)水果产生AI

 

  

编辑 |删除 | 复制链接 吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Fruit Ninja(写在前面的话) 2013-04-24 23:23 (分类:吴昊杂文)

 

   

  我曾经在大二的时候读过乔布斯的传记——《活着就为改变世界》,为我大学的世界观又增加了一笔,算是存在的意义吧!(注意,这本传记不是乔布斯去世后的正 传)这里也稍微谈谈乔布斯。我的印象中,乔布斯是一种类似于秦始皇这样的人物,有魅力,有自己的独断能力。早期的时候比较专权,在晚年的时候开始逐渐修正 自己的思想观念,没有错,就如同死亡笔记里面的L所说的那样——任何人都不可能改变世界!而正因为如此,这个世界才会变得那么美丽!
 

   乔布斯在五十岁出头就已经统治了全世界的三大产业,长年的发奋,加上早年的吸毒,自己的身体也日渐萎靡不振。但是,可以想见的是,乔布斯这位卓越的艺术家 的存在对于当今的世人的一个意义,真的仅仅就是一个榜样嘛?我觉得,至少,对于我来说,他最可贵的地方,在于被自己的董事会开除之后,又重新夺回了自己昔 日的位置,这真的不是常人可以做到的。人生苦短,几十年而已,能像乔布斯那样反复的又有几人呢?说乔布斯是伟人,一点错都没有。

 

  现在,乔布斯已经淡出了人们的视线,但是,不可否认的是,就算是几岁的小毛毛,目前也在用着平板ipad切水果呢!

  这里排开绚丽的画面,多样的道具,也不讨论各种计分规则以及最后的SCORE输出的算法,我们这里主要针对玩家,设计两个辅助的AI:

  (a)碰撞检测AI

  我们定格一个时间,假设这个时刻(固定的),我们如何切,才能让切到的水果最多(假设每个水果的积分是相等的,如果不相等也没有关系,只是在进行计算几何 的分析之后,要综合考虑到每种水果的积分权值是不相等的)。这样的话,就存在一个叫做碰撞检测的问题,这个在游戏的算法中很常见。怎样才叫做碰撞了呢?比 如,可能是只要这个图形所在的区域的一点遭到碰撞之后,就说明是碰撞的。当然,这个是可以的,但是,在有些游戏中,这又显得太“敏锐”了一些,比如一些剧 情游戏,但是,在有些游戏中,这些又是必须要遵循的——比如这款Fruit Ninja的游戏,还有一款游戏,也需要碰撞检测做出敏锐的反应,这个,我暂时不知道名字叫什么了,就是两个人控制两个控制台对中间的那个小球进行碰撞, 然后比谁先进洞,有知道名字的不妨回复一下,告诉我一下哈!

 

  而有些游戏的碰撞检测“灵敏度”则没有必要那么强烈,我们可以假设有两个小人,他们可以作为两个长方形进行近似,我这里只举出一个简单的例子,碰撞检测是一门很复杂的技术,这里只是提一下(我在以后的Round中会详细阐述的):

 

  如图所示,两个长方形,这里记为A和B,相交于一个区域,这个区域与长方形A和B的面积之后的比值就可以看做碰撞检测的标准,我们可以根据具体的灵敏度进行调节。当然,是越灵敏的话,比值应该是越小吧!

  还没有完,我们只是给定了灵敏度的概念,但是,我们在进行碰撞检测的时候,具体应该将那些水果的形状近似成什么好呢?矩形?还是圆形?直的还是方的?根据不同的形状进行,我们会采取不同的方法进行处理。

 

  对于具体的问题,应该作具体的分析,对于Fruit Ninja来说,这两种近似都是蛮好的。但是,虽然近似的形式不一样,方法确实一样的,都用的是计算几何+扫描线算法。这里,我会以两弹分别以这两种方式实现这款游戏的碰撞检测AI。

  (b)水果产生AI

  为什么要研究水果的产生AI呢?因为,时间是会变化的,这就是关键所在。在(a)中,我们已经探讨了,在某个确定的时刻,我们当然是可以判断出从一群水果中如何切,才能切到数量最多的水果,但是,问题是,整个过程是运动的,你如何知道某个时刻你是否可以切到最多呢?

  这就有点像局部最优解和全局最优解一样,这是完全不一样的两个概念,我们通盘考虑的话,就必须要加上时间t这个因素,所以,在这个觉悟中,我们有必要研究水果产生的AI算法。

  其实,除了随机数生成以外,这可以转换成一个纯粹的物理问题(这里忽略碰撞的检测,将每个水果都质点化,因为,我们考虑的问题已经不是碰撞检测了,所以, 问题的关注点可以适当转移),这就是一个纯粹的斜抛问题。我们需要找到一个时刻,划出一条直线,求得切开的水果的最多值以及对应的时刻。

 

  

  好了,作为预告片,就到此为止吧!衷心祝愿大家在以后玩Fruit Ninja的时候可以玩出类似于上图的画面——不可思议的出击!!!






  

posted on 2013-04-24 23:34  吴昊系列  阅读(1245)  评论(5编辑  收藏  举报

导航