AI的真实感
AI的真实感一直是游戏AI程序员追求的目标,如何做出能给玩家真实感,挑战性又不会劝退玩家的AI,既需要AI程序员有一定的程序功底,还需要广泛地阅读和游戏人工智能相关的课题,比如:心理学,生物学,认知科学乃至军事战术等,在你阅读时你会不断迸发出更好的想法;还需要和团队多沟通,无论是程序员还是策划,甚至是老板,他们有时一个好的想法就能为你设计的游戏AI增强真实性。
请牢记一点:游戏AI的真实感需要服务于游戏本身,其唯一目的是让玩家玩游戏觉得更有趣。
虽然本篇博客会较少代码讲解,但更多地是希望讲解一些学习AI过程中遇到的或想到的方法,然后可以根据做的游戏的不同将这些想法融入设计的游戏AI里。
1.让AI"不完美"--估算和假设
游戏AI并非越智能越好,因为就算是人类,有时也会犯错,所以为了让游戏AI更真实,有时需要让游戏AI犯错,才会使玩家有更愉快的游戏体验(而不是被电脑打爆)。
有两种方式诱使AI犯错:
先使AI“完美”,再让它变傻
当设计AI使用的算法时,通过假设和估算,允许悄悄混进“错误”。
以足球AI为例,前者用一个取值为一个固定大小范围的随机值的变量作为干扰值(随机噪声),使AI每次判断踢球方向时产生小错误;后者是让AI用圆而非椭圆(估算)来描述对手的截球范围,既简化了AI算法,又实现”不完美“。当然,在不同的游戏里如何使AI犯错就得因游戏而论了。
而在不少FPS游戏里,在游戏AI第一次射击玩家时让其专门射偏是一个好主意,能提醒玩家有AI的出现,在未受伤前做好准备。尤其在玩家需要探索一间充满敌人的屋子时,给了玩家一个了解基本形势的机会并量力而行,不至于一进门就被集火杀死。
射偏还有其他好处:
- 比如射偏的是飞行轨迹明显或者会留下痕迹的箭,火箭等,让它故意射偏在玩家的视野范围之内会大大提高游戏的刺激感
- 当玩家濒临死亡时,故意让AI射击准确性降低,会让玩家有一个体验困境中躲过枪林弹雨,最后坚强获胜的惊心动魄的机会(像美国枪战大片那样),大大提高游戏的有趣性。
2 AI感知
对于许多类游戏而言,想让AI看起来智能,需要AI有精确的感知模仿,并不是说简单地模仿立体视觉和听力,还要其决策逻辑和其感知能力保持一致。
有些游戏不太需要这种感知模拟,一是它会占用不少的CPU和内存的资源,二是有些游戏使用这种感知模拟并不会提升游戏体验。
全能感知
1.你安静地接近一个敌人AI打算背后刺杀,结果他立刻转过身一枪把你秒了(可能听到眨眼睛的声音)。
【我起了,一枪秒了,有什么好说的】
2.你潜行在黑暗处匍匐前行,旁边一个守卫明明看不到暗处,就突然发现了你,给你来了一枪。
【是不是玩不起?AI开挂实锤】
这就是典型的具有全能的感知能力的AI,这可能是因为AI程序员为了轻松或没有考虑到事实和感知,这样的AI只会让玩家失去玩游戏的兴趣。因此需要将AI的视觉和听觉限制得与玩家一样,听力范围限制,无法看到黑暗里的物品,视力范围90°,不能透视等。
这又牵扯出一个经典的话题:AI可以作弊吗?
这里的作弊不仅指的是AI使用了玩家不能使用的能力,或者单方面获取比玩家更多的信息,获得更多资源,还包括AI拥有程序员设计的完善的决策设计,当他能够打败玩家时却放弃了那个可以获胜的决策而制造出失误的表象,也就是放水。
我认为是可以的。其实大部分游戏的AI都是会作弊的,除非没必要,比如红警,街霸,还有不少战略游戏里面,AI都是会作弊的,因为这样能更快速有效地给玩家制造紧迫感,实现难度控制。 需要给予作弊能力的关键在于玩家和游戏AI之间天生处于不平等地位。
大部分AI还未能实现自我学习的能力,都是靠经验丰富的游戏AI程序员花费大量时间去模拟玩家实现接近玩家的AI,而且目前费了好大劲实现的自主学习的AI又其实与会作弊的AI(指的是作弊得恰到好处的)给予玩家的游戏体验的差别并不大,厂商为了游戏体验和成本,街机厅的老板为了恰饭,所以才会选择了给予作弊。
在《可汗:战争之王2》(一款即时战略游戏)中,有两个巧妙的作弊:
- 在探索地图时,每30秒左右给AI一个随机的机会作弊,如果有机会作弊,就让AI去探索有些好东西的区域,这可以帮助我们避免AI不幸碰巧没找到任何附近的资源的状况发生。
- 在一个区域内保持和对手的实力相近,这使得我们能够分配合理的兵力去进攻和防守,以避免兵力部署的徒劳无功。
归根结底,当且仅当AI作弊能提高玩家体验时,就应该让AI作弊。但记得一点:让你的AI作弊得不易被发现,否则就是另一种状况了。
图为《可汗:战争之王2》
特定感觉无知
1.你和精英怪单挑,一套下去发现打不过,濒临死亡被逼到角落阴暗处,精英怪丢失了目标不再攻击,回到原本看守的地方,你莫名其妙活下来了。
2.你刺杀了一位守卫,他临死前叫了一声,一群守卫立刻赶来,你来不及隐藏尸体就躲进衣柜,紧张地准备着守卫发现尸体后搜索房间时的一场恶战,结果他们从尸体上踩了过去,仿佛没看到尸体。
这些情况是因为AI感知得太少,也说明了为了让AI更真实,需要一种机制让AI模仿人类的短期记忆。
在我博客所参考的那本书里举了个很生动的例子:
当一名AI遇到两名玩家,他的视野里有两名与他距离不同的分别位于左右的玩家,两条线表示视野
当他判断左边那个玩家离他更近,对他威胁程度更大时,他往左边转准备攻击左边玩家,这时他一左转右边玩家丢失在他视野之外(AI也就不会再警惕右边玩家)
然后那名玩家(丢失在右边视野的)直接走到AI右边将其杀死
这个例子就很形象说明了AI需要短期记忆,不然若游戏里面发生上面所举这个例子,玩家会强烈地感觉到: 我上当了!他不是人!
至于如何实现短期记忆,视你所期望的游戏效果而自由改变,一般是以一个值作为可记忆时间,用最后敌人出现的位置作为记录,增加相应的决策判断,并在下次发现该对象时更新记忆系统相关信息,当超过记忆时间或决策判断不会对自身产生影响则将其移除于记忆系统。
3 AI的个性
不同的AI如果有不同的角色设计,就需要在其AI行为方面表现其个性,就算没有角色设计,也应该尽量避免所有的AI的思考方式是一致的(容易让玩家感受到虚假感),以产生有随机个性的AI。
简单来说,因为AI的行为决策系统计算不同行为的期望值分数都被限制在同一范围内(如 0~1),那我们可以通过对每个分数乘以其所需个性趋向的一个偏移常量,就能轻松生成有不同个性特点的AI。比如FPS游戏里,胆小的人永远会把自己的生存放在第一位而较为谨慎,所以将其对药品和防具的寻找行为的期望值偏量设为1.5,而暴躁好斗的人会更趋向于进攻,所以将其攻击目标的行为期望值偏量设为1.5。
如果你的游戏设计要求一个角色的个性在该游戏中保持不变,那你就需要为每个具有个性的角色建立单独的脚本文件,用来存放其所有特性数据。如果你的游戏设计没有什么角色个性设计,那么你也可以在决策系统中计算期望值分数时加入一个固定大小范围的随机个性偏移量,以生成不同行为趋向的角色。
而除了随机个性偏移量,有些时候还会由角色设计而增加更多个性化的选择趋向,如武器方面,说话方式,甚至塑造人物精神,增加牺牲自我,保护队友的决策。
在使命召唤中我印象最深的是格里戈斯上士 ,临危之际不忘把队友"肥皂" 拖向掩体!然后自己却与敌人继续交火,献出了自己的生命,当时玩的时候感觉非常的感动,确定是塑造了一位有血有肉的有伟大精神的真实角色形象。
图右一为格里戈斯上士
4 AI的预判
首先是一些游戏不太需要AI具有预判性,比如:说galgame,剧情解密类;而一些游戏就需要具有预判性的AI,比如说:策略类游戏,棋类游戏。具有一定的预判性的AI会给玩家带来惊喜,真实感与挑战性(不要盲目增强,如果整个阿尔法狗出来就直接劝退玩家了)。
简单的预判比如说:
当地图上的某些特定的物件即将重生时,比如说LOL里面的野区资源,又或者说是守望先锋里面固定点重新刷新的医疗包,出色的玩家会提前准备好前往目标处以保证抢先占有它,那就可以让游戏AI用算法提前预计最近的即将再生或未被夺取的资源点,并规划路径前往。
图为lol里盖伦预判敌人路过补视野草丛埋伏
又或者是在攻击和追逐敌人时计算移动目标位置时加入敌人的速度及运动方向,预判其下个时间的位置进行追逐或攻击。
复杂的预判比如说:
在FPS游戏中,出色的老兵在打伤了敌人后,会提前到距离受伤敌人最近的医疗包处进行埋伏,当敌人到来时给予致命一击。那么游戏AI也可以模仿这种预判思维,在攻击成功判断后添加一个搜索并前往离受伤者最后出现的地方最近的医疗包处进行埋伏的决策,可以想象到玩家如果遇到这种会预判的电脑时的惊讶,并激起其挑战欲望。
当然,预判总会有失策的时候,人类有时不也是如此,比如有些玩家不去找医疗包,或者摸清AI的习惯(只会埋伏最近那个医疗点)等情况,那么就提醒你,不能所有AI都是具有同样的预判思想(可以通过AI个性来生成不同思考方式的AI),甚至就如一个玩笑:我预判到你预判到我会预判,于是我不预判了。没有预判的AI也许就是具有最强预判性的AI呢?滑稽.jpg
5 AI的智能等级
正如一本书中写道:老谋深算的AI应该跟它的寿命成正比。倘若设计一个采用了前沿技术,具有复杂思考系统的AI,但如果它在游戏中仅仅被期望活几秒钟的话,那将毫无意义。
而且AI的智能程度也需要与其设计的角色的智能等级相匹配。比如说一个战争策略游戏里,不同的士兵有不同的军衔,比如 上尉、中尉、少尉 等,越高军衔的军官一般会有越高的智能等级,所以需要相应地提高其智能程度,比如加入较为复杂的战略决策。
而拿简单的举例:假如你在游戏里潜行时不小心发出声响,那么普通守卫只是过来看了看周围,没发现什么人就又回到原来的岗位,而精英守卫就可以加入更为精明或谨慎的行为:先往发出声响的地方(如草场)扫射一下,若没发现异常才将状态改为正常守卫,返回其守卫处,或者加入杀个回马枪的决策。这些有趣的谨慎行为也会让玩家更不敢把AI当成是傻瓜,甚至感受到乐趣。不过还是记住设计AI的原则,不要让AI过于谨慎导致玩家丧失乐趣。
虽然追求AI能给人带来真实感,但玩家其实也有一定的宽容能力,具有瑕疵的AI他们也会自行脑补:毕竟它终究是个AI。所以不必过分追求真实,又不能轻视AI真实感对于游戏体验的提升的重要性,还是牢记最重要的一点,也是追求AI的真实感的唯一目的:让游戏更有趣!
参考学习自《游戏人工智能编程案例精粹》《游戏人工智能》
转载标明出处:作者AMzz 博客: https://www.cnblogs.com/AMzz/
AI的真实感的更多相关文章
- AI:从游戏引擎--到AI
原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...
- AI资源对接需求汇总:第3期
更好的阅读体验,请查看首发原文链接:AI资源对接需求汇总:第3期 平台介绍 平台由人工智能领域几个知名原创公众号发起,总读者约25万. 主要面向人工智能领域的从业者,涵盖图像处理.三维计算机视觉.机器 ...
- Hugging Face发布diffuser模型AI绘画库初尝鲜!
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...
- 马里奥AI实现方式探索 ——神经网络+增强学习
[TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
- AI人工智能系列随笔
初探 AI人工智能系列随笔:syntaxnet 初探(1)
- 游戏AI系列内容 咋样才能做个有意思的AI呢
游戏AI系列内容 咋样才能做个有意思的AI呢 写在前面的话 怪物AI怎么才能做的比较有意思.其实这个命题有点大,我作为一个仅仅进入游戏行业两年接触怪物AI还不到一年的程序员来说,来谈这个话题,我想我是 ...
- MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
[转自网络]https://my.oschina.net/cers/blog/292191 PK Belongs to primary key 作为主键 NN Not Null 非空 UQ Uniqu ...
- 【AI开发第一步】微软认知服务API应用
目录 介绍 API分类 使用‘视觉’API完成的Demo 点击直接看干货 介绍 从3月份Google家的阿尔法狗打败韩国围棋冠军选手李世石,到之后微软Build2016大会宣布的“智能机器人”战略.种 ...
随机推荐
- SLAM中的卡方分布
视觉slam中相邻帧特征点匹配时,动辄上千个特征点,匹配错误的是难免的,而误匹配势必会对位姿精度以及建图精度造成影响,那么如何分辨哪些是误匹配的点对儿呢?如果已知两帧的的单应矩阵,假设单应矩阵是没有误 ...
- Java中的接口(什么是接口,接口的好处,具体的使用)
1.什么是接口? 官方概述: 在java语言中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. 这种技术主要用来描述类具有什么功能,而并不给出每个类的具体实现. Bala ...
- Python多线程多进程那些事儿看这篇就够了~~
自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...
- WeCenter3.1.7 blind xxe 分析
xxe漏洞危害大,可以查看任意文件,执行系统命令,进行ddos等,但是本次漏洞有一条件,需要后台登录,所以危害降低了,下面是详细分析 在models/weixin.php public functio ...
- 套壳浏览器与Chrome浏览器之间的差别
之前QQ浏览器一直是我前端调试工具的主力,因为它是一个套壳浏览器,所以它的兼容模式(谷歌Chrome内核)和极速模式(IE浏览器内核)简直是调试兼容性的神器,可以直接切换,不用再反复打开Chrome和 ...
- libevent::事件::定时器
#include <cstdio> #include <errno.h> #include <sys/types.h> #include <event.h&g ...
- python编程系列---args与kwargs详解
args与kwargs详解 """ Process([group [, target [, name [, args [, kwargs]]]]]) - target:目 ...
- 百万年薪python之路 -- 面向对象初始
面向对象初始 1.1 面向过程编程vs函数式编程 函数编程较之面向过程编程最明显的两个特点: 1,减少代码的重用性. 2,增强代码的可读性. 1.2 函数式编程vs面向对象编程 面向对象编程:是一类相 ...
- 课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类
异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象.例如:数组越界和被0除. 代码验证: package test ...
- Swagger解决你手写API接口文档的痛
首先,老规矩,我们在接触新事物的时候, 要对之前学习和了解过的东西做一个总结. 01 痛 苦 不做.不行 之前,前后端分离的系统由前端和后端不同的编写,我们苦逼的后端工程师会把自己已经写完的A ...