zoukankan      html  css  js  c++  java
  • AI的真实感


    ​ AI的真实感一直是游戏AI程序员追求的目标,如何做出能给玩家真实感,挑战性又不会劝退玩家的AI,既需要AI程序员有一定的程序功底,还需要广泛地阅读和游戏人工智能相关的课题,比如:心理学,生物学,认知科学乃至军事战术等,在你阅读时你会不断迸发出更好的想法;还需要和团队多沟通,无论是程序员还是策划,甚至是老板,他们有时一个好的想法就能为你设计的游戏AI增强真实性。

    请牢记一点:游戏AI的真实感需要服务于游戏本身,其唯一目的是让玩家玩游戏觉得更有趣。

    虽然本篇博客会较少代码讲解,但更多地是希望讲解一些学习AI过程中遇到的或想到的方法,然后可以根据做的游戏的不同将这些想法融入设计的游戏AI里。

    1.让AI"不完美"--估算和假设

    ​ 游戏AI并非越智能越好,因为就算是人类,有时也会犯错,所以为了让游戏AI更真实,有时需要让游戏AI犯错,才会使玩家有更愉快的游戏体验(而不是被电脑打爆)。

    有两种方式诱使AI犯错:

    1. 先使AI“完美”,再让它变傻

    2. 当设计AI使用的算法时,通过假设和估算,允许悄悄混进“错误”。

    ​ 以足球AI为例,前者用一个取值为一个固定大小范围的随机值的变量作为干扰值(随机噪声),使AI每次判断踢球方向时产生小错误;后者是让AI用圆而非椭圆(估算)来描述对手的截球范围,既简化了AI算法,又实现”不完美“。当然,在不同的游戏里如何使AI犯错就得因游戏而论了。

    ​ 而在不少FPS游戏里,在游戏AI第一次射击玩家时让其专门射偏是一个好主意,能提醒玩家有AI的出现,在未受伤前做好准备。尤其在玩家需要探索一间充满敌人的屋子时,给了玩家一个了解基本形势的机会并量力而行,不至于一进门就被集火杀死。

    ​ 射偏还有其他好处:

    1. 比如射偏的是飞行轨迹明显或者会留下痕迹的箭,火箭等,让它故意射偏在玩家的视野范围之内会大大提高游戏的刺激感
    2. 当玩家濒临死亡时,故意让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》(一款即时战略游戏)中,有两个巧妙的作弊:

    1. 在探索地图时,每30秒左右给AI一个随机的机会作弊,如果有机会作弊,就让AI去探索有些好东西的区域,这可以帮助我们避免AI不幸碰巧没找到任何附近的资源的状况发生。
    2. 在一个区域内保持和对手的实力相近,这使得我们能够分配合理的兵力去进攻和防守,以避免兵力部署的徒劳无功。

    ​ 归根结底,当且仅当AI作弊能提高玩家体验时,就应该让AI作弊。但记得一点:让你的AI作弊得不易被发现,否则就是另一种状况了。

    图为《可汗:战争之王2》

    图为《可汗:战争之王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过于谨慎导致玩家丧失乐趣。


    是否需要绝对的真实?

    先来看看两个例子

    1. 如果AI足够聪明,当他遭遇到过一次玩家并进行对战后便能意识到自己没有机会战胜玩家,此时选择一个隐蔽的地方(如房门后)进行埋伏玩家死活不肯主动出击,这样的做法无疑是最明智的。
    2. 如果玩家控制的角色在游戏中受到的伤害达到一定程度,玩家一定会让角色逃离战场或者试图进行恢复,但如果AI这么做,那么玩家就不得不进行追杀,玩家杀死他就十分困难。

    这两种结果就使得游戏要么像一个埋伏式(持久战)的较量,要么像比赛追逐的游戏,两种情况无疑都比较无聊。所以绝对的真实也可能带来游戏有趣性的下降。

    ​ 虽然追求AI能给人带来真实感,但玩家其实也有一定的宽容能力,具有瑕疵的AI他们也会自行脑补:毕竟它终究是个AI。所以不必过分追求真实,又不能轻视AI真实感对于游戏体验的提升的重要性,还是牢记最重要的一点,也是追求AI的真实感的唯一目的:让游戏更有趣!

    参考学习自《游戏人工智能编程案例精粹》《游戏人工智能》

    转载标明出处:作者AMzz 博客: https://www.cnblogs.com/AMzz/

  • 相关阅读:
    基本数据类型-(字符串_数字_列表_元组_字典_集合)基本数据类型-(字符串_数字_列表_元组_字典_集合)
    python列表基础操作
    Python字符串基本操作
    字符编码
    python基础-循环
    差分
    第一冲刺阶段(第四天)
    第一冲刺阶段(第三天)
    第一冲刺阶段(第二天)
    第一冲刺阶段(第一天)
  • 原文地址:https://www.cnblogs.com/AMzz/p/11875505.html
Copyright © 2011-2022 走看看