2012-02-15 53 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