2012-02-15 47 views
2

我正在播放一个简单的Flash游戏要求玩家点击多个快速移动目标的机器人,特别是这样的:建议,关于如何提高点击机器人性能

Click me!

我当前算法是相当简单:

  1. 捕获通过像素屏幕图像中的屏幕
  2. 环的图像,并且与目标图像的已知RGB值比较它们的RGB值
  3. 返回坐标那里找到匹配
  4. 将鼠标指针移动到坐标,然后点击

对搜索算法的代码如下:

public Point findImg(BufferedImage img) { 
     screen = bot.createScreenCapture(screenRectangle); // Image of screen 
     int target = 2424318; // RGB value to look for 
     int rgb; 

     // Approximate boundaries (400,200) and (1000,700) of the flash game were   
     // hardcoded in 
     for (int i = 400; i < 1000; i += 5) { 
      for (int j = 200; j < 700; j += 5) { 
       rgb = -(screen.getRGB(i, j)); 
       if (rgb == target) { // Target found 
        return new Point(i, j); 
       } 
      } 
     } 
     return null; 
    } 

目前机器人能够打约75%的目标。然而,它通常无法击中快速移动的目标,并且将在屏幕上“追逐”它们。我假设这是因为我的算法无法足够快地找到它们。我试过增加像素步长,但似乎没有明显的效果。任何建议,将不胜感激,谢谢。

+0

为了更好的可靠性,您应该减少像素步长,而不是增加。以牺牲运行时间为代价。 – 2012-02-15 23:46:44

+0

目标是否可以直线移动?如果你错过了会怎样?你可以在你发现的点上点击点击吗?也许你现在可以做你现在做的事情,但是如果你错过了,那么再拍一张截图,并在你想点击它时计算出目标的位置! – davidfrancis 2012-02-15 23:59:30

+0

目标在任意方向移动,没有任何处罚(你可以点击任意次数),并且我已经每125ms调用一次findImage来更新屏幕图像并检查目标。你的霰弹枪方法听起来不错,但我会给它一个镜头,谢谢! – JHuynh 2012-02-16 00:12:13

回答

1

首先,使用的最大步骤可以:这是在目标形状正方形内切(中心盘内)最大大小均匀。你会确保不会错过目标。

如果这还不足以让你点击的时候,有两个措施可以采取:

1)考虑到最大目标速度减少搜索区域和周围以前的位置搜索;

2)预测,其中通过估计速度和目标的方向(假设他们保持不变)点击;您可以通过比较连续帧上的目标位置来做到这一点。

这两种策略可以结合,但一定要掌握好时间参数:更快的搜索将是小排量基础上的速度估计校正。您需要预测搜索所需的时间以估计位移。

1

你如果不考虑系统的延迟(这点是人类玩家几乎自动执行)。 Flash游戏可能评估收到后点击帧。双缓冲和vsync都会增加延迟。所有这些都需要在屏幕捕捉之前完成才能抓取图像。

要快命中移动目标,你需要做一些跟踪。如果你能确定你的错过的位置,你会知道它的目标落后了多少。否则,也许你的代码可以识别连续错过彼此靠近,并采取更长和更长的步骤,直到你打了什么。

1

这是很明显,你不能“抓住”移动更快的目标,因为在时间循环的前两名是巨大的屏幕,该目标已移至别处处理,所以你的点击将肯定会保留“下面的”更快的目标。相反,如果可能的话,建立“目标击中区”。假设您只在屏幕的中心部分点击目标。这样,您可以显着减少比较次数。你也可以有多个目标击中区域。这取决于这些目标的来源。例如,如果他们来自屏幕两侧,那么将目标击中区域更有意义。

enter image description here

另外,如果你没有得到多个鼠标点击了“惩罚”,那么最好是在周围的匹配像素许多不同的地方点击。因此,如果您发现(450,500)是匹配的,则根据目标的直径点击(450,500),(455,500),(445,500),(450,505),(450,495)等等是有意义的(即它有多少像素)以及目前点击次数落后于目标的距离。

希望这会有所帮助。

enter image description here