realwusang
Articles29
Tags9
Categories7
游戏开发中的人工智能part1

游戏开发中的人工智能part1

定性AI

  • 行为或表现是特定的,而且可以预测的,没有不确定性。具体实例可以是简单的追逐算法。比如说塑造一个怪物角色,沿着 XY 坐标轴前进,往某目标点移动,直到该角色的 XY 坐标和目标点的坐标重叠。

    非定性AI

  • 某种程度的不确定性,有点不可预测(不确定到什么程度与人们对所采用的的 AI 的方法的理解的难易程度有关)。具体实例是让非玩家角色学习到适应玩家的作战战术。这样的学习能力可以利用神经网络、贝叶斯技术或遗传算法得到。

  • 非定性技术可以让 NPC 自己学习,并进化出新的行为,比如说突现行为(没有明确指示而出现的行为),让玩家在玩游戏时难以预测,增加游戏可玩性。开发者也无需事先预先所有可能的场景,写下所有明确的行为。

  • 由于无法预测,就很难测试和调试,易出bug(开发者无法预测所有的玩家行动)。

    现有的游戏AI技术

  • 有限状态机

    • 列举出计算机控制的角色的一连串动作或状态,再利用 if-then 条件语句检查各类情况和满足条件,再根据判断结果执行动作或更新角色状态,或者在动作和状态之间做转换。
  • 模糊状态机

    • 不太精确的条件设计规则
  • 路径寻找技巧和A * 算法

  • 人工生命系统

    • 展现出符合人性的行为,突现行为。

几个主流游戏都用了非定性 AI 技术,比如“Creatures”、“Black & White”、“Battlecruiser 3000AD”、“Dirt Track Racing”、“Fields of Battle”以及“Heavy Gear”。这些游戏的成功,重新点燃了人们对“学习”AI 技术的兴趣,诸如决策树、神经网络、遗传算法以及概率方法。

追逐和闪躲

  • 追或逃的决策判断(状态机/神经网络)
  • 开始追或逃
  • 避开障碍物

砖块环境/连续环境

连续环境里 基本追逐代码 if-else
根据猎物的坐标来修改追击者的坐标

移动模式

固定模式的移动:守卫的巡逻、宇宙飞船的降落

制造智能行为的幻觉

  • 标准移动模式
    • 编码过的指令清单或数组,指示计算机控制的角色,在每一轮循环如何移动。double x
    • 事先定义出控制结构体类型的全局数组或者一组数组,以便存储模式数据。
      •  Pattern[x].turnRight=
         Pattern[x].turnLeft=
         ...
         
        1
        2
        3
        4
        5
        6
        7
        8
        x=1,2,3,4...
        索引值递增
        - 常见做法:编写好几个不同模式,存放在不同数组中,然后让计算机随机选取一个模式来使用,或者按照游戏中某些其他决策逻辑来决定。
        - **砖块环境中的移动模式**
        - 用相对坐标,每次初始坐标选为-1
        - 建立起一个模式,比如在坐标(10,3)和(18,3)之间来回走动,此假如为巨人的巡逻状态,若感知到他人靠近则切换到追逐或攻击状态
        - 参考像素rpg中怪物的巡逻,一个区域的怪物有固定的路线
        - 复杂巡逻模式,例:一个由八条线段组成的模式
        entityList[1].BuildPathSegment(x1,y1,a1,b1); entityList[1].BuildPathSegment(x2,y2,a2,b2); ...
  • 加入随机因素的移动模式
    • 检查当前位置周围八个方向,发现其值为1时就把坐标储存到数组中,每个点都检查过后,可以从找到有效点的数组中,随机选取新的坐标点。
    • 注意将之前的坐标排除在外
  • 仿真物理环境中的移动模式
    • 为物理引擎提供控制力信息,才能让计算机控制的载具,可以按照想要的模式实际运行。
    • 每轮仿真运算时,物理引擎会处理这些指令,直到该组指令中指定的条件满足为止。此时,模式数组中的下一组指令就会被选出并执行。这个过程将一直重复,直到模式数组走完或者模式因某种原因而中断为止。
  • 定义模式
    • 方形模式/蛇形模式/任意形状的模式
  • 执行模式
    • 径度单位的角度,乘以180,除以pi,才会得到角度

群聚

A-life算法的实例

  • 基本群聚算法的三个规则
    • 凝聚:每个单位都往其邻近单位的平均位置行动。
    • 对齐:每个单位行动时,都要把自己对齐在其邻近单位的平均方向上。
    • 分割:每个单位行动时,要避免撞上其邻近单位。

从这三条语句可以得知,每个单位都必须有比如运用转向力行进的能力。此外,每个单位都必须得知其局部的周遭情况,必须知道邻近单位在哪里、它们的方向如何以及它们和自身有多接近

如图,弧半径r较大时会让单位看到群体中更多的伙伴,较小时会让群体分裂。
角度theta量定了每个单位的视野范围,决定了队伍的行进方式(一排蚂蚁或几排几列的军队)。

实例

仿真大约20个单位,以群聚的方式移动,避开圆形的物体,群聚中的诸多单位和玩家的互动就是去追玩家

行进模式

以物理机制为基础,把每个单位视为刚体,在单位前方施加转向力;控制好每条规则贡献的转向力,并调整行进模式,以确保每个单位都获得平衡

影响施加的力的两条规则:

  • 避开规则

    为了让单位不要彼此撞上,且根据对齐规则和凝聚规则而靠在一起,此规则贡献的转向力随距离的增大而减小。

  • 对齐规则

    考虑当前单位的当前方向,与其邻近单位间平均方向间的角度。转向力随角度增大而增大。

    邻近单位

凝聚、对齐、分隔三个规则起作用的前提是侦测每个当前单位的邻近单位。邻近单位就是当前单位视野范围内的单位。

  • UpdateSimulation()函数,每次走过游戏循环或仿真运算循环时,就会被调用。更新每个单位的位置并把每个单位画到画面显示缓冲区内。

  • DoUnitAI()函数处理一切和计算机控制单位的移动有关的事。所有群聚规则在此函数内实现。

    • 宽广视野
    • 有限视野
    • 狭窄视野

凝聚

凝聚指的是我们想让所有单位都待在同一个群体中,每个单位都应朝其邻近单位的平均位置前进。

邻近单位平均位置:各个位置的向量总和再除以总邻近单位数。

对齐

对齐的意思是指,我们想让群聚中的所有单位都大致朝相同方向前进。
每个单位在行进时,试着以等同于其邻近单位平均方向的方向来前进。

分隔

每个单位彼此间保持着最小距离,采用分隔手段,让每个单位和其视野内的邻近单位保持某一预定的最小分隔距离。此规则需要逐一检视每个邻近单位,而不是使用平均值。

避开障碍物

提供某种机制,使单位看得到前方的障碍物,再施加适当的转向力,使其能避开路径中的障碍物。

替单位安装虚拟触角,或者使用虚拟体积

跟随领头者

群体移动更有目的性。

根据玩法决定是否有领头者(是否需要分散攻击)。决定领头者后,其他单位采用不同视野使不同队形排成(横、纵队)。

人人都可能是领头者。使用简单的规则,找出谁应该或足以担任领头者。