有关为流氓类型的多人在线游戏编写AI的一系列文章。
第一部分
第三部分
在本文的这一部分中,我们将考虑为AI创建逻辑的方法,简要介绍每个守法机器人的目标,并确定编程语言的选择并编写一些代码。

Vindinium游戏世界
为了创建AI,您需要了解游戏世界的结构。
游戏文档的免费翻译内容描述
Vindinium是多人回合制百吉饼。 四个玩家中的每个都有一个可以在地图上移动的英雄。 目标是让玩家在给定的移动次数内收集最大数量的黄金(每个玩家每局进行300次移动,因此整个游戏包括1200次移动)。 玩家必须控制金矿生产黄金; 但是,地雷受到地精的保护。 当玩家击败地精时,他成为地雷的拥有者,每回合获得一枚金币。 此外,地精现在可以保护地雷免受其他玩家的攻击。
英雄可以互相战斗。 战斗中的幸存者获得了对手所有金矿的控制权。 被杀死的英雄立即将所有的金子重生,但是,所有的地雷都移交给了杀手手中。
进入酒馆,英雄们可以购买2单位黄金的啤酒,从而恢复了自己的健康点。
目标是创建一个尽可能合理地玩Vindinium游戏的计算机程序(机器人)。 对于大量的编程语言 ,建议您使用一种入门工具包作为起点。
地图
地图是随机创建的。 地图上的每个游戏对象均使用两个字符进行编码。 地图示例:
+----------------------------------------+ |######$- $-############$- $-######| |###### ## ## ######| |####[] #### #### []####| |## #### ## ## #### ##| |#### $- $- ####| |########## @1 @4 ##########| |############ #### #### ############| |$-##$- ############ $-##$-| | $- $-################$- $- | | ######################## | | ######################## | | $- $-################$- $- | |$-##$- ############ $-##$-| |############ #### #### ############| |########## @2 @3 ##########| |#### $- $- ####| |## #### ## ## #### ##| |####[] #### #### []####| |###### ## ## ######| |######$- $-############$- $-######| +----------------------------------------+
图例
##
-不可抗拒的森林
@1
第一位英雄
[]
-小酒馆
$-
金矿(绘制)
$1
金矿(第一英雄拥有)
生成的地图是对称的,始终包含4个小酒馆和4个英雄。
英雄
英雄每回合可以移动一个格,并具有以下指示符:
- 生命值(HP):每个“新鲜”玩家的初始值均=100。如果HP降至零,英雄将死亡(请参阅“英雄之死”一节)。
- 黄金:从头开始,这是英雄成功的标志。 游戏结束时,将根据英雄的黄金数量对其进行评估。
- 金矿的数量。
行驶方向
该漫游器每转必须发出一个订单。 可能的命令:
( Stay
),
( North
),
( South
),
( East
)或
( West
)。 一旦执行了命令,英雄便会留在原处或在给定方向上移动一个单元。
英雄之举
如果英雄:
- 试图超越地图或穿过树木,什么也没发生。
- 它进入金矿,并留在原地,并且:
- 如果地雷已经属于英雄,则什么也不会发生。
- 如果地雷不是人的土地,也不是另一个英雄,那么就要与守护地雷的地精护卫展开一场战斗。 英雄失去20点生命。 如果他还活着,就去找他。
- 他踩到另一个英雄,他留在原地,什么也没有发生。 英雄之战在回合结束时决定。
- 他进入酒馆,留在原地,命令自己吃饭。 英雄支付2金并恢复50生命。 请注意,生命值不能超过100个单位。
- 他没有在分配给他的时间(1秒)内发送命令,他一直待在比赛结束之前,因此无法发送新命令。 请注意,如果他在比赛结束时拥有比其他玩家更多的金牌,他仍然可以获胜。
转弯结束
英雄移动(或决定保持静止)之后,将发生以下事情:
战役
英雄有点紧张,永远不会错过用大剑互相击打的机会。 在英雄回合结束时,如果在任何方向上有一个敌人在一个方格的距离内,则英雄会攻击他。 例如,在这种情况下,在第一个英雄回合( @1
)结束时:
######## ##@1@2## ## @3## ########
玩家1攻击第二位玩家,但没有碰到第三位玩家,因为第三位玩家与他的距离为2个正方形。
攻击者不会失去生命单位,防御者会失去20单位。
如果防御者去世(请参阅:英雄之死),则攻击者将控制失败者的所有金矿。
金矿开采
轮到他并与其他英雄(如果有)战斗后,玩家为每个受控地雷获得一个单位的黄金。
口渴
然后,英雄失去一个单位的生命值,因为任何行动都会使他口渴。
请注意,英雄不能渴死。 在最坏的情况下,他们的健康价值下降到统一。
英雄之死
当英雄的生命值降至零时,他就死了。 英雄立即在其重生点出现在地图上,具有完整的生命储备(100个单位)。 英雄失去了对他所有金矿的控制权,但保留了他所有积累的金矿。 当英雄返回到重生点时要小心,该格中的任何对手都会自动死亡。 因此,您应该避免停留在其中一位英雄的生成单元上...
英雄不能渴死。 干渴可以使英雄拥有一个单位生命值,但不能杀死他。
游戏结束
当达到最大移动次数(通常为300)时,游戏结束。 获胜者是拥有最多金币的英雄。 如果两个玩家拥有相同数量的金牌,则不会有赢家。
等级
玩家相对实力评估系统使用Elo评估 。 这个想法是:最好是第一而不是第二,最好是第二而不是第三,依此类推。 我希望原则是明确的。
一次使用多个机器人
您可以同时启动多个机器人实例,并且通常使用您认为适合于取得主导地位的任何措施。 打架
链接到原始
值得注意的是规则中没有描述但凭经验确定的其他几个方面:
- 如果我们的医疗单位少于21个,但是您袭击了不属于您的地雷,那么您就会死亡。 是的,是的,没有傻瓜的保护,这里的一切都是认真的,就像在真实的战斗中一样。 如果您攻击无人地雷,那么您所有的地雷都将成为无人地,并且如果您攻击一个敌人之一的地雷,那么您的地雷将移交给拥有该地雷的玩家的手中。
- 游戏描述了以下过程:
-
-我们 1
。 如果我们在执行命令期间死亡(在游戏中,您只能通过与小妖精的战斗而死去做到这一点)会发生什么? 我们重生了(并立即杀死了现在处于生成点的玩家),但是失去了击中附近敌人的能力,并且也不会由于口渴而失去1点生命。 - 在重生期间杀死了站在我们产卵点的敌人之后,我们俘获了他的地雷,呵呵。
- 地图的外观为正方形,地图的长度在线段[8,28]上取偶数。
“向敌人学习,您将了解他们的优势”
Vindinium是一款公开游戏,其有用的一面是,我们可以调查任何球员的个人资料,并查看他参加的最后一百场战斗。 “好极了!是时候使用神经网络了,因为我们有50个顶级玩家,我们将选出其中10个最强的玩家,最近100场战斗中的每场比赛都包含〜300个由玩家做出决定的时刻,总计约200-300,000个单位培训材料!您可以顺时针旋转每种情况,镜像等,以获取更多培训材料并巩固结果,这将为我们提供多达4.8-720万单位的材料“-发出了合理的声音。 是的,的确,这样的想法有权存在。 另外,神经网络具有许多优点。
- 所有培训材料都可以从开源轻松解析。
- 为反思计算机视觉提供了广泛的范围:
- 您可以保留所有内容,将有28 * 28个输入神经元(如果地图较小,则用树填充)。
- 您可以根据英雄的位置每次居中(也许会带来一些惊人的结果);
- 您可以以图形形式显示地图,从而极大地方便了神经网络在寻找模式方面的工作; 此选项将使神经元快速找到复杂行为的模式并快速了解为什么,如果我们健康状况不佳,我们会去一个遥远的小酒馆,即使我们附近的几个单元格中只有一个小酒馆,即使敌人就在旁边也是如此;
- 一个已经训练有素的神经网络,可以预先分配资源消耗的任务,可以紧凑地放置在分配给我们的512 MB RAM中(实际上,结果约为480 MB),以至于单板计算机的功能足以进行计算。
但是,我中的青少年最大化主义想走更复杂的方式-不在神经网络上寻找模式,而是依靠此解决方案的直观更高的可塑性来独自完成额头上的这项工作。
这样啊 决策树,alpha beta裁剪,minimaxes ...太苛刻的任务! 在Vindinium subreddit上,数名开发人员揭示了其机器人秘密的面纱,他们已经使用了此解决方案,并且可能不在这种Spartan条件下使用。 不幸的是,在这一领域,不可能有什么事情比其他事情做得更好。
在阅读了有关进化,遗传算法,求解树的文章之后,我挖掘了秘密知识-潜在领域。 您可以在此处和此处阅读有关它们的更多信息。 这个想法似乎非常有用,因为势场是一个平面图,在每个链接中都放置了一个函数,该函数取决于输入数据(特别是距对象的距离,但没有人理会更多的条件)。 所有这些都完全适合Vindinium的现实-如果算法中已经存在对象,则无需寻找该对象的路径。
“相当具体的味道”
让我们看一下顶级角色的战斗。 在开始之前,我们将选择一个喜欢的人,我们将跟随他,为他加油,为错误的决定严厉惩罚,但风格会是“但我会在这里...”。 经过一打打架,您已经可以大致了解遵守法律的AI是什么(按顺序检查条件):
- 如果敌人有死机的机会(即,如果我们可以站在敌人的生成点上而死亡的话),则不要靠近它的生成点;
- 在接近其产卵点时与您的敌人作战是愚蠢的,因为他仍将像一头健康健康的清晰凤凰,并会再次尝试夺取我们被洗劫的地雷;
- 如果敌人靠近我们,而我们站在小酒馆附近-该喝醉了。 从生存和放松手段附近的众多血腥战斗来看,这条规则是非常相关的。
- 如果我们不能击败一个或多个敌人,但是我们设法跑到小酒馆,我们就跑;
- 如果我们无法击败一个或多个敌人并且没有时间到达小酒馆,那么:
- 如果我们可以在无人农场中自杀,那我们就自杀了。 咬一口!
- 如果我们能死于一个金矿量最少的人的地雷,那我们就自己去看。
- 如果悲伤的结局在等待着我们,那么我们需要从这个爬行动物中获得尽可能多的健康,让他长时间记住自己的错误!
- 如果有一个敌人可以在我们的两次行动中杀死,并且他拥有地雷线,我们会发起攻击;
- 如果有一个敌人比我们所有的迷你锁都远,而他控制着33%的迷你锁,那么我们可以打败他-我们赢了,否则我们就去喝啤酒;
- 如果没有其他东西,我们将捕获农场。
问与答:
- 与神经网络相比,神经网络有什么优势,神经网络可以更好地完成这项任务,或者比您接下来的n个步骤都知道并已制定对策的树,剩下的就是很好地使用评估功能了?
(1)多功能性。 更改参数,添加新功能更加容易。 您遵循这样的角色,欣喜不已,然后变得卑鄙-您发现在某个时刻您可能会表现得完全不同,更加审慎地行事-我们正在编写新规则或更改旧规则。 (2)我们还确切地知道选择特定动作时由什么决定指导程序。 (3)潜在领域在百吉饼中表现得很好,是机器人进行人工智能的基础。
- 证明您的方法有效,您的意图值得。
在排行榜中, Zaraza 0.1
在第27位-潜在领域的AI,仅受三个本能引导-盲目抓住所有阻碍其前进的事物,不要在酒吧中变干并谨慎对待敌人。 如果跟随他的动作,您将看到他的战斗能力,尽管对于AI而言这是令人难以置信的,因为它基于三个简单的规则,而且他甚至都不会梦想任何复杂的行为。 而且,现在我正在研究Zonko 0.11
,这是Zaraz酒的一个大大改进的版本,由于与字段的交互作用得到改善,您可以将更复杂的行为集成到其中(就像在新型GPS中一样)。 但是,事实证明,它占用大量资源,因此它的优化过程现在正在进行中。但是我离题了,现在我们正在谈论严格的限制,严格的严格规则(...)。
- 您的信仰很荒谬,您的信仰太弱了! 我可以在method_name上创建一个AI,它将使您失望!
- 听取其他人对此主题的想法将非常令人高兴。 而且,对于您来说,我已经汇总了前10名玩家的所有搏斗,只有1000搏斗和大约1,000,000步动作- 链接 (.zip-33MB,RAW-1.68GB)。 我提供了游戏的条件:
- 在geektime中以您的昵称注册bot。
- 对于9月30日之前比我或其他曾指示参加比赛的得分最高的五位球员,我将寄出一张来自莫斯科的明信片。
所以,现在是编程语言...就我个人而言,我现在正匆匆忙忙地在Python3(快速开发,易于阅读,很长一段时间熟悉)之间切换,有pypy3(快速优化的解释器),jupyter(“笔记本”),您可以在其中安全地编写代码并将其优化为无限);但是pypy / pypy3在ARM 64位环境下不起作用,并且实际上不再支持ARM,并且该语言本身就不如编译语言而言)和Golang(开发速度也很快,易于理解,偏向后端,多线程和多处理,比python运行速度快;但是 etsya习惯没有一个互动的环境,以静态类型)的。
与服务器通信的主要功能可以表示如下:
但是,建议使用现成的开发,可以在Vindinium官方网站上找到其链接。
附加1:我真的很想读其他人关于基于Vindinium的人工智能的发展,因为这样您可以理解解决此问题的多面性。 为了获得json格式的战斗摘要(这对于调试战斗很有用),您需要将链接以http://vindinium.org/fd96vc2z形式的链接转换为http://vindinium.org/events/fd96vc2z形式的链接。 但是我不建议折磨游戏服务器,尝试让数百名顶级玩家打架,请使用上面的链接。
附加2:如果有人想将在Vindinium中的运行时间限制在NanoPi Neo2或Orange Pi Zero的限制范围内,我可以提供使用这些单板计算机的机会。
→ 链接到Vindinium
→ 到Vindinium subreddit的链接是非常有用的,您可以在其中跟踪我在Vindinium的活动
→ 在Vindinium上进行少量工作即可链接到我的github
在下一部分中,我们将建立潜在领域,使用潜在地图,编写条件并将所有这些强加于现代现实中。