Dota2 AI 开发 (二)定制AI阵容 配置英雄出装

Dota2 AI 开发(一)环境配置 中介绍了如何搭建 Dota2 AI 的开发环境,在这篇文章中,主要介绍Dota2中AI的常规控制方式,并介绍如何在人机比赛中配置一个裸跳刀的Sven。

常用指令

  • 重新加载Lua脚本:dota_bot_reload_scripts
  • 加速游戏:host_timescale 4.0
  • 开启作弊:sv_cheats 1

控制选人

在bots目录下创建一个名为 hero_selection.lua的脚本,在其中输入如下内容:

function Think()

    if ( GetTeam() == TEAM_RADIANT )
    then
        print( "selecting radiant" );
        SelectHero( 0, "npc_dota_hero_antimage" );
        SelectHero( 1, "npc_dota_hero_lina" );
        SelectHero( 2, "npc_dota_hero_sven" );
        SelectHero( 3, "npc_dota_hero_bloodseeker" );
        SelectHero( 4, "npc_dota_hero_crystal_maiden" );
    elseif ( GetTeam() == TEAM_DIRE )
    then
        print( "selecting dire" );
        SelectHero( 5, "npc_dota_hero_drow_ranger" );
        SelectHero( 6, "npc_dota_hero_earthshaker" );
        SelectHero( 7, "npc_dota_hero_juggernaut" );
        SelectHero( 8, "npc_dota_hero_mirana" );
        SelectHero( 9, "npc_dota_hero_nevermore" );
    end

end

这就是自定义的英雄阵容了,己方阵容为:

  • 敌法
  • 火女
  • 斯文
  • 血魔
  • 冰女

敌方为:

  • 小黑
  • 小牛
  • 剑圣
  • 白虎
  • 影魔

阵容当然是可以换的,那么如何知道想要的英雄叫什么呢?

更改为英文

在游戏属性设置>设置启动项中添加 -language english即可将界面改成英文,这样就可以知道所有东西的名称了。

比如在上面的敌方阵营中没有T,我希望把影魔换掉,所以我找到DK,它的名字如下:

所以将上面函数选人的最后一行改为:

SelectHero( 9, "npc_dota_hero_abaddon" );

改好后保存,然后在控制台运行

dota_bot_reload_scripts

然后再次创建房间开游戏,就会发现预选的角色变化了

通过这样的方式,相信大家能找到一个合适的阵容,以提高游戏乐趣。当然这也是制作特定角色AI的基础。

控制购买装备

在 Dota2 ai 中,是可以制定不同英雄的出装套路的。只要按照命名规范创建item_purchase_xxxx.lua即可。不过我发现有的道具名字并不是显示的英文名。例如跳刀明明是:

结果到了配置里就是item_blink,这是怎么回事呢?我查了一下午,终于搞明白其中的缘由了。因为道具名称可能会随着道具描述更改,为了保持底层数据的稳定,官方制定了一个对照表。我在gamepedia上找到了一个版本。 应该是比较全的了,另外这个页面里也有英雄名哦。

我觉得有时候找起来实在是麻烦了,所以会直接通过指令给自己调装备测试,例如我刚刚的跳刀,我可以通过指令来尝试来找到名字,如果装备名正确,自己使用的角色身上就会获得它。

-item item_blink_dagger //wrong
-item item_blink //correct

弄清楚了道具名称,我们就可以开始着手制作自己的AI出装了。这里我以Sven为例。

实现

我希望Sven,买完吃喝之后,裸一个跳刀,然后出相位鞋、连击刀、bkb、撒旦、龙心。首先我先在bots目录下创建一个名为:item_purchase_sven.lua的文件,然后编辑如下内容:

local tableItemsToBuy = {
        "item_tango",
        "item_clarity",
        "item_flask",
        ----------------------
        "item_blink",
        ---------------------
        "item_boots",
        "item_blades_of_attack",
        "item_blades_of_attack",
        ----------------------
        "item_ogre_axe",
        "item_quarterstaff",
        "item_sobi_mask",
        "item_robe",
        ----------------------
        "item_ogre_axe",
        "item_mithril_hammer",
        "item_recipe_black_king_bar",
        -----------------------
        "item_lifesteal",
        "item_mithril_hammer",
        "item_reaver",
        ----------------------
        "item_reaver",
        "item_vitality_booster",
        "item_recipe_heart",
    };

-----------------------------------------------------------------------------

local secretShopThreshold = 100000;
local distanceBuyShop = 500;

function ItemPurchaseThink()

    local npcBot = GetBot();

    if ( #tableItemsToBuy == 0 )
    then
        npcBot:SetNextItemPurchaseValue( 0 );
        return;
    end

    local sNextItem = tableItemsToBuy[1];

    npcBot:SetNextItemPurchaseValue( GetItemCost( sNextItem ) );

    if ( npcBot:GetGold() >= GetItemCost( sNextItem ) )
    then
        if ( IsItemPurchasedFromSecretShop(sNextItem) and
            npcBot:DistanceFromSecretShop() <= secretShopThreshold )
        then
            --print("Money is enough,Will Move to secret shop for: ",sNextItem);
            npcBot.secretShopMode = true;

            local shop_top = Vector(-4600, 1200);
            local shop_bot = Vector(4600,  -1200);

            local dist_top = GetUnitToLocationDistance( npcBot, shop_top );
            local dist_bot = GetUnitToLocationDistance( npcBot, shop_bot );

            if (dist_top < dist_bot) then
                npcBot:Action_MoveToLocation(shop_top);
            else
                npcBot:Action_MoveToLocation(shop_bot);
            end

            if ( npcBot:DistanceFromSecretShop() <= distanceBuyShop )
            then
                print("Will buy at secret shop : ",sNextItem," cost is:",
                    tostring(GetItemCost(sNextItem)));
                npcBot:ActionImmediate_PurchaseItem( sNextItem );
                table.remove( tableItemsToBuy, 1 );
                npcBot.secretShopMode = false;
            end
        else
            print("Money is enough,Will buy: ",sNextItem," cost is:",
                tostring(GetItemCost(sNextItem)));
            npcBot:ActionImmediate_PurchaseItem( sNextItem );
            table.remove( tableItemsToBuy, 1 );
        end
    end

end

-------------------------------------------------------------------------

需要注意的是不能买合成出的装备,需要自己按配方一个个配置。

配好后难道要等AI自己打出那么多钱来测试么?当然不,通过指令

dota_bot_give_gold 1000

来给所以AI加钱,直接就能看到结果。为了调试可以先把出门用的吃喝注释掉,防止占格子位置。

另外这套AI还有些瑕疵。我发现当角色不在神秘商店附近时是不可以买东西的,所以我写了个逻辑:如果需要买神秘商店的装备,就先将角色移动过去,然后再买。逻辑是这样的没错,不过角色移动的表现会比较傻缺。不管不顾的直接走也就罢了,有时候还会摩擦摩擦。搞了一天又累又饿,既然都能用,就先这样吧,以后有时间再优化,或者有大神路过帮忙看看也好。

总结

最后上个效果图

关注我的微信公众号,获取更多优质内容

时间: 2024-10-14 19:37:55

Dota2 AI 开发 (二)定制AI阵容 配置英雄出装的相关文章

AI应用开发实战 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型.我们需要用的一些轮子,已经有人给我们造好了. 就比如: 微软提供的定制化视觉服务. 在机器学习应用中,任何情况下都需要一个或大或小的模型.而怎么得到这个模型是其中最复杂的部分.定制化视觉服务相当于在云端提供了一个生成模型的方法,把模型相关的复杂的算法都简化了.同时,它不仅能够让用户自己管理训练数据,定义自己的分类问题,而且支

游戏开发(三)——WIN32 黑白棋(二)——AI

今天是第二部分:玩家和AI 玩家主要是实现悔棋的功能 AI主要是搜索.最大最小算法,枝剪算法 1.每一步落子的步骤,为了可以悔棋 typedef struct ReversiStep {     ReversiBitBoard m_LastMap;     ReversiStep& operator= (const ReversiStep& temp)     {         m_LastMap = temp.m_LastMap;         return *this;     }

[AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).windows上该环境的搭建 :) 前面三篇博客代码实现均基于该环境(开发或者测试过): [AI开发]Python+Tensorflow打造自己的计算机视觉API服务 [AI开发]基于深度学习的视频多目标跟踪实现 [AI开发]视频多目标跟踪高级版 运行环境 1) centOS 7.5 ,不要安装GUI桌面:

MMORPG大型游戏设计与开发(服务器 AI 控制器)

上一篇我们说了基础接口的组成,想必大家对AI中的基础方法有了一定的了解,而基础接口只能一个通用的,要实现不同的类别还需子类中实现,这就形成了玩家.主动.被动.木桩这些类型.不同类型的AI需要有一个统一的接口来调用与控制,这就是我们今天要进一步了解的AI控制器,试想一下一部机器如果没有控制器会怎样,一个人如果没有大脑又该怎样?这就能充分的体验控制器的重要性了. 游戏截图 控制器 1.初始化(init) 初始化控制器数据,主要是设置AI对象的类型. 2.释放(release) 卸载控制器,清理所有垃

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

移动AI开发生态争夺战|手机AI旅行地图&lt;三&gt;

让我们回想一下那遥远的过去,是什么原因决定了我们抛弃小板砖一样的功能机,选择智能手机的?是因为颜值?交互新鲜感?我相信绝大部分用户,是因为APP模式带来了太多实用价值,身边的人都用上了,自己甚至没法不跟进.所以乔帮主的伟大之处,不仅在于颠覆了手机的形态,更重要的是给未来手机的生态打开了入口.直到今天其能量与想象力也远没有耗竭.等到手机AI时代拉开序幕,这个逻辑似乎依旧通用.毕竟AI算法的特征就是千奇百怪,做什么的都有. 有人用AI做医疗,有人用AI当客服,甚至还有人用AI预测死亡时间,如何把这些

HUAWEI HiAI亮相华为开发者生态大会 助力应用AI开发实现加速度

6月23日,在2018华为终端·全球合作伙伴及开发者大会AI分论坛体验区的一角,被层层叠叠的人群围得水泄不通.站在最前面的一名体验者,正跟随着"快手短视频"APP上不断出现的小人左右扭动,每完成一个动作,就能自动加分!一名来自另一家短视频应用的体验者不禁感叹:没想到快手的动态肢体分割能力这么好,准确度这么高. 而另一侧,体验者将手机里的照片一一选中,通过金山WPS的应用客户端,在几秒中内一键将图片生成了PPT,处理之迅速.功能之强大,让人眼花缭乱. 细究这些应用的"神操作&q

人工智能的春天来了!Tesra超算网络,助力AI开发!

我们必须承认,尽管人工智能技术的起源可以追溯到数十年前,不过受限于软硬件的发展,人工智能直到近几年才开始突飞猛进.其中算力是制约人工智能发展的首要因素,随着算力瓶颈不断被突破,人工智能产业才得以猛烈发展.但是对于许多从事人工智能开发的中小企业和个人来说,算力成本仍然是一个头疼的问题. 租用传统服务器,或者租用云服务,都面临着高额的费用以及不可扩容的问题,以年或者月为单位租用,也将造成大量的资源闲置以及浪费.如何在提高AI开发速度的同时,算力成本也能够大幅度降低,这是众多提供算力服务平台所思考的问

HyperLeger Fabric SDK开发(二)——Fabric SDK配置

HyperLeger Fabric SDK开发(二)--Fabric SDK配置 一.Fabric SDK配置 Fabric区块链网络应用程序需要大量的参数,用于连接Fabric区块链网络.通常将Fabric区块链网络应用程序所需的参数放到一个配置文件进行管理,配置文件定义Fabric SDK Go的配置和用户自定义参数,指定了连接Fabric区块链网络所需的全部信息,例如Fabric区块链网络组件的主机名和端口等.Fabric SDK GO为应用程序提供的配置文件通常使用yaml文件格式编写,