找回密码
 点一下
查看: 2411|回复: 6

浅述3C地图AI的简单实现

  [复制链接]
发表于 2007-5-1 13:00:40 | 显示全部楼层 |阅读模式
经过一番大费周章

终于重现了《大众软件》2004年的一篇连载,讲述3c的T版简易AI的制作过程

虽说是T版的,但是毕竟是AI,简易有一定基础的weer观看学习

初学者切忌:操之过急,毕竟,心急吃不了热豆腐

不过由于截图都为英文触发器,好在有比较详细的注解

估计也难不倒有一定基础的人。
浅述TFT3C地图AI的简单实现

文章作者:北京 小狗变飞龙
文章来源:大众软件

    编者按:最近,最火的TFT地图毫无疑问就是3C了,尽管这仅仅是一张玩家自创地图,但是从其地图设计、英雄设定、战术配合等方面来看,几乎可以单独作为一款游戏存在了。本期开始为大家讲解一下怎样自己动手修改3C地图的AI,怎样创造出一张带有个人风格的3C地图。记住,最大的乐趣来自于DIY!

一、前言

3 Corridors,直译就是3条走廊,简称3C,是一种英雄互相PK,讲究战术与配合的魔兽RPG地图,所以3C看作是Command Conquest Combat的缩写也无大碍。不过,今天我们讨论的既不是3C地图的制作,也不是3C的战术及技巧,而是要说一说3C地图AI的简单实现方法,这样即使不能上网或是水平较低,也可以和电脑打打热身,熟悉一下操作、技能和英雄,提高自己的水平,等到上网实战也会打得更加出色。 由于魔兽地图编辑器自带的AI编辑器只能用于对战地图(Melee Map),所以3C地图的AI就要全靠触发器来实现,这就需要玩家有一些Trigger(触发器)编辑基础,不过不会也没关系,只要能耐下心一步步按下边的过程去制作,相信你一定也会做出一个令人满意的AI。同时这也是一个学习与熟练的过程,借此提高触发器的编辑水平,以此为门槛做出具有自己风格的AI,甚至高水平的RPG地图。由于时间紧,加之笔者对触发器的理解有限,本次介绍的AI还比较原始且没有优化,很多地方缺少反复测试,可能会存在不少Bug、漏洞或逻辑错误,还望广大读者见谅,并多多提出宝贵意见和建议。本文旨在抛砖引玉,望高手多写些好文发表以提高国内地图编辑的整体水平。
需要说明的是,笔者所用版本号为1.14。

二、地图背景

本次讲解所用的地图是从浩方上随便下的,26个英雄,光明黑暗各13个,可以随机本方英雄,50级封顶,不能转职,3条通道在中间互通且有商店。笔者在 这个基础上删去了中间的商店,删去了高低经验、共享物品的选择,改成默认高经验、不共享物品,又加上了是否可选对方英雄、是否强制随机英雄的选项,这些功 能的具体修改制作过程不再赘述。

410387039802.jpg

如果未加说明,玩家一律指由人控制的单位,电脑玩家则一律指由电脑AI控制的单位。

三、AI制作

1.一些基本概念

①如何增加触发器组、触发器?切到触发器Editor窗口,单击New,选择Category即新增一个触发器组,选中这个新建的组,单击右键,选择New触发器即可新建一个触发器。

② 触发器的组成。一个触发器分成3部分:Events(事件)、Conditions(条件)、Actions(动作)。举个例子,你按下电灯开关键是个事 件,条件是有电,动作就是灯亮了。事件是触发动作的原因,条件是动作的约束,大概理解成“因为……而且……所以……”就可以了。

③如何增加一个变量?切到触发器Editor窗口,单击Edit菜单,选择最后一个Variables(变量),在弹出的窗口中单击Edit,选择New Variable即可。变量就是临时存储数据或数组的地方,在AI控制中要用到的变量很多。同时变量也是比较容易出错的地方,很多逻辑错误都源于缺少变量或变量重叠。举例来说,A包含在甲和乙变量里,当你命令甲变量去做一件事的同时命令乙变量去做另一件事,恐怕A就不知道该干嘛了。

410387039803.jpg

④ 区域(Rect)。切到编辑器主窗口,单击Layer,选择Rect,你就可以在地图上看到一块浅蓝的四边形区域。区域经常用于Events的判定,比如 某个单位进入某个区域,然后怎样,也用于在这个区域上的单位统计,比如某个区域上有多少单位等。同变量一样,区域重叠或混乱很容易造成逻辑错误或死循环, 要谨慎使用。在主窗口单击Window,选择New Palette→Rects,就可以在地图上创建一个区域了。按一下空格键取消区域创建,双击创建好的区域可改名字。

⑤其他。触发器里的各种语句都可以通过Ctrl+C、Ctrl+V、Ctrl+X进行复制、粘贴、剪切等操作,当然,事件语句只能被粘贴到事件类别下,其他亦然。Shift连选,Ctrl单选,其操作与Windows的一些基本操作别无一二。

2.前期准备与英雄选择

如果你加上电脑,在没有AI的情况下,电脑控制的白羊或黑猪(玩家选择英雄的单位)只会呆呆地站在那里,所以启动AI的第一步就是让触发器替电脑选择英雄。由于电脑谈不上喜欢不喜欢、熟悉不熟悉哪个英雄,全部随机,所以只要让触发器模拟进入随机选择的区域选出英雄即可。

在本例中,首先设置两个Boolean(布尔,即真与假)型变量:AllowChange和AllowFree。如果玩家选择了只能随机选择英雄,即 AllowFree=False,将所有与Player6(光明城堡方)同盟的玩家Move(移动)到光明随机英雄区域,与Player12(黑暗城堡 方)同盟的玩家Move到黑暗随机英雄区域,剩下的让原地图自带的英雄随机选择触发器去干。这个选择最简单,不用增加任何触发器即可选出英雄。新建一个触 发器组AI,在这个组下新建一个触发器SelectHero。如果AllowFree=True,即可以自己选择英雄,就跳转执行SelectHero这个触发器,这样做的目的主要是为了区别原地图触发器和后添加的AI触发器,方便以后修改(在跳转前要延时10秒,主要是给玩家以选择自己熟悉或喜欢的英雄的时间,否则触发器替电脑玩家选英雄可是快得很,将你的英雄抢跑了可别哭喊)。

410387039804.jpg   

在SelectHero触发器中,将所有正在游戏的Player(玩家)加入到一个临时的Player Group(玩家组)中,将这个玩家组中的每个玩家都进行一次条件判断,条件是:这个玩家既不是Player6,也不是Player12,而且这个玩家的 控制者是电脑。

If(假如)这3个条件中有一条不成立,Else(否则)——Do Nothing(什么也不做),这个一般都是真正的玩家,触发器就不管他们了。 假 如这3个条件都成立,Then(那么):新建一个Unit(单位)变量AIUnit,使AIUnit等于这个电脑玩家(设置单位变量=选定玩家的函数只有 两个,即Random Unit From Unit Group和First Unit of Group,而在此处由于选定的玩家只会是一个,所以极端地讲,后者的执行效率要高于前者)。然后新建一个布尔变量:AIinLight,再判断这个电脑 玩家是否与Player6同盟。如果是,让AIinLight=True;如果与Player6为敌,也就是与Player12同盟,让 AIinLight=False。再在AI组下新建一个触发器:RandomAIHero,做完AIinLight变量的判定后跳转执行这个触发器。

410387039805.jpg

在RandomAIHero触发器中,上文还提到一个布尔变量:AllowChange,即是否可选对方英雄,在现在就特指电脑能否随机选到对方的英 雄。假如AllowChange=True,即可选对方英雄,那么建立一个Integer(整数)变量AIRandomHeroID,让这个变量等于1到 26之间的一个随机数(所有英雄)。如果AllowChange=False,即不能互选英雄,那么再看前边的AIinLight变量。如果 AIinLight=True,即玩家在光明一方,那么让AIRandomHeroID等于1到13之间的一个随机数(所有光明英雄);如果 AIinLight=False,那么让AIRandomHeroID等于14到26之间的一个随机数(所有黑暗英雄)。 为了防止发生重复选择英 雄的错误,这里还要加一个判定。在原地图中为每个英雄的选择都设置了一个加Array(角标,1~26)的布尔变量Occupy,一旦这个英雄被选择了, 这个变量就为True,否则为False,所以要先检查这个变量。如果这个变量为False,即此英雄还没被选择,那么可以进行选择英雄;否则重新启动本 触发器,再次随机出一个数字,直到随机出的数字所代表的英雄没被选择过。

410387039806.jpg

一切顺利,随机出来的数字所代表的英雄没被选择,那么根据这个数字把AIUnit(也就是电脑玩家)移动到与数字相对应的英雄选择区域中,然后就是原地图英雄生成触发器该做的事了。 至 此,用触发器模拟玩家选择英雄的过程全部结束。简化这个过程来说,那就是:如果必须随机,那就把电脑放到随机区域。如果可选择,那就根据条件出随机数把电 脑放到相应英雄选择区域。如果可互选英雄,则随机数是1到26;如果不可互选,则随机数是1到13或14到26。如果你要根据实际地图情况做的话,注意千 万要有英雄是否被选择的判定,否则很可能出现选择单位没了英雄也没出来的尴尬局面。

3.英雄配置

在原地图里有Hero Selection Light和Hero Selection Dark两个触发器组,分别用来执行光明与黑暗英雄的创建步骤。每个组里各有13个触发器,每个对应一名英雄。单击光明组里的第一个触发器,事件是——一 个单位进入1号英雄选择区域,条件是——这个单位是光明选择单位或黑暗选择单位(因为可以互选英雄),动作的大意是——假如是光明选择单位,创建一个圣骑 士到GoodPlace(区域)。这里要新建一个Unit Group(单位组)变量LightGroup,将最后创建的单位(也就是圣骑士)加入到这个组中。假如是黑暗选择单位,创建一个圣骑士到 BadPlace(区域),再新建一个单位组变量DarkGroup,将最后创建的单位加入到这个组中。然后判断这个单位的控制属性,如果控制者是 User(玩家),那么新建一个单位组变量UserGroup,将最后创建的单位加入这个单位组中,否则,也就是控制者是电脑,那么把最后创建的单位加入 新建的一个单位组变量ComputerGroup中。然后按这个过程把其他的25个英雄也依次做一遍。这么做的主要目的是将光明、黑暗、玩家、电脑玩家分 别加入相应的4个单位组中,以方便将来的控制和使用。 另外,如果是玩家,你还可以给他几件初始装备或物品,本例只给了重生架和一瓶生命水。电脑玩家当然也要给,但考虑到可能经常会对电脑拥有的物品进行调试或更改,所以不宜把给电脑物品的触发器也做到里边来,否则一旦改动就要改26次,累也累死了。在AI组下新建一个触发器——HeroItem,在将电脑玩家加入ComputerGroup单位组后跳转执行HeroItem,这样有什么改动只需在HeroItem里改一次即可。

410387039807.jpg

在HeroItem触发器中,由于3C地图分光明和黑暗两方,所以注定会有两种回城轴。光明用黑暗方的回城轴就会跑到敌人的重生点 (BadPlace),反过来就回到光明的重生点(GoodPlace)。所以在游戏中也不要做这样的傻事:仗着闪避或无敌跑到敌人家里买个回城轴想溜回 城——那只会让你死得更快,其他的物品和装备黑暗和光明是没有区别的。有鉴于此,在给电脑玩家的物品时也要区别对待,首先判断最后一个创建的单位是否在 LightGroup里。如果在的话,再看看这个单位的Melee AI(战斗AI),也就是你在创建游戏时选择电脑对手的AI水 平——Easy(简单的)、Normal(中等的)、Insane(疯狂的),对应3种不同难度各给予不同的物品,只是要注意分清回城轴的区别。这里建议 两种回城轴分别起两个名字,像本例,男厕手纸和女厕手纸,简单又好记……为了以后制作购物触发器的简单,这里给的物品多是“不动产”,只有治疗守卫、重生 架和回城轴属于易耗品,而且一次给齐,省得以后还要判断环境买物品。如果你以后搞清了AI购物部分,自己再尝试着添加,制作出复杂的购物触发器,目前就只有让电脑作弊了。如果你以后还需要对不同的电脑AI制 作不同的战略战术,那么在这里最好新建6个单位组变量:LightLowAIGroup、LightNormalAIGroup、 LightHighAIGroup、DarkLowAIGroup、DarkNormalAIGroup、DarkHighAIGroup。将光明与黑暗 各3种不同的AI加入这6个组里,用不上也没什么,要是用得上也很方便。

410387039808.jpg    

(全文结束)
发表于 2007-5-1 14:02:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-5-3 16:49:17 | 显示全部楼层
恩 人 哪 !!
回复

使用道具 举报

发表于 2007-5-3 18:33:33 | 显示全部楼层
这个……很多年前的杂志上看过耶……
回复

使用道具 举报

 楼主| 发表于 2007-5-5 01:26:43 | 显示全部楼层
俺很辛苦的从04年的杂志里掏出来的

可以这是上,下也完成了

愣是中没影
回复

使用道具 举报

发表于 2007-5-5 07:53:29 | 显示全部楼层
呃。这就素传说中的有头有尾。。
回复

使用道具 举报

发表于 2007-5-10 03:04:48 | 显示全部楼层
好强大啊 [s:40]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 10:25 , Processed in 0.055767 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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