アズールレーンの周回操作をPythonで自動化したい その2

前 その1

自動化のやり方についてはその1の内容を参照。
次イベントまで更新しない予定だったが、思いつきで徹夜して作ったせいで前回のスクリプトがろくに動かなかったので、まだまともに動くようスクリプトを書き直した。

改善点

  • クリック後に必ずwait処理を1秒以上設けることで座標の取得が失敗しないようにした。処理は遅くなるがエラー出るよりはマシ。
  • 処理の優先度を見直した。以前のバージョンでは確定ボタンが出ているにも関わらず、違う場所をクリックする処理が優先されて先に進めなくなっていた(この部分はその1でも修正済み)。
  • 戦闘中にも固有のwait処理を与えてログの流れるスピードを遅くした。ログがちょっとだけスッキリした。
  • 戦闘勝利後の確定ボタン(黄色)はカラーで識別するようにした。モノクロだと青色のボタンも押してしまうので、燃料不足のときにも確定ボタン(青色)を押してしまい、ダイヤで追加燃料を購入していまう可能性がある。 購入してしまった。畜生。

攻略ルートの吟味(航路がふさがっているのにボスを目指そうとして詰む)はSP3では発生しなかったので見送り。どうせ次回イベントで追加せざるを得なくなるだろうけど。

改善版

使用した画像。
131843.png

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# automatic_operation.py
#


import pyautogui
import time

def main():
    print("開始")
    while True:
        # エラー(出撃不可)(e1-)
        # ドックが一杯
        if pyautogui.locateCenterOnScreen("./image_e1.png", grayscale=True, confidence=0.9)
            print("ドックが一杯です")
            break
        # 燃料不足
        if pyautogui.locateCenterOnScreen("./image_e2.png", grayscale=True, confidence=0.9):
            print("燃料が不足しています")
            break

        # 出撃まで操作(image1-10)
        # ステージ選択画面(10秒停止)
        if pyautogui.locateCenterOnScreen("./image1.png", grayscale=True, confidence=0.9):
            print("ステージ選択")
            time.sleep(10)
        # 出撃ボタン(マップ決定)
        elif pyautogui.locateCenterOnScreen("./image2.png", grayscale=True, confidence=0.9):
            print("出撃")
            x,y = pyautogui.locateCenterOnScreen("./image2.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(1)
        # 出撃ボタン(編成決定)
        elif pyautogui.locateCenterOnScreen("./image3.png", grayscale=True, confidence=0.9):
            print("出撃(編成決定)")
            x,y = pyautogui.locateCenterOnScreen("./image3.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(3)

        # 戦闘関連(image11-20)
        # 敵艦隊を撃破
        elif pyautogui.locateCenterOnScreen("./image11.png", grayscale=True, confidence=0.9):
            print("撃破")
            x,y = pyautogui.locateCenterOnScreen("./image11.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(1)
        # アイテム入手
        elif pyautogui.locateCenterOnScreen("./image12.png", grayscale=True, confidence=0.9):
            print("アイテム入手")
            x,y = pyautogui.locateCenterOnScreen("./image12.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(1)
        # 確定
        elif pyautogui.locateCenterOnScreen("./image13.png", confidence=0.9):
            print("確定")
            x,y = pyautogui.locateCenterOnScreen("./image13.png", confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(1)
        # 勝利画面(潜水艦出撃時の「確定」ボタンが出ない場合)
        elif pyautogui.locateCenterOnScreen("./image14.png", grayscale=True, confidence=0.9):
            print("勝利")
            x,y = pyautogui.locateCenterOnScreen("./image14.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(1)
        # 戦闘中(戦闘中のログが汚いので長めのwaitを設ける)
        elif pyautogui.locateCenterOnScreen("./image15.png", grayscale=True, confidence=0.9):
            print("戦闘中")
            time.sleep(10)

        #敵(21-)
        # ボス
        elif pyautogui.locateCenterOnScreen("./image21.png", grayscale=True, confidence=0.9):
            print("ボス")
            x,y = pyautogui.locateCenterOnScreen("./image21.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(5)
        # 偵察艦隊
        elif pyautogui.locateCenterOnScreen("./image22.png", grayscale=True, confidence=0.9):
            print("偵察")
            x,y = pyautogui.locateCenterOnScreen("./image22.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(3)
        # 主力艦隊
        elif pyautogui.locateCenterOnScreen("./image23.png", grayscale=True, confidence=0.9):
            print("主力")
            x,y = pyautogui.locateCenterOnScreen("./image23.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(3)
        # 敵発見(艦種不明)
        elif pyautogui.locateCenterOnScreen("./image24.png", grayscale=True, confidence=0.9):
            print("艦種不明")
            x,y = pyautogui.locateCenterOnScreen("./image24.png", grayscale=True, confidence=0.9)
            pyautogui.click(x,y)
            time.sleep(3)

        # wait
        else:
            print("wait")
            time.sleep(3)
            print("再探索")

if '__main__' == __name__:
    main()

画面の所定の位置をクリックするっていう操作しかしてないので、(画像の切り抜き方さえ頑張れば)機能追加・変更は結構簡単。他のアプリに対しても色々試してみたい。

おまけ

134925.png
デイリーいいねランキングに載りました(5/16 13:51)。ありがとうございます。
やっぱりみんな周回ダルいって思ってるのね。

Chronona
Bioinformaticsを勉強中。 気晴らしに研究用以外のスクリプトも書いてます。
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした