11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PyAutoGUIとOpenCV画像認識を使いクリッカーゲームのBOT作成

Posted at

Python PyAutoGUIとOpenCV画像認識を使いクリッカーゲームのBOT作成

やりたいこと自作のクリッカーゲームの自動化
※ サンプルではCookie Clicker の自動化を行った→ http://orteil.dashnet.org/cookieclicker/

  1. クッキーを自動でクリック
  2. 一定回数クリック後にCursurが購入可能かチェックし可能な場合、買う
  3. 1〜2を繰り返し行う

PyAutoGUIとopencv-pythonをインストール

PyAutoGUIドキュメント

opencv-pythonドキュメント

pip install pyautogui
pip install opencv-python

クッキーを自動でクリック

Cookie Clicker ブラウザ画面

スクリーンショット 2021-03-14 16.28.10.png

絶対座標 200:400をクリック
クリック回数は0.5秒間隔で10回行う

import pyautogui


def click():
    pyautogui.click(x=200, y=400, clicks=10, interval=0.5, button='left')


if __name__ == "__main__":
    click()

Cursurが購入可能かチェック

最初にCursurの画像を取得

def screenshot_cursor():
    screenshot = pyautogui.screenshot(region=(2226, 1242, 120, 120))
    screenshot.save("images/cursor.png")

購入可能時と購入不可能時の画像をそれぞれ取得

購入可能
cursor_active.png

購入不可
cursor_no.png

購入可能判定

2つ方法があった

PyAutoGUIのlocateOnScreenを使う
pyautogui.locateOnScreen を使う現在の画面に対象画像が存在する場合に座標が返る。
不一致はNULL

confidenceは一致率、今回は画像は同じで購入できない場合グレー画像かだけなので判定精度の調整が難しかった
0.9999で購入出来る場合は座標が返り、購入出来ない場合はNULLになった

def match_cursor_active():
    rerturn pyautogui.locateOnScreen("images/cursor_active.png", confidence=.9999)

OpenCVのmatchTemplateを使う
minVal, maxValで一致率が分かる
今回の画像の場合、購入できる画像は1.0, 1.0
購入できない場合は0.9970715045928955, 0.9970715045928955 となった

def match_cv_cursor_active():
    tmp = cv2.imread("images/cursor.png")
    cursor_active = cv2.imread("images/cursor_active.png")

    # 画像マッチング処理
    result = cv2.matchTemplate(cursor_active, tmp, cv2.TM_CCORR_NORMED)
    minVal, maxVal, _, _ = cv2.minMaxLoc(result)

    if minVal < 1:
        return False

    return True

備考:どちらも微妙なのでもっといい方法があれば教えて欲しい
色味判定などがいいのかもしれない
ぶっちゃけ今回の処理の場合、無条件でCursorクリックでも良いのだが...

クリックして購入

def click_cursor():
    pyautogui.click(x=1150, y=650, clicks=1, interval=0, button='left')


if __name__ == "__main__":
    p = match_cursor_active()
    if p:
        click_cursor()

全体のコード

クッキークリック10回を10回繰り返す処理にした

import time

import cv2
import pyautogui


def click():
    pyautogui.click(x=200, y=400, clicks=10, interval=0.5, button='left')


def click_cursor():
    pyautogui.click(x=1150, y=650, clicks=1, interval=0, button='left')


def screenshot_cursor():
    screenshot = pyautogui.screenshot(region=(2226, 1242, 120, 120))
    screenshot.save("images/cursor.png")


def match_cursor_active():
    return pyautogui.locateOnScreen("images/cursor_active.png", confidence=.9999)


def match_cv_cursor_active():
    tmp = cv2.imread("images/cursor.png")
    cursor_active = cv2.imread("images/cursor_active.png")

    # 画像マッチング処理
    result = cv2.matchTemplate(cursor_active, tmp, cv2.TM_CCORR_NORMED)
    minVal, maxVal, _, _ = cv2.minMaxLoc(result)

    if minVal < 1:
        return False

    return True


if __name__ == "__main__":

    max = 10

    for loop in range(max):
        print(f"ループ回数:{loop}")
        click()
        p = match_cursor_active()
        if p:
            click_cursor()
            time.sleep(1)

実行動画


以上、クリッカーゲーム攻略方法でした

いいね!と思ったら LGTM お願いします :clap::clap::clap:

【PR】プログラミング新聞リリースしました! → https://pronichi.com
【PR】週末ハッカソンというイベントやってます! → https://weekend-hackathon.toyscreation.jp/about/

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?