找回密码
 点一下
查看: 6973|回复: 0

魔兽对战地图高级AI 原理与理论【转】

  [复制链接]
发表于 2009-9-22 13:02:36 | 显示全部楼层 |阅读模式
一般标准对战地图中的AI是暴雪添加的,大家打开 common.ai 这个文件就知道其中的一些情况了,标准对战地图可以通用一个AI是因为标准对战地图的数据是一样的,所以AI可以通用。同理,如果有N多张自定义对战张地图采用的是一套数据,那么AI基本上也是可以通常的。
下面我们来说说如何创建一个完整的高级AI,让电脑也能与玩家进行对战。


一、初始AI数据变量组
初始AI数据是指初始化AI所需要的基本数据,包括:
a)地图中所有将会被用到的单位代码。
说明:这个是必须的,把所有的单位代码加到一个数组中。一般情况下,对战地图所使用的单位不会太多,顶多100多个。
b)地图中所有将会被用到的技能代码。
说明:这个是必须的,将所有的技能代码添加到一个数组中。不过呢,添加之前最好按单位来加,如果一个单位有五个技能(四个小招一个大招)的话,那么就是说,一个单位要对应五个技能,不足五个的可以随意加(最好是所对应单位技能中的技能代码)。这个将会被做为单位学习技能的数组,介时我会说说怎么让单位学到相应的技能。
c)地图中所有将会被用到的技能的命令ID。
说明:同上,这个是单位发动技能的命令,也添加到数组中,和技能一一对应。一个个的写好。
d)地图中所有将会被用到的技能的命令类型。
说明:命令类型是指技能的目标类型。“无目标”,如流星雨,雷庭一击,变身之类的;“范围目标”,如暴风雪、烈焰风暴等等;“点 - 单位目标”,如冲击波、恐吓等等;“单位目标”,如风暴之锤,神圣之光等等。这些可以用整数来表示,比如无目标的命令为1,范围目标的命令为2等等,依此类推。
e)地图中所有将会被用到的物品代码类型。
说明:同技能一样,不过要按物品的分类进行保存,最好每一组物品的个数都一样,比如从1-99是武器、100-199是防具依此类推等等,注意回复生命、回复魔法的要做专门的标记。
f)地图中所有将会被用到的物品指向的技能代码数组下标。
说明:这个也是要用一个数组来保存。如果单位使用物品,则可以发动物品指向的技能。比如让单位使用回血回蓝物品等等的效果,可以通过指向技能实现。

以上是AI执行时需要的基本数据。下面来说说AI的思路与写法。

二、编写AI对游戏环境的判断
让AI对游戏有判断能力,这是必须写的,也是一个高智能化AI所要具备的。
首先,我们要建立一个计时器,每个玩家的都有独立的计时器事件。计时循环时间是1秒。
第二,取电脑AI玩家所要操作的英雄。可以是多英雄,每个英雄都需要进行处理的。
最后,要做以下的事情:
a)AI 对敌我双方的判断
说明:这个是让 AI 选取一定范围内我方或敌方单位。一般是用单位组来解决。把我方的加入单位组A、把敌方的加入单位组B、中立的加入C、中立敌对的加入D。这个是为了让AI有一个明确的目标。
b)AI 对敌我双方的分析
说明:让电脑AI能单位组A、B、C、D进行分析,一般是分析单位组中英雄数量、英雄等级、单位生命、单位魔法、单位距离。为什么要分析这么多呢?就是为了让 AI 进行相应的动作。
c)AI 对异常的处理方法
说明:当电脑AI无法判断情况时,所使用的方法。

说着是有点抽象。不过可以写一个树型表。让大家看看。
计时器开启(1秒)

玩家总程控制触发——事件:计时器到期
条件:AI玩家可执行操作 为 假
动作:
      设定变量:AI玩家可执行操作 为 真 (注:变量名可以自定,这是用来控制AI操作的,至于为什么么要用这个来控制呢?后面会说到的。)
      执行触发:AI玩家取单位组触发

AI玩家取单位组触发——事件:无
条件:AI玩家可执行操作 为 真
动作:
      (注:添加单位前记得要清空以前所添加的单位,进行更新!)
      AI玩家选取所操作英雄附近的我方单位,添加到单位组A。
      AI玩家选取所操作英雄附近的敌方单位,添加到单位组B。
      AI玩家选取所操作英雄附近的中立单位,添加到单位组C。
      AI玩家选取所操作英雄附近的中立敌对单位,添加到单位组D。  
      执行触发:AI玩家分析单位组中的单位触发

AI玩家分析单位组中的单位触发——事件:无
条件:AI玩家可执行操作 为 真
动作:
      (注:添加单位前记得要清空以前所添加的单位,进行更新!)
       AI 玩家取 A组中的英雄单位,加入AH组。
       AI 玩家取 A组中的单位血量低于一定百分比的单位,加入AL组。
       AI 玩家取 A组中的在所操作英雄一定范围内的单位,加入AD组。

       AI 玩家取 B组中的英雄单位,加入BH组。
       AI 玩家取 B组中的单位血量低于一定百分比的单位,加入BL组。
       AI 玩家取 B组中的在所操作英雄一定范围内的单位,加入BD组

      (C、D两组可以视情况来定。)

       执行触发:AI玩家取操作英雄结果(注:上次忘了把这加上了!)

AI玩家取操作英雄结果——事件:无
条件:AI 玩家可执行操作 为 真
        AI 玩家是否正在忙  为 假 (注:这个用来判断AI玩家是不是在执行指令)
动作:
       (具体情况可以看情况来定)
       设定变量: AI玩家英雄是否需要救援 为 假
       设定变量: AI玩家英雄是否需要协助 为 假
       设定变量: AI玩家救援其他玩家       为 假
       设定变量: AI玩家攻击其他玩家       为 假
       设定变量: AI玩家攻击中立单位       为 假
       设定变量: 。。。。。。。。。。
       设定变量: AI玩家指令优先度          为 0
       (第一步:在满足一定条件下,让AI 玩家发出求援指令)
       (具体条件可以自定,比如AI英雄身边有三个单位在围攻,且等级都比自身高,这种情况可以判断为危险,将指令优先度调到100,再设定AI玩家需要救援为真。)
       (第二步:在满足一定条件下,让AI 玩家攻击其他玩家)      
       (第三步:在满足一定条件下,让AI 玩家发出协助指令)
       (第四步:在满足一定条件下,让AI 玩家救援其他玩家)
       (第五步:在满足一定条件下,让AI 玩家是不是可以捡东西、杀中立怪等等。)
       (特别说明:指令优先度是这四步需要判断的,即如果在第一步的情况下,发出救援信号后,设定指令优先度为10——即该AI英雄周围没有太大的危胁,该步的指令优先度肯定是大于0的,然后设定需要救援为真。第二步,判断玩家是不是可以进攻,即AI玩家英雄的单位状态较好,可以攻击其他低危胁玩家,如果该步的指令优先度大于第一步的优先度,设定攻击玩家为真。而在第三步的情况下,我们继续判断玩家是不是需要协助——即该AI英雄周围某个敌方单快死了之类的情况,如果敌方很弱设定指令优先度为50,即敌方比自己弱,但还没有死的情况。这时,第三步的指令优先大于第二步的指令优先,设定 AI 玩家需要救援为假,设定AI玩家需要协助为真。然后判断第四步,判断其他玩家的需要求援指 是否为 真,然后再取其指令优先度进行比较,然后看看是不否大于自己的优先权,有大于的就设定AI玩家救援其他玩家为真。)
      (其实就是,利用指令优先度的情况来判断玩家是不是执行某个特定的步聚)
      (最后就是判断玩家的各项指令是不是为真,然后分支执行相应的触发动作,这里就是详说了,求援的需要对应救援信号,救援指令优先大的话,相信各位不会让AI单位站着不动吧,不逃跑那叫AI吗?同理,可以进攻的单位,也是不可能站着不动的。。。不过呢?如果单位在执行某项指令,记得设定单位正忙为真,免得AI玩家过于频繁地发出指令)

三、编写通用AI指令集
何为通用的AI指令集呢?很简单的,就是让AI玩家发出一个指令,操作英雄到一个地方,这个要配合(二)中所述的环境判断,以达到某项效果。

四、补充:单位对应技能的办法。
假设:一组单位的数量为N,而每个单位都有5个技能,那么技能总数就是5*N。我们把单位的技能按照一定的顺序排列将之添加到一个技能数组。那么技能数组的总量就是5*N。在有具体的单位时,取其代码,并循环算出所有单位数组中的索引位置,通过索引位置来确定单位所对应的技能。

评分

参与人数 1威望 +10 收起 理由
alexries + 10 如果把图片链来就更好了

查看全部评分

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-4 01:22 , Processed in 0.174987 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表