创建一个Flash游戏机器人

时间:2011-06-17 14:40:42

标签: java bots

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

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

4 个答案:

答案 0 :(得分:10)

我刚刚在大约3天内制作了一张休闲卡玩机器人(不是扑克),而且非常容易。以下方法适用于大多数基于按钮的游戏。当然,对于3D游戏和快速移动的2D图形,您需要采用不同的方法。

奇怪的是,那里的有用信息很少。关于编写机器人的所有文章都将链接到Windows的东西,包括DLL,钩子,内存窥探和各种其他技巧。当然,你不需要任何这些废话。您只需要Java和awt.Robot。

发出点击很简单,游戏逻辑是你必须自己解决的问题,因此我将专注于获取屏幕输入。

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

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

  1. 筛选。您可以使用许多过滤方法,最简单的是阈值过滤器。如果强度小于阈值,则简单地将所有像素设为100%黑色,否则为100%白色。然后对滤波后的图像进行逐像素比较,找到不同像素的数量。假设匹配不同像素的低值。您可能还需要在每个方向上将图像移动+或 - 1像素,总共3 * 3 = 9次比较。只需选择最低的不同像素值即可。
  2. 平均颜色。如果您只是想查看屏幕上是否有指示符(例如绿色发光圆圈),只需找到指标所在矩形的平均颜色,看它是否足够接近存储图像的平均颜色
  3. 字体识别可能很棘手。如果你可以分开字母(通常是单色字体),那么你可以简单地使用上面的过滤方法分别识别每个字母。

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

    最后的提示是:

    • 让您的图像识别和逻辑完全分开。
    • 投资编写好的调试工具,将信息转储到图像检测过程中,以便您可以调整过滤器和阈值,直到它们工作为止。此调试转储应包括要比较的过滤图像,以便您了解过滤器的工作方式,出错的方法以及如何解决问题。没有这些工具你就不会成功,所以如果你打算跳过它们,那就别烦了。
    • 尽早制作原型。即使它只检测到一个按钮。
    • 在你有一个工作机器人之前,不要优化任何图像算法。

答案 1 :(得分:2)

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

我还建议调查AutoIt。有了它,您可以非常轻松地编写重复操作脚本,以及从屏幕上获取文本和像素数据。我用它来编写Elements,Dream World和其他几款游戏。告诉我你正在尝试机器人的游戏,我可以帮助你更多。

答案 2 :(得分:1)

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

答案 3 :(得分:-3)

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

此外,Java通常很臃肿,而且非常简单的程序不需要很多OOP功能。我同意Garrett Hall关于使用AutoIt阅读游戏并为计算机提供输入的建议。当然,除了游戏操作之外还有更多内容,但AutoIt可以完成编写Flash游戏机器人所需的大部分内容。