• QQ21031394

    工作时间

    周一至周五:9:30-18:30

    周末及节日:根据情况调休

  • 手机版二维码

    随时手机查素材

  • 扫描二维码

    加入官方QQ群

站长推荐
晴天之铭_UEI69 一级会员
  • 未知地域
  • 19发帖数
  • 2主题数
  • 0关注数
  • 1粉丝

[演示和教程] 魔兽争霸战役AI简单教程

[复制链接]
晴天之铭_UEI69 发表于 2024-1-3 15:05:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题 <
提莫作坊QQ群:提莫作坊www.tbwlm.cn

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 晴天之铭_UEI69 于 2024-1-10 09:59 编辑

战役AI是一个非常简单、好做、好用的AI,今天手把手教大家怎么做战役AI。
1、首先下载vscode
https://segmentfault.com/a/1190000017464740
这是vscode设置中文的教程链接


2、安装好vscode,并且设置好中文后。下载jass扩展。
`)~EVLU757`6PS[K6@SASFJ_tmb.jpg
这是vscode下载扩展的方式,点击左边的方框,再搜jass。



3、现在可以开始制作战役AI了,随便创建一个记事本,把后缀改成ai格式。

pic01.jpg
注意AI命名必须要用英文,不能用中文,首字母是英文后面接上数字。
pic02.jpg
4、敲出函数结构,没有接触过jass的萌新可以理解成触发器,当成没有事件的触发器,里面是写动作的。
这么理解就行了,虽然不是一个东西。
h01.jpg
这里是函数名,改成main,理解成触发器改名字就行了。
h02.jpg

5、我们编辑器打开物编,按Ctrl+d,可以看单位id字符串
h03.jpg

看见这个人族农场了吗?hhou,这个单位id,这是ai识别地图上面单位类型的名称,可以理解成单位真名,单位你叫啥名字都无所谓,ai不看那个,ai只看你真名。
h04.jpg


这里强调一遍,有ai脚本的地图,所有建筑必须要有路径纹理,路径纹理是建筑物占地体积。

大家想必都知道,建筑物的碰撞体积是没有意义的, 建筑占地只能看路径纹理。

如果有建筑没有路径纹理,AI寻路一旦遇到没有路径纹理的建筑,地图就会崩溃。

6、这是战役AI的脑子,这个动作,这里是写AI人口房子。AI如果是兽族,就写兽族的房子。
反正你农民可以造什么加人口,就写什么房子。
右边写null,右边是涉及AI英雄学习技能的,对于萌新来说有点复杂,这里不讲。
h07.jpg
  1. //主函数
  2. function main takes nothing returns nothing
  3.     //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
  4.     //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
  5.     call CampaignAI('hhou',null)
复制代码




按tab,可以对齐空格。
h08.jpg
  1. //主函数
  2. function main takes nothing returns nothing
  3.     //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
  4.     //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
  5.     call CampaignAI('hhou',null)
  6.     //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
  7.     //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
  8.     //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
  9.     call SetReplacements(2,4,6)
  10.     //开启替换守卫,如果输入的是false那么不会替换
  11.     call GroupTimedLife(true)
  12. endfunction
复制代码




7、这些是暴雪给我们准备好的AI函数,直接输入启动,AI就会附带这些功能,它们本身运行原理萌新没必要去考虑。
h09.png
  1. //主函数
  2. function main takes nothing returns nothing
  3.     //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
  4.     //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
  5.     call CampaignAI('hhou',null)
  6.     //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
  7.     //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
  8.     //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
  9.     call SetReplacements(2,4,6)
  10.     //开启替换守卫,如果输入的是false那么不会替换
  11.     call GroupTimedLife(true)
  12.     //AI初始化
  13.     //是否保护玩家
  14.     call SetDefendPlayer( false )
  15.     //设置随机路径
  16.     call SetRandomPaths( false )
  17.     //维修建筑
  18.     call SetPeonsRepair( true )
  19.     //英雄路过商店购买基础物品,比如血瓶,回程卷轴
  20.     call SetHeroesBuyItems( false )
  21.     //AI不对玩家放水。放水意思大概是AI像老年人一样,等你造好兵慢吞吞来
  22.     //写false就是放水
  23.     call SetWatchMegaTargets( true )
  24.     //AI基地没了可以在另一个矿开基地
  25.     call SetCaptainChanges( false )
  26. endfunction
复制代码



设置工人采集数量,这两个变量,common.ai库里面已经定义好了,我们直接调用就行了。
65)N85`93ZZROO8~1FKR~QL_tmb.jpg

8、训练单位,比如说,我们演示图的人族对吧,那肯定要出人族农民,人族农民的字符串是hpea。
A31H}U`UKKDMA8L)($CCJ1R_tmb.jpg
I}_)9ZR)]H3_{JI6L698PPK_tmb.jpg
这是AI身体部分的开始,AI检查自己身体,会不停从上,往下检查,所以AI最开始检查自己农民就没错,数量不够8个AI会自己出8个。
当然我们可以写成468,AI根据当前什么难度检查自己应该有多少个这个单位的数量。这个难度是战役难度那个,触发器可以设置。

括号内的空格不影响什么,但是也没有存在的必要,我们可以写的紧凑一点。
4[~VU5@%ZU(CTE`OIQLI1AT_tmb.jpg
53NNILW9GZPWFN$GV4~LI_tmb.jpg

好了,我们把身体写好,把基础建筑写好,有铁匠铺,我们肯定要让AI研究一下科技对吧?
I19%{BEB1)5B)FX1}KLW6C4_tmb.jpg
PEWDW_57F2D0URDQ4XPU`PM_tmb.jpg

9、防守兵力,好了,现在我们身体也完成了。可以捏手了。
防御自己基地的,就是出兵防御
  1.     //铁剑术
  2.     call SetBuildUpgrEx( 3,3,3,'Rhme')
  3.     //出6个步兵防御
  4.     call CampaignDefenderEx(6,6,6,'hfoo')
  5.     //出6个火枪手防御
  6.     call CampaignDefenderEx(6,6,6,'hrif')
复制代码



战役AI会忽视地图上面摆放的单位,新训练单位来防御和进攻。
也就是说,你开始给战役AI放6个步兵在地图上不算,它要自己造6个步兵派去防守或者进攻,所以地图上初始单位可以供给AI防守,AI不会派这些兵去进攻的。

10、进攻兵力,防守写好了,我们来写第一波进攻。
注意这个Player(2)是指玩家3,玩家1是Player(0),玩家id-1
  1. call SetBuildUpgrEx( 3,3,3,'Rhme')
  2.     //出6个步兵防御
  3.     call CampaignDefenderEx(6,6,6,'hfoo')
  4.     //出6个火枪手防御
  5.     call CampaignDefenderEx(6,6,6,'hrif')
  6.     //进攻组
  7.     //===============第一波进攻=====================
  8.     //进攻初始化,让AI大脑动起来,去喊人去打人
  9.     call InitAssaultGroup()
  10.     //从防守组中抽3个步兵去打人
  11.     call CampaignAttackerEx(3,3,3, 'hfoo')
  12.     //从防守组中抽3个火枪手去打人
  13.     call CampaignAttackerEx(3,3,3, 'hrif')
  14.     //多少秒后打,打谁?
  15.     //3秒后,打玩家3
  16.     //这些兵是不会回来的,一路走好
  17.     call SuicideOnPlayerEx(3,3,3,Player(2))
复制代码




第一波进攻我们就写好了,我们写第二波进攻。
  1. //多少秒后打,打谁?
  2.     //3秒后,打玩家3
  3.     //这些兵是不会回来的,一路走好
  4.     call SuicideOnPlayerEx(3,3,3,Player(2))
  5.     //===============第二波进攻=====================
  6.     //进攻初始化,让AI大脑动起来,去喊人去打人
  7.     call InitAssaultGroup()
  8.     //从防守组中抽6个步兵去打人
  9.     call CampaignAttackerEx(6,6,6, 'hfoo')
  10.     //从防守组中抽4个火枪手去打人
  11.     call CampaignAttackerEx(4,4,4, 'hrif')
  12.     //多少秒后打,打谁?
  13.     //10秒后,打玩家4
  14.     //这些兵是不会回来的,一路走好
  15.     call SuicideOnPlayerEx(10,10,10,Player(3))
复制代码




我们可以一直续下去,但是我累了,所以用loop,让它无限循环。
  1. //开始无限循环重复动作
  2.     loop
  3.         //===============第n波进攻=====================
  4.         //进攻初始化,让AI大脑动起来,去喊人去打人
  5.         call InitAssaultGroup()
  6.         //从防守组中抽6个步兵去打人
  7.         call CampaignAttackerEx(6,6,6, 'hfoo')
  8.         //从防守组中抽4个火枪手去打人
  9.         call CampaignAttackerEx(4,4,4, 'hrif')
  10.         //多少秒后打,打谁?
  11.         //70秒后,打玩家3
  12.         //这些兵是不会回来的,一路走好
  13.         call SuicideOnPlayerEx(70,70,70,Player(2))
  14.     endloop
复制代码




好了,一个人族的战役AI制作完毕。

我们创建一个演示图,运行演示一下。
空白图设置
3)X)@[TI6B}(]D7JCR`8I99_tmb.jpg
设置好一个队友,和一个敌人。

1个基地5个农民,触发两个触发。
N7]_N4CB3P6EGQ8V32((L_tmb.jpg
OY{M]EHSUT@{Y4QF705ST)Y_tmb.jpg
我们导入地图运行

I{~P}0LF_LAK9S@}M]AWKQ9_tmb.jpg
[OD~~EZXKVT{`V3IEFZK7`N_tmb.jpg

最终效果:
T3F3S5HT9SYH4G2B8H35R%7_tmb.jpg


下面给出全部代码和附件

testb.zip (1.86 KB, 下载次数: 4)
  1. //主函数
  2. function main takes nothing returns nothing
  3.     //战役AI核心,传递房子给common.ai内部,它会自动补充人口建筑
  4.     //右边的null,你可以自己写一个AI的英雄学习技能的函数,传递进去
  5.     call CampaignAI('hhou',null)
  6.     //AI有站岗的单位被杀,它会再训练一个单位,去到原本的地方站岗
  7.     //这是它再次训练的次数,3个参数表示1、容易难度2、普通难度3、困难难度
  8.     //我这里的写法意思是,AI在容易难度会补充张岗单位2次,普通难度4次,困难难度6次
  9.     call SetReplacements(2,4,6)
  10.     //开启替换守卫,如果输入的是false那么不会替换
  11.     call GroupTimedLife(true)
  12.     //AI初始化
  13.     //是否保护玩家
  14.     call SetDefendPlayer( false )
  15.     //设置随机路径
  16.     call SetRandomPaths( false )
  17.     //维修建筑
  18.     call SetPeonsRepair( true )
  19.     //英雄路过商店购买基础物品,比如血瓶,回程卷轴
  20.     call SetHeroesBuyItems( false )
  21.     //AI不对玩家放水。放水意思大概是AI像老年人一样,等你造好兵慢吞吞来
  22.     //写false就是放水
  23.     call SetWatchMegaTargets( true )
  24.     //AI基地没了可以在另一个矿开基地
  25.     call SetCaptainChanges( false )
  26.     //设置资源采集工人
  27.     set campaign_wood_peons = 3
  28.     set campaign_gold_peons = 5
  29.     //训练农民
  30.     //AI会自己遍历搜索所有建筑,能够训练这个单位id的建筑,进行训练
  31.     //3个数字同意代表战役3个难度,容易、普通、困难
  32.     //不同难度出不同数量的农民,出不同数量的兵
  33.     call SetBuildUnitEx(8,8,8,'hpea')
  34.     //城镇大厅
  35.     //如果升本就按照格式,写下一本的建筑
  36.     //关于自定义建筑,会出现升级二本后,又造一本,
  37.     //因为AI识别等价物不对,把二本和一本判断成两个建筑
  38.     call SetBuildUnitEx(1,1,1,'htow')
  39.     //兵营
  40.     call SetBuildUnitEx(2,2,2,'hbar')
  41.     //伐木场
  42.     call SetBuildUnitEx(1,1,1,'hlum')
  43.     //铁匠铺
  44.     call SetBuildUnitEx(1,1,1,'hbla')
  45.     //升级二本
  46.     call SetBuildUnitEx(1,1,1,'hkee')
  47.     //科技研究
  48.     //铁甲
  49.     call SetBuildUpgrEx( 3,3,3,'Rhar')
  50.     //铁剑术
  51.     call SetBuildUpgrEx( 3,3,3,'Rhme')
  52.     //出6个步兵防御
  53.     call CampaignDefenderEx(6,6,6,'hfoo')
  54.     //出6个火枪手防御
  55.     call CampaignDefenderEx(6,6,6,'hrif')
  56.     //进攻组
  57.     //等待地图触发器那边发送进攻允许指令
  58.     //call WaitForSignal()
  59.     //===============第一波进攻=====================
  60.     //进攻初始化,让AI大脑动起来,去喊人去打人
  61.     call InitAssaultGroup()
  62.     //从防守组中抽3个步兵去打人
  63.     call CampaignAttackerEx(3,3,3, 'hfoo')
  64.     //从防守组中抽3个火枪手去打人
  65.     call CampaignAttackerEx(3,3,3, 'hrif')
  66.     //多少秒后打,打谁?
  67.     //3秒后,打玩家3
  68.     //这些兵是不会回来的,一路走好
  69.     call SuicideOnPlayerEx(3,3,3,Player(2))
  70.     //===============第二波进攻=====================
  71.     //进攻初始化,让AI大脑动起来,去喊人去打人
  72.     call InitAssaultGroup()
  73.     //从防守组中抽6个步兵去打人
  74.     call CampaignAttackerEx(6,6,6, 'hfoo')
  75.     //从防守组中抽4个火枪手去打人
  76.     call CampaignAttackerEx(4,4,4, 'hrif')
  77.     //多少秒后打,打谁?
  78.     //10秒后,打玩家4
  79.     //这些兵是不会回来的,一路走好
  80.     call SuicideOnPlayerEx(10,10,10,Player(3))
  81.     //开始无限循环重复动作
  82.     loop
  83.         //===============第n波进攻=====================
  84.         //进攻初始化,让AI大脑动起来,去喊人去打人
  85.         call InitAssaultGroup()
  86.         //从防守组中抽6个步兵去打人
  87.         call CampaignAttackerEx(6,6,6, 'hfoo')
  88.         //从防守组中抽4个火枪手去打人
  89.         call CampaignAttackerEx(4,4,4, 'hrif')
  90.         //多少秒后打,打谁?
  91.         //70秒后,打玩家3
  92.         //这些兵是不会回来的,一路走好
  93.         call SuicideOnPlayerEx(70,70,70,Player(2))
  94.     endloop
  95. endfunction
复制代码


2024年1月10日内有错误已经更正,训练农民那个我写成兽族的opeo,现在已经修正回为人族的hpea。







更多图片 小图 大图
组图打开中,请稍候......
楼主热帖
免责条款:本站仅提供学习的平台,所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,并不承担任何法律责任,如果对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。

本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

本网站所提供的信息,只供参考之用。本网站不保证信息的准确性、有效性、及时性和完整性。本网站及其雇员一概毋须以任何方式就任何信息传递或传送的失误、不准确或错误,对用户或任何其他人士负任何直接或间接责任。在法律允许的范围内,本网站在此声明,不承担用户或任何人士就使用或未能使用本网站所提供的信息或任何链接所引致的任何直接、间接、附带、从属、特殊、惩罚性或惩戒性的损害赔偿。

精彩评论2

Patient 发表于 2024-1-5 00:18:45 | 显示全部楼层 <
谢谢晴天哥啦
双生暗影 发表于 2024-1-5 12:52:01 | 显示全部楼层 <
感谢大佬的教程

强调下版规的规定,如有恶意灌水从重处罚:
=====发表主题规则=======
1.主题内容请一定要附带预览图片,谢谢;
2.搬运来的东西请尽量不要卖钱!;
3.发帖有任何疑问请联系QQ21031394;
=====发表回复规则=======
1.禁止直接复制标题内容的;
2.禁止纯数字或者纯字母的;
3.禁止乱打一通文不对题;
4.禁止屠版和刷分行为;
第一次扣分处理,第二次扣分+警告,警告三次禁言三天,绝不手软,情况严重的直接封号,请大家珍惜自己的账号!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

猜你喜欢
天工维度唯一QQ群
786014245

欢迎进群交流,入群答案:编辑器

  • 官方在线客服

    QQ客服:小雪

    点击交谈

    QQ客服:砂糖

    点击交谈

    团队老大:荀公子

    商务合作
  • 上海市静安区共和新路4718号宏慧新汇园6号楼603室

  • 手机扫码查看手机版

    手机查找资源更方便

  • 扫一扫关注官方微信

    加入官方QQ群

Powered by 天天RPG&DZX3.4 ©2020-2021 Comsenz Inc.提百万设计( 沪ICP备18032615号-1 )营业执照