java - 创建一个 Flash 游戏机器人

标签 java bots

对于如何在 java 中创建可以玩 flash 游戏的机器人,是否有人对资源或方法有任何建议?

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

最佳答案

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

奇怪的是那里有用的信息太少了。所有关于编写机器人程序的文章都将链接到带有 DLL、 Hook 、内存窥探和各种其他技巧的 Windows 内容。当然,你不需要这些废话。您只需要 Java 和 awt.Robot。

发出点击非常简单,游戏逻辑是你必须自己弄清楚的,所以我将重点放在获取屏幕输入上。

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

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

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

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

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

最后的提示是:

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

关于java - 创建一个 Flash 游戏机器人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387490/

相关文章:

Java ArrayIndexOutOfBounds 异常

java - GroupedFlux<T> 创建的 groupBy 运算符的数量是否有限

java - GWT 验证-Api GA

c# - 在 Bot Framework c# 的表单方法后回复英雄卡

php - "Unknown SSL protocol error"是什么意思?

node.js - 对话式 Facebook Messenger 机器人

java - 更改 ScheduledThreadPoolExecutorService 的延迟而不终止服务

java - tomcat部署时的application.properties位置

php - 如何在 PHP 中检测 w3.org 的机器人?

node.js - Microsoft Azure LUIS 应用程序模拟器没有回复