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

本文探讨了游戏《Fruit Ninja》中的AI设计,包括碰撞检测AI及水果产生AI。通过计算几何与扫描线算法实现碰撞检测,确保玩家能准确切割水果;并分析水果产生AI,以确保游戏体验流畅。

   我曾经在大二的时候读过乔布斯的传记——《活着就为改变世界》,为我大学的世界观又增加了一笔,算是存在的意义吧!(注意,这本传记不是乔布斯去世后的正 传)这里也稍微谈谈乔布斯。我的印象中,乔布斯是一种类似于秦始皇这样的人物,有魅力,有自己的独断能力。早期的时候比较专权,在晚年的时候开始逐渐修正 自己的思想观念,没有错,就如同死亡笔记里面的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的时候可以玩出类似于上图的画面——不可思议的出击!!!






  

转载于:https://www.cnblogs.com/tuanzang/archive/2013/04/24/3041412.html

### 关于离散数学的学资源 经过查询,当前并未发现吴昊授有直接涉及离散数学材或讲义的相关公开作品。根据已知的信息,吴昊授的主要研究领域集中在偏微分方程[^1],并为研究生开设了《非线性发展方程》等相关课程。因此,在其学术贡献中尚未提及与离散数学相关的具体出版物。 然而,对于学习离散数学的需求,可以推荐以下几种获取学资源的方式: #### 1. **在线开放课程** 许多高校提供了免费的离散数学公开课视频,例如麻省理工学院(MIT)和斯坦福大学等国际知名学府均在其官方网站上发布了相关课程录像。这些资源通常附带详细的课件以及练习题解答。 #### 2. **电子书下载平台** 部分合法网站允许用户浏览甚至下载经典的离散数学校本科书PDF版本,比如: - Springer出版社系列书籍 - Elsevier旗下期刊配套读物 需要注意的是,任何未经授权传播受版权保护的内容都属于违法行为,请务必确认所使用的渠道具备合法性前提下操作。 #### 示例代码片段用于检索网络上的pdf文件链接(仅作演示用途): ```python import requests from bs4 import BeautifulSoup def search_pdf(keyword): url = f"https://example.com/search?q={keyword} filetype:pdf" response = requests.get(url) soup = BeautifulSoup(response.text,"html.parser") results = [] for link in soup.find_all('a'): href=link.get('href') if '.pdf' in str(href).lower(): results.append(href) return results[:5] print(search_pdf("discrete mathematics")) ``` 上述脚本能帮助初步筛选含有特定关键词的PDF文档地址列表,但实际应用前应调整目标站点URL至合适范围以免触犯法律条款。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值