创建一个 Flash 游戏机器人

Posted

技术标签:

【中文标题】创建一个 Flash 游戏机器人【英文标题】:Creating a flash game bot 【发布时间】:2011-09-17 06:23:27 【问题描述】:

有没有人对如何在java中创建一个可以玩Flash游戏的机器人的资源或方法有任何建议?

我正在考虑使用 Robot 类来观看屏幕并进行操作,但我需要在图像中查找图像的方法等。我确信这已经完成了,但谷歌搜索返回了很多废话..

【问题讨论】:

有没有一种简单的方法可以将 Java 程序与 Flash 客户端连接起来?那会很有趣... 您似乎正在寻找一个程序来分析屏幕图形并进行交互响应。除非你的 Flash 游戏非常简单,否则你手上就有一个复杂的computer vision 问题。 【参考方案1】:

我刚刚在大约 3 天内构建了一个休闲纸牌游戏机器人(不是扑克),而且非常简单。下面的方法适用于大多数基于按钮的游戏。当然,对于 3D 游戏和快速移动的 2D 图形,您将需要不同的方法。

奇怪的是,那里几乎没有有用的信息。所有关于编写机器人的文章都将链接到带有 DLL、挂钩、内存侦听和各种其他技巧的 Windows 内容。当然,你不需要任何这些废话。您只需要 Java 和 awt.Robot。

发出点击很简单,游戏逻辑是你必须自己弄清楚的,所以我将专注于获取屏幕输入。

首先获取全屏截图。然后你找到一个在每一帧中都存在的独特图像,并使用该图像作为锚点来计算游戏界面左上角的偏移量。锚图像可以是任何东西,甚至是游戏和浏览器背景之间的两到三个像素宽的边框,只要确保它足够长即可。然后您只需搜索屏幕截图即可找到该图像所在的位置,这是一种非常简单的算法,它每次比较图像一个像素并更改偏移量,直到找到匹配项。 获得 UI 偏移量后,您可以找到屏幕上所有按钮的相对偏移量,并为要与之交互的每个按钮拍摄一个小快照。您可以使用这些偏移量来检测活动按钮或其他指示器。作为奖励,您还可以在单​​击按钮时使用这些偏移量。 您应该为要检测的所有按钮制作一组 png(而不是 jpg)图像。然后,您针对屏幕截图的内容运行简单的图像比较算法。

Flash 会进行矢量字体渲染,并且不会在游戏的不同实例之间产生像素完美的一致性。图像缩放也将不一致。以下是解决此问题的方法:

    过滤。您可以使用多种过滤方法,最简单的一种是阈值过滤器。如果强度小于您的阈值,只需将所有像素设为 100% 黑色,否则设为 100% 白色。然后对过滤后的图像进行逐像素比较,找出不同像素的数量。假设对不同像素的低值进行匹配。您可能还必须在每个方向上将图像移动 + 或 - 1 个像素,总共进行 3*3 = 9 次比较。只需选择最低的不同像素值即可。 平均颜色。如果您只是查看屏幕上是否存在指示符(例如绿色发光圆圈),只需在指示符所在的矩形中找到平均颜色,看看它是否与存储图像的平均颜色足够接近.

字体识别可能很棘手。如果你可以将字母分开(通常使用单色字体),那么你可以简单地使用上面的过滤方法来单独识别每个字母。

如果碰壁,可以尝试各种更复杂的过滤方法(模糊+强度阈值是一个很好的组合)。

最后的提示是:

让您的图像识别和逻辑完全分离。 投资编写良好的调试工具,以转储图像检测过程中的信息,以便您可以调整过滤器和阈值,直到它们起作用。这个调试转储应该包括被比较的过滤图像,这样你就可以很好地了解过滤器是如何工作的,出了什么问题,以及如何修复它。如果没有这些工具,您将无法成功,因此如果您打算跳过它们,请不要费心。 尽早拥有一个工作原型。即使它只检测到一个按钮。 在您拥有可工作的机器人之前,请勿优化任何图像算法。

【讨论】:

【参考方案2】:

制作智能机器人很困难。如果您只使用时间和脚本点击就可以逃脱,那就去做吧。否则尝试基于抓取像素做出决定 - 这将是脆弱(可能会在不同的浏览器/屏幕/游戏更新上中断),但比更强大的image processing method 更容易实现。将您的逻辑和屏幕抓取代码分开,以便您可以独立测试逻辑并更新抓取代码而不影响逻辑。

我还建议您查看AutoIt。有了它,您可以轻松编写重复动作的脚本,以及从屏幕上抓取文本和像素数据。我用它来编写 Elements、Dream World 和其他几款游戏的脚本。告诉我你想玩的游戏,我可以为你提供更多帮助。

【讨论】:

【参考方案3】:

您可以修改 Flash 应用程序并为浏览器提供一个简单的 API(javascript 和可能的 Java 小程序)。 该 api 将包含用于控制和访问游戏状态的方法。 ExternalInterface.addCallback 将使这成为可能。

【讨论】:

【参考方案4】:

有更简单的方法可以做到这一点。如果您坚持使用 Java 来玩游戏机器人,则需要使用外部库来读取游戏中发生的事情并为计算机提供输入。

此外,Java 通常是臃肿的,并且有很多 OOP 特性对于非常简单的程序来说是不需要的。我同意 Garrett Hall 的建议,即使用 AutoIt 阅读游戏并向计算机提供输入。当然,这不仅仅是游戏机器人,但 AutoIt 可以完成编写 Flash 游戏机器人所需的大部分工作。

【讨论】:

以上是关于创建一个 Flash 游戏机器人的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 和 AutoIt 向 Flash 游戏发送消息

sikuli : 无法找到 Flash 弹出窗口中的图像

我正在尝试实现一个极小极大算法来创建一个井字游戏机器人,但我遇到了递归错误

unity实战:狂暴机器人游戏教程(下篇)

unity实战:狂暴机器人游戏教程(下篇)

unity实战:狂暴机器人游戏教程(下篇)