5

この記事は最終更新日から1年以上が経過しています。

投稿日

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

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/

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
5