辅助英雄
DOTA2 是一款 MOBA 游戏,有许多有趣是隐藏的机制。 这是一项团队运动每个团队成员都应该扮演他们指定的角色。 例如,辅助英雄应该为Farm英雄创造发育空间,包括拉野,购买辅助物品、卖血等。
辅助英雄一个至关重要的角色是控制地图视野。 正确位置的视野可以帮助团队实现关键目标。 此外,视野也会为队友创造了地图意识和活动空间,以便在相对安全的情况下游走gank。
这篇文章的目标是:
- 借助一些数据科学工具,探索职业玩家如何插眼和控制视野。
- 为休闲玩家提供指导,提升他们的游戏体验。
- 推断像 Dota Plus 这样的付费订阅如何提出插眼建议。
定义视野
第一种是提供区域视野的观察者守卫(假眼)。 他们的视野受到树林的阻碍,放置在山顶上的观察者守卫提供飞行视野。 请注意,观察者守卫不会显示隐形单位。
哨兵守卫(真眼)不提供自己视野。 但是,站在哨兵守卫旁边的玩家可以看到隐形单位。
除非放置哨兵守卫,否则这两种守卫对敌人都是隐形的。 在战略要地布置守卫的行为称为插眼,撤除敌方队伍放置的守卫称为排眼。
地图概览
下图显示了完整的 DOTA 地图,左下角是 Radiant 团队,右上角是 Dire 团队。
OpenDota 项目允许玩家查看比赛摘要和有用的图表,如下面的示例比赛所示:
数据采集
任何人都可以从 OpenDota 免费查询数据:
我们可以直接使用SQL语句获取结果。以下 SQL 查询返回比赛的日志数据。 时间范围任意设置为 2021 年 1 月 1 日及以后。 25000 个匹配应该足以满足我们的需求。
SELECT
/*number of sentries plances as single (1D aarray) value*/
array_length(sen_log, 1) num_sen_placed,
/*same but for observer*/
array_length(obs_log, 1) num_obs_placed,
/*JSON of sentry wards placed*/
sen_log,
/*JSON of observer wards placed*/
obs_log,
/*match id*/
matches.match_id,
/*start time*/
matches.start_time,
/*hero id*/
player_matches.hero_id,
/*account id*/
player_matches.account_id
FROM matches
/*match_id is common name for column in joined tables*/
JOIN match_patch using(match_id)
JOIN player_matches using(match_id)
JOIN heroes on heroes.id = player_matches.hero_id
/*only look at pro matches*/
LEFT JOIN notable_players ON notable_players.account_id = player_matches.account_id
WHERE TRUE
/*at least 1 sentry placesd*/
AND array_length(sen_log, 1) IS NOT NULL
/*at least 1 observer placed*/
AND array_length(obs_log, 1) IS NOT NULL
/*2021 games only*/
AND matches.start_time >= extract(epoch from timestamp '2021-01-01T00:00:00.000Z')
ORDER BY matches.start_time
LIMIT 25000
我们主要获取我们需要的眼位数据, 日志采用 JSON 格式,并将被压扁(平铺)方便在使用的时候获取。 我们主要使用以下信息:
- (x,y) 眼的位置。
- 真/假眼。
- 放置的时间。
- 如果由 Radiant 或 Dire 团队放置。
OpenDota 坐标系
OpenDota 使用与实际地图尺寸不同的坐标系。 实际上,地图的左下角对应的坐标 (64,64),地图被划分为编号从 0 到 127 的块。因此,地图的右上角的坐标是(192, 192)。
初步分数据
数据看起来如何? 下图显示了数据集中所有假眼的散点图,以及按高度着色的地图。 蓝点 (z=132) 对应一座小山,因此放置在小山上的眼可以提供无障碍视野。 此外,还添加了一个红色边界框以显示地图的范围。
有趣的事实:(100,150) 处的灰色空点对应肉山的深坑,里面不能放眼。
上面的可视化很乱基本上得不到任何有用的信息。 让我们看看随着时间的推移放置的所有眼位:
有人可能会问:两个队伍的插眼活动是一样的吗? 下图证实,是的,无论是哪个团队,活动基本都是相同的。
此外,让我们看看在山顶上插眼的情况。 它遵循与整体插眼活动相同的趋势,并在比赛第 40 分钟后下降。
如何选择眼位
看看下图,该图显示了游戏开始前放置的所有眼位。 一目了然,我们可以推断出玩家想要在哪里放置视野,但不能推断出他们优先考虑的位置。
如果我们想看看首先应该把眼放在哪里,团队在哪里优先收到保护,怎么办? 我们可以使用下一节中介绍的聚类算法来回答这些问题。
选择模型:DBSCAN
DBSCAN 由两个关键参数控制:
- epsilon:两个样本之间的最大距离,一个被视为在另一个附近。
- min_samples:一个点在邻域中被视为核心点的样本数。
DBSCAN 的一个好处是它不需要指定簇的数量,它可以找到任意形状的簇。 此外,它具有噪声概念并且对异常值具有健壮性。 因此,一些眼位是不会被分配到一个集群中,而是作为异常值保留。
为什么不使用 KMeans?
KMeans 可以用作替代聚类算法。 但是,它依赖于三个假设:
- 每个变量分布的方差是球形的(KMeans 喜欢球形斑点)。
- 所有变量都具有相同的方差。
- 每个集群具有大致相同数量的观察。
这是最严重问题是 KMeans 的第三个假设。 确实,有些位置很好会方多眼,例如中路,而另一些地方则经常受到竞争,例如河道。
后期游戏与早期游戏
DOTA 是秒级更新游戏,每一刻都是创造新事物的机会。 事实上,时间(比赛阶段)的影响是防守策略的主要因素。
如果 1 级塔仍然存在,则在基地中放置真眼是没有意义的。 因此,基于任意时间框架对眼位进行聚类比忽略时间的影响更有洞察力。
每个阶段的眼位聚类分析
本部分提供了双方的真假眼聚类图。 此外,还提供了评论以解释集群如何反映参与者的策略。
开始前 - 0:00 分钟前
在第一波小兵离开基地之前,玩家会争夺河道符文。 因此玩家在靠近地图中心的河流处放置假眼,以便查看敌人在做什么。 在敌人有时间阻止它之前,会在敌人的野区放置一些假眼观察敌人的活动。
最后,以红色显示的眼位对应于经济战。 放置在中立野怪营地边界框内的眼会阻止也怪生成。 这样敌方队伍被剥夺了金钱和拉野的能力。
早期 — 0:00 至 10:00
在游戏初期,中路和野区都不会受到很大的威胁。 由于 1 级塔可能仍然存在,因此在野区入口附近给予优先视野。
早期到中期 - 10:00 到 20:00
在游戏的早期到中期,大部分人开始尝试入侵敌人的野区并且在敌人的野区放置视野。
中期 - 20:00 至 30:00
视野更多的出现在了山顶区域
中后期 — 30:00 至 40:00
中后期,注意力已经转向了肉山的坑。 这表现为坑附近的山顶上布满了各种真假眼,它们被放置在入口的各处处,以检测抢夺肉山盾的企图。
后期 — 40:00 至 60:00
肉山的坑还是一个最相关的目标。 一些眼会放置在基地附近。
大后期 - 60:00 及以后
在游戏的最后阶段,兵营和 3 级塔可能已经都没了。 为了弥补塔楼视野的损失,在基地内部会放置一些眼位。
交互式浏览器
绘图的输入和参数是任意的,并且基于DATA2相关的知识(即数百小时的游戏)。 如果您想调整数据,
可以到我们的公众号中找到在线的链接
下面的截图显示了该应用程序并要求用户提供 3 个输入:
- epsilon 的值
- 大体时间
- 每个簇的最小采样器
总结
这个项目大规模使用真实可靠的数据。 因此,它可能会捕捉职业玩家的最佳实践并跟上策略和游戏机制的变化。
此外,这里使用的方法与地图的变化无关。 因此对地图布局或机制的任何更改都已在输出中考虑在内。但是这个项目不评估眼的存活时间。 真假眼的花费成本/收益比方面的问题,这篇文章没有解决。
可以查询数据并确定放置眼位的位置可以帮助团队确保击杀或关键目标的关键地图视野。 这篇文章的方法论的优势在于它能够跟上地图布局和游戏机制的变化。 因此,通过观察大量匹配,我们可以发现关键位置并在我们的游戏玩法中实现它们。
最后本文的源代码在这里:https://github.com/NadimKawwa/DOTAWardFinder,请随意查看
作者:Nadim Kawwa