创建 Flash 游戏机器人

2022-09-04 22:00:06

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

我正在考虑使用Robot类来观看屏幕并进行操作,但我需要查找图像等图像的方法。我敢肯定这之前已经做过了,但谷歌搜索返回了很多废话。


答案 1

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

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

发出点击非常简单,游戏逻辑是您必须自己弄清楚的,因此我将专注于获取屏幕输入。

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

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

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

字体识别可能很棘手。如果可以分隔字母(通常使用单色字体),则只需使用上面的过滤方法即可单独识别每个字母。

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

最后的提示是:

  • 保持图像识别和逻辑完全分离。
  • 投资编写好的调试工具,以转储图像检测过程中的信息,以便您可以调整过滤器和阈值,直到它们正常工作。此调试转储应包括要比较的已筛选图像,以便您很好地了解筛选器的工作原理、出错之处以及如何修复它。没有这些工具,您将无法成功,因此,如果您打算跳过它们,那么请不要打扰。
  • 尽早建立工作原型。即使它只检测到一个按钮。
  • 在拥有工作机器人之前,不要优化任何图像算法。

答案 2

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

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


推荐