PyAutoGuiの、パイソンによる、パソコンのための自動化
とりあえず、歴史的偉人の名言風に書き出してみました。
まずはこのゲームで遊んでみてください。
https://game.nifty.com/free/50
どこまで行けましたか?
子供向けと侮った私は見事に3面止まりでした。
何回か挑戦しましたがクリアできません!
FPSゲームが得意な人はあっさりクリアできたりするのかもしれませんが
ちょっと限界を感じたので、コマンド操作を自動化して全クリを目指してみましょう。
ということで、今回利用するのがPyAutoGuiです。
ぱいおーとじーゆーあいと読みます。
pythonでパソコンの動作を自動化できる優れものです。
プログラムによる自動操作で憎いモグラを一掃しようという試みです。
PyAutoGuiの記事はこんなのも書きました。
PyAutoGuiでマウスを作成する
まずは自動化に必要なツールをインストールします。
1 2 3 |
pip3 install pyscreeze pip3 install opencv_python pip3 install pyautogui |
これで準備は完了です。
まずは簡単なプログラムで自動化を体験してみましょう。
次のプログラムを書いてください。
1 2 |
import pyautogui pyautogui.moveTo(100, 300, duration=1.0) |
1行目のimport pyautoguiをすることでPCを自動操作する機能を読み込みます。
次の行がマウスを動かすための本操作になります。
括弧の中の下記の内容のパラメータとしてマウスの動きを設定します。
1つ目のパラメータ | x座標 | 100 |
2つ目のパラメータ | y座標 | 300 |
3つ目のパラメータ | 動かす時間 | duration=1.0 |
この3つのパラメータを変更することでマウスを操作することが可能です。
※ちなみに座標はモニタの左上をx=0, y=0として右下に行くに従って値が
増加します。
PyAutoGuiによるゲーム自動化プログラム作成その1
では憎いモグラを一掃するためのプログラムを作成しましょう。
試作機1号プログラムは次の通りです。
人間の感覚に近い形でプログラムを組んでみました。
※下のプログラムを実行するとプログラムにマウス操作を奪われます。
プログラムを終了するときは画面の左上(座標(0,0)あたり)にマウスカーソルをグイっと動かして
下さい。
1 2 3 4 5 6 7 8 9 10 11 12 |
import pyautogui #ずっと繰り返す while True: #特定の範囲から画像と一致する座標(左上の座標と画像の高さ)を全て返す for pos in pyautogui.locateAllOnScreen('img/head2.png', region=(100, 300, 350, 200), grayscale=True, confidence=0.950): #座標の1点を取り出して画像の中心を取得する cpos = pyautogui.center(pos) #画像の中心をクリックする pyautogui.click(cpos) #マウスを移動させる(ハンマーでモグラが隠れるのを防ぐため) pyautogui.moveTo(100, 250) |
プログラムの内容は単純です。
while文で繰り返しゲームの画像を取得してモグラの画像を探します。
そしてその場所をクリックするだけです。
モグラの画像はこれを使っています。
この画像をキャプチャされた範囲から探し出しクリックしているイメージです。
実際の結果はどうでしょうか?
あまり良い結果がえられませんでした。
先ほど説明しましたが、プログラムでは次の処理が行われています。
1.パソコンの画面のスクリーンショットを取る。
2.スクリーンショットからモグラの頭っぽい箇所を探す
3.モグラの頭の位置情報にしたがってクリックする。
1~3を高速で繰り返しています。
撃ち漏らしが発生する理由は、手順1と2の処理時間が長いのです。
スクリーンショットの上にモグラの頭を重ね、少しずつずらしながら同じ部分を
探しているので、とても時間がかかってしまいます。
その結果、モグラを探している間にゲームの時間は進み、モグラがいなくなったり
叩いてはいけない犬が出現している状態になってしまうのです。
PyAutoGuiによるゲーム自動化プログラム作成その2
先ほどのプログラムで良い結果がでない原因は、モグラの検出が遅いことです。
つまり、このゲームの攻略のポイントはいかに早くモグラを検出できるかに
かかっています。
このゲームの特徴を書き出すと記述すると次のようになります。
1.モグラはランダムで出現する
2.モグラは茶色と赤の2パターンある
3.出現箇所は7箇所で決まっている
4.犬を叩いてはいけない
この情報から攻略プログラムを作成しましょう。
PyAutoGuiによるモグラ検出問題の解決方法
実は、PyAutoGUIは特定場所1ピクセルの色を判断に処理させることができます。モグラの出現場所は7箇所ときまっているので、7箇所の色を判断して処理を作ることができます。
幸いモグラと犬と穴の色が明確に分かれているので、
犬とただの穴の場合以外はモグラであることが確定します。
これらの条件を満たす場合にクリックさせればOKです。
ということで次のようにプログラムを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#必要モジュールの読み込み import pyautogui # 基準点(左上の土を基準点とする) basePoint = pyautogui.locateOnScreen( 'img/base.png', grayscale=True, confidence=0.980) cBasePoint = pyautogui.center(basePoint) pyautogui.click(cBasePoint) #モグラが出てくる座標 clickPoints = [(160, 10), (325, 10), (405, 60), (240, 60), (85, 60), (160, 120), (325, 120)] #以下繰り替えし処理、モグラの座標の位置を特定し土か犬以外ならクリック while True: スクリーンショット取得 pyautogui.moveTo(600, 600) im = pyautogui.screenshot(region=(cBasePoint[0], cBasePoint[1], 410, 125)) #7つの座標の文ループする for point in clickPoints: #指定された座標の色をcolorに代入する color = im.getpixel(point) #色の赤成分を取り出す colorR = color[0] #色の緑成分を取り出す colorG = color[1] #赤が250以上ではなく、かつグリーンが55以上でもぐらなので、その場合はクリック if not colorR >= 250 and colorG > 55: pyautogui.click(x=cBasePoint[0] + point[0], y=cBasePoint[1] + point[1]) |
基準点の画像がわかりにくいと思いますが、左上の土の部分を走査して、
この部分の座標を基準にしています。
コードを書いたら実際に動かしてみてください。
なかなか良い結果が出ていると思われます。
簡単なゲームならPyAutoGuiで自動化可能なので、挑戦してみてください!