【问题标题】:Video Game Bots? [closed]电子游戏机器人? [关闭]
【发布时间】:2010-04-29 21:53:26
【问题描述】:

我一直想知道,尤其是当我还是个孩子的时候,它激发了我开始编程的灵感,电子游戏机器人是如何工作的?我敢肯定有很多不同的方法,但是 MMORPG 的自动化呢?甚至是 FPS 类型的机器人?

我说的是玩家制作的自动化机器人。

【问题讨论】:

  • 这两种类型有很大的不同。我也没有任何经验,但我很确定 MMORPG 是在模拟用户输入(实际上是点击屏幕的某些部分或模拟按键),而游戏附带的 FPS 是由游戏的程序员编写的并且可能可以访问更多信息(例如墙壁在哪里,因此他们不必通过屏幕刮擦来确定是否撞到墙壁)
  • Warning! 这个问题似乎是由机器人发布的! 他们在监视我们,看我们是否理解他们。 ;-) 开个玩笑,这个问题更像是broad and shallow,与我们从机器人那里得到的一些东西没什么不同......

标签: c++ artificial-intelligence


【解决方案1】:

要“机器人”游戏,您需要能够以编程方式做两件事:检测游戏中发生的事情,并为游戏提供输入。

检测游戏中发生的事情往往是两者中较难的。执行此操作的一些方法是:

  • Screen-Scraping 这种技术捕获屏幕上的图像并对其进行解析,寻找敌人、玩家状态、能量提升、游戏消息、时钟等。这往往是一种特别困难的方法。 OCR 技术可以用来处理文本,但是如果文本是写在游戏世界的顶部(而不是在具有纯色背景的 UI 元素上),不断变化的背景可能会导致难以准确和一致结果。在屏幕上查找非文本对象可能更加困难,尤其是在 3D 世界中,因为单个对象可能存在许多不同的位置和方向。
  • 音频提示在某些游戏中,动作和事件伴随着独特的音效。可以通过监控游戏的音频输出并将其与相关声音效果的记录相匹配来检测这些事件。一些游戏允许玩家为事件提供自己的音效,这允许使用旨在易于收听和过滤的音效。
  • 内存监控 如果对游戏的内部运作有很好的了解,那么您可以通过检查游戏的内存空间来监控游戏的状态。一些控制台系统的作弊工具(例如Game Genie)使用这种方法。通过检测游戏更新的内存,可以检测游戏在做什么。有些游戏会在每次启动时随机使用它们使用的内存位置,以试图消除此漏洞。
  • 数据包分析 使用适当的驱动程序,您可以在游戏数据包发送到您的网卡或从您的网卡检索时截获它们(对于在线玩的游戏)。 Analysis 这些数据包可以揭示您的游戏客户端与服务器通信的内容,这通常围绕玩家/敌人的行为。
  • 游戏脚本 有些游戏有内置的脚本界面。如果可用,这通常是最简单的方法,因为这是游戏软件设计的目的(以前的方法通常都算作“黑客”)。有些脚本必须在游戏中运行(通过控制台或附加系统),有些可以由外部程序运行,这些程序通过已发布的 API 通过游戏进行通信。

将输入事件生成回游戏通常是更容易的任务。一些方法包括:

  • 内存“戳” 与上面的内存监控部分类似,内存戳是将数据直接写入游戏内存空间的行为。这是 Game Genie 用于应用其作弊码的方法。鉴于现代游戏的复杂性,这是一项非常艰巨的任务,并且可能会导致整个游戏崩溃。
  • 输入仿真 可以生成“假”键盘或鼠标信号来代替直接的人工交互。这可以使用AutoIt 等工具在软件中完成。硬件黑客也可以使用,例如连接到计算机的 USB 或 PS/2 端口并在系统看来是键盘的设备,但根据从计算机接收到的信号(例如,通过串行端口)。这些方法可能更难被游戏检测到。
  • 游戏脚本 如上所述,一些游戏提供了以编程方式控制它的内置方法,利用这些工具通常是最简单(但可能不是最强大)的技术。

请注意,在游戏中运行“机器人”通常会违反游戏的使用条款,并且可能会导致您被暂停、被禁止或更糟。在某些司法管辖区,这可能会受到刑事处罚。这是使用游戏内置脚本功能的另一个优点;如果它被设计成游戏软件的一部分,那么游戏发行商很可能不会禁止你使用它。

【讨论】:

    【解决方案2】:

    有一次我自己写了一个简单的 MMORPG 机器人。我用AutoHotkey

    • 它提供了许多模拟用户输入的方法——一种方法可以工作。自己用 C++ 编写一个可以工作的程序很乏味(或查看 AutoHotkey 的源代码)。
    • 它可以直接搜索屏幕的像素模式,甚至游戏屏幕(DirectX)

    所以我所做的就是在屏幕上搜索敌人的名字(以游戏字体的图片形式存储),然后脚本点击它下方的几个像素进行攻击。如果生命值太低,它还会跟踪生命值条和罐子。

    非常琐碎。但我知道一个也使用 AutoHotkey 制作的 WoW 机器人。我see很多其他人也有同样的想法(我的不是魔兽世界,但也可能是非法的)。

    More advanced techniques 不截屏,直接read the game's memory。你必须做很多逆向工程才能完成这项工作。当游戏更新时它会停止工作。

    【讨论】:

      【解决方案3】:

      一个人的日常生活如何?

      这就是游戏中的人工智能解决的问题。

      您希望您的实体做什么?编码你的实体来做到这一点。如果你想让你的怪物追逐玩家的分身,怪物只需要面对分身,然后向它移动。当那个怪物在合适的距离内,它可以选择咬玩家头像,这个选择可以像AmICloseEnough(monster, player);一样简单,也可以更复杂,甚至是随机的。

      FPS 中的机器人很难做到正确,因为让它们变得完美很容易,但让它们变得有趣却不是那么容易。例如。他们总是知道玩家的确切位置 (gPlayer.GetPosition()),因此每次都可以轻松地朝玩家的头部开枪。让机器人像人类一样移动需要一点“艺术”。

      【讨论】:

      • 我不知道为什么这会被否决。 +1。
      • 我没有投反对票,但认为投反对票太不清楚了。
      • 对不起,如果不清楚 - 我不知道如何让它更清楚;您的实体需要一个目标,然后代码需要弄清楚如何实现该目标。鉴于这个问题(当时),没有比这更好的答案了。 (我可以投反对票,但在问题被编辑后投反对票是很糟糕的,因为答案是针对问题的先前版本。)
      【解决方案4】:

      对于 FPS 风格的机器人,您可以查看 Unreal Development Kit。据我了解,这里面有很多实际的游戏源码。

      http://udn.epicgames.com/Three/DevelopmentKitHome.html

      【讨论】:

        【解决方案5】:

        bta 给出了很好的答复。我只是想补充一点,不同的方法可能会被游戏公司的不同检测手段所怀疑。通过内存监控或数据包分析侵入游戏客户端通常更容易检测到。我一般不推荐它,因为你很容易被抓住。

        与输入模拟一起使用的屏幕抓取通常是对游戏进行 bot 操作且不会被捕获的最安全方法。许多人(包括我自己)多年来一直在这样做,没有任何问题。

        此外,为了在检测游戏中发生的事情和提供输入之间增加一个步骤,一些游戏需要大量计算才能决定向游戏提供哪种输入。例如,有一个游戏,我必须计算攻击敌人时要发送的船只数量,这取决于我拥有的船只数量,船只的类型,以及敌人是谁和什么样的敌人。计算通常是“简单”的部分,因为您通常可以使用几乎任何编程语言进行计算。

        【讨论】:

          【解决方案6】:

          它被称为 AI(人工智能),实际上并不难复制,游戏编程语言中的一组规则和命令就可以解决问题。例如,FPS 机器人将通过获取玩家身体的坐标并将敌方机器人的枪设置为瞄准该坐标并在一定范围内开始射击来工作。

          【讨论】:

          • 我想知道获得玩家身体实际坐标的技术等。我不明白如果我的程序不提供任何东西,我将如何将它“连接”到另一个程序让我“连接”到。
          • @cam - 在第一人称或第三人称游戏(控制台或 PC)的情况下,AI 内置于游戏代码中,因此它可以访问所需的所有游戏信息。我不确定 MMORPG,但我怀疑 AI 代码在游戏服务器引擎中。
          • 检查或以其他方式干扰另一个程序的操作并不是视频游戏中实体的驱动方式。通常有一个程序在其自己的内部数据结构上执行所有逻辑。诚然,程序可能由许多线程和进程组成,但对他们每个人来说,他们需要的数据都是内部的。
          • 这个答案也非常适合最初提出的问题。为什么要投反对票?
          • @dash-tom-bang:同意。 +1 使其归零。
          猜你喜欢
          • 2017-06-30
          • 2011-08-31
          • 2016-06-11
          • 2021-07-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 2023-03-11
          • 2010-10-12
          相关资源
          最近更新 更多