Mukai Systems

Python & OpenCvでゴールデンクッキーを乱獲しようPart2

Part1はこちら

前回の記事でテンプレートマッチングでゴールデンクッキーの座標を特定できる事がわかったので、乱獲するスクリプトを実装してみた。

使用するファイルを以下に示す。

gc.pngは前回使用した検出対象であるゴールデンクッキーの画像である。

gc_click.pyは今回実装したゴールデンクッキーをクリックするスクリプトである。内容を以下に示す。

# Golden Cookie Clicker.

import time

import cv2
import pyautogui

pyautogui.FAILSAFE = False

gc = cv2.imread('./gc.png', cv2.IMREAD_GRAYSCALE)
gc_dx, gc_dy = map(lambda x: int(x / 2), gc.shape)
gc_click_interval = 25
cookie_x, cookie_y = 400, 600

def screenshot():
    ss = './ss.png'
    pyautogui.screenshot(ss)
    return cv2.imread(ss, cv2.IMREAD_GRAYSCALE)

def click_cookie():
    pyautogui.click(cookie_x, cookie_y)

def click_golden_cookie():
    img = screenshot()
    result = cv2.matchTemplate(img, gc, cv2.TM_CCOEFF)
    _, _, _, (x, y) = cv2.minMaxLoc(result)
    pyautogui.click(x + gc_dx, y + gc_dy)

if __name__ == '__main__':
    time.sleep(5)
    while pyautogui.position() != (0, 0):
        click_golden_cookie()
        start = time.time()
        while time.time() - start < gc_click_interval:
            click_cookie()
            if pyautogui.position() != (cookie_x, cookie_y):
                time.sleep(10)
                break

実装

pyautogui

今回はスクリーンショット取得とマウス操作のためにpyautoguiを使用した。

screenshot()

スクリーンショット取得し、OpenCvのグレースケール画像を返す関数。

click_cookie()

画面左側の大きいクッキーをクリックする関数。

クッキーの絶対座標はcookie_x, cookie_yで定義してあり、環境に応じて事前に設定する必要がある。

click_golden_cookie()

ゴールデンクッキーをクリックする関数。

スクリーンショットから、最もゴールデンクッキーらしい座標をクリックする。

前回の調査で、存在しない場合は施設「Idleverse」をクリックすることが分かっている。「Idleverse」を購入しても問題ないと考え、ゴールデンクッキーの有無にかかわらずクリックを行う処理とした。

main

メインループは次のようになっている。

5秒間スリープ
マウスが画面左上`(0, 0)`にない間:
    ゴールデンクッキーをクリック
    25秒間の間:
        クッキーをクリック
        もし、マウスが動かされたら:
            10秒処理を中断し、メインループに戻る

マウスを画面左上に持っていくまでプログラムは継続する。マウスを動かせば10秒間プログラムが中断するため、一時的に施設など購入することができる。

めでたし。1

See also


[1] ゴールデンクッキーだけで10^63枚のオーダーに届くとは思えないが。