这个问题在我心中已经存在了一段时间……主要是因为我看到了诸如《魔兽世界》之类的各种游戏的机器人。我的问题是;机器人如何知道屏幕上出现了什么?我没有玩《魔兽世界》,所以我的示例可能是错误的,但是例如,如果有一个怪物,机器人将如何知道屏幕上该怪物的位置以及如何与之交互?
您可以将其应用于任何游戏还是针对每个游戏?如果问题不清楚,我感到很抱歉...我不是在问如何制造机器人,而是要问他们如何在屏幕上检测到东西,这对我非常着迷!
提前致谢 :)
这个问题在我心中已经存在了一段时间……主要是因为我看到了诸如《魔兽世界》之类的各种游戏的机器人。我的问题是;机器人如何知道屏幕上出现了什么?我没有玩《魔兽世界》,所以我的示例可能是错误的,但是例如,如果有一个怪物,机器人将如何知道屏幕上该怪物的位置以及如何与之交互?
您可以将其应用于任何游戏还是针对每个游戏?如果问题不清楚,我感到很抱歉...我不是在问如何制造机器人,而是要问他们如何在屏幕上检测到东西,这对我非常着迷!
提前致谢 :)
Answers:
机器人可以在很多方面将自己注入到游戏中。
屏幕是其中之一,但到目前为止并不是最有用的。但是,我曾经见过一个非常早期的反恐精英瞄准机器人,它使用了颜色编码。它带有带有单色纹理的替代角色模型(游戏对游戏友好,足以允许这样做),然后仅检测到了这些颜色的像素。但是,这不是一种非常有效的方法。那时它已经很笨拙,并且变得越来越不可行,因为图形引擎变得越来越强大,这意味着越来越多的细节会使任何光学识别算法感到困惑。
另一点是直接读取内存[1]。您的计算机上可能有一个程序读取另一个程序的内存。因此,开发人员只需找出游戏将与机器人相关的信息保存在哪个内存地址即可。有一些工具可以通过创建内存映像并提供各种搜索工具来帮助开发人员找到他们想要的东西。一种对策是使用地址布局随机化,但是智能机器人可能仍然能够自动找到他们想要的东西。
可以修改游戏可执行文件本身。为了做到这一点,机器人开发人员需要能够在汇编器中进行读取和编程,这在某些实践中并不难。然后,他们寻找处理他们感兴趣的信息的代码,并将其重写以传递给他们的机器人。从游戏开发者的角度来看,一种可能的对策是使用混淆器来降低游戏的汇编代码的可读性,但是这些通常不利于性能,并且有许多工具可以使混淆器逆转其工作。
然后是网络代码。在在线游戏中,服务器通过网络发送游戏中所有对象的属性和位置。服务器和客户端之间的网络数据流可以被拦截和分析。一个流行的工具是wireshark。当开发人员对网络代码进行逆向工程时,他们可以编写一个可以拦截网络流量的漫游器,就像Wireshark一样,并使用该信息来做出决定。当开发人员更有动力时,他们甚至可以从头开始开发一个完整的游戏客户端,该客户端实现网络协议并玩游戏,甚至没有任何图形输出。这类机器人在金农中非常受欢迎,因为没有图形输出,客户端通常对资源更加友好,这意味着它们可以在小型服务器上一次运行很多。
1:由于您提到了WoW,所以值得指出的是,早期臭名昭著的WoWGlider引导程序使用了直接内存访问。暴雪有一个名为Warden的子程序,该子程序旨在检测并阻止外部程序访问WoW的内部游戏状态。由于漫游器程序绕过了这种保护并未经允许就读取了内存,因此2006年的MDY v Blizzard诉讼被判决支持暴雪,理由是该漫游器制造商鼓励并允许其用户侵犯版权并违反DMCA。
机器人是玩家。他们就像其他所有玩家一样,从服务器读取玩家/怪物的位置,然后将这些值与简单的AI脚本结合使用,以编程方式模拟键盘笔触和鼠标点击,从而在游戏中执行动作。如果机器人实际上有一种算法可以检测屏幕上的怪物并与其进行交互,那么那将是一款相当出色的软件,价值数百万美元。这基本上是机器人的AI。
Phillip已经对大多数机器人的工作方式进行了很好的概述,但是我只是想更详细地介绍一下内容,因为我有一些自己的经验,可以在他所涉及的所有类型的机器人上进行开发。
在Runescape中,有一个大型项目(RSBot),可以将内存的内容从Runescape客户端复制到其本地内存中,然后在这里可以查看游戏的整个状态,而不会出现客户端被追上的风险。为了找到指向数据的指针,需要进行一些逆向工程来确定在内存中查找的位置,但是一旦这样做,他们就公开了API以利用信息。通过获取对象的坐标,然后使用相机变换矩阵对其进行变换以获取屏幕上的位置,它将确切地知道世界上什么地方。命中遮罩也是可读的,因此准确确定将鼠标移到哪个范围以获取所需结果并不容易。
该机器人提供了一堆调试信息,例如,注释告知开发人员哪些图块坐标在哪里,该对象具有哪个ID,属于给定项目的ID等。然后,这些信息可用于制造机器人。制作机器人脚本的实际过程实际上非常简单。该框架提供了许多实用程序功能,例如move_to(world_coordinates)
或mouse_move(x,y)
将以某种令人信服的方式执行指定的操作(沿着随机样条线移动鼠标,通过小地图和屏幕反复移动等)。
同样在Runescape中,您可以选择大幅降低图形质量。通过拍摄屏幕并应用一些基本的计算机视觉概念来构建世界模型,制造某些类型的机器人实际上非常容易。我使用这种技术制作了一个诅咒机器人和一个熔炼机器人,两者都工作得很好。它只需要获取帧,尽可能地增加饱和度,然后尝试从中提取模式,然后可以为点击区域生成概率图。
在诅咒机器人的情况下,目标是较小的恶魔,这只是一个巨大的红色东西,很难找到。对于熔炼机器人,它将寻找一个灰色包围的小橙色梯形,那就是熔炉。它还会尝试找到一个大的浅灰色的“ L”形,即银行柜台。这只是通过缩减规模和基本启发式方法来完成的。它也可以使用迷你地图旁边的便捷指南针来定位自己,因此可以将相机定位在更可靠的位置以找到目标对象。
在各种Nexon游戏中,服务器非常信任客户端。在Maplestory中,我通过修改地图以消除危险或添加扭曲来滥用大量信息,从而使机器人不必几乎那么复杂。我还将监视往返服务器的流量,以建立一个世界模型,然后将其用于快速查找和杀死怪物。
一旦我意识到我不再玩MMO并自动将它们进行自动化,我决定完全停止玩MMO。如果我不担心自己会合法曝光,我可能会杀了销售MMO机器人,但我真的不想被起诉。这就是为什么我现在花时间进行真正的编程!
Phillip的回答很好,但是只需简单介绍一下Model / View / Controller模式,或者简称MVC。
您的屏幕是“视图”的一部分,“视图”显示来自“模型”的数据,如果您愿意,它是游戏的真实状态。机器人和您的角色都(在某种意义上)“存在”于模型中。想象一下,如果您拔下屏幕的电源,即使视图消失了,游戏也将继续。
在网络游戏中,“模型”的概念有点复杂,因为您实际上有很多模型。您在服务器上拥有模型,然后在每个客户端上都有模型,这部分地由于其从服务器接收的数据而进行更新。您可以将“模型”视为包含服务器模型和客户端模型的模型,也可以将其仅视为自己的客户端模型。无论哪种方式,这都是机器人的住所。因此,它们的“感知”(可以用作它们的数据输入和状态的简写)基于当时模型的状态以及模型中不同实体/对象之间的交互作用。实际上,每个bot可能都有一个称为“ refreshState”的函数,该函数每帧或某个帧运行一次,并导致其更新。
他们可以从文件或服务器读取光线,也可以通过光线碰撞检测系统读取。通常使用从机器人(在这种情况下)到他的外部的光线。如果射线与某物碰撞,则它将一些信息返回给机器人,例如射线发现是玩家,机器人,动物还是简单的墙壁。这是因为,例如在玩家和机器人的情况下,它们有一个看不见的胶囊,使它们完全包含有关其类型的信息(例如人类,机器人,...)。这样,例如,如果他们跟随您,它们可以避免撞到墙壁和其他物体。
您可以看到此页面的碰撞检测部分