読者です 読者をやめる 読者になる 読者になる

yukiのブログ

作ったものなど

クリッカーゲームを攻略する

[2017/1/13追記]
githubリポジトリ作りました。
github.com
以下の記事は2016/12/11時点のプログラムについての記事です。

この記事はIS17er Advent Calendar11日目の記事として書かれたものです。
10日目の記事はこちら

Cookie Clickerに代表される、「クリックでポイントを獲得 -> アップグレードを購入 -> クリックでポイントを獲得 ->...」を繰り返してポイントを増やしていくゲームのことをクリッカーゲームといいます。単純極まりないクリッカーゲームを、放置しておくだけでそれなりの効率で攻略するために、クリックを記録して高速で再生する単純なプログラムを作ったので解説します。

何ができるか、できないか

  • クリックの記録・再生ができる。
  • 左クリック以外は記録できない。
  • 半透明のウィンドウをクリックして記録するので、記録してる間はゲームが進展しない。
  • クリックの座標と順番だけ記録し、クリック間の時間は記録しない。
  • フェイルセーフ(暴走したときに実行を止める処理)は無い。

ないないづくしですが、クリッカーゲームを攻略するには十分なはずです。

動かす

Windowsではpythonの標準ライブラリだけで動きますが、MacLinuxではpyautoguiというモジュールが必要なので入れてください。pyautoguiにはPillowも必要です。ちなみにpython3です。

sudo python3 -m pip install pillow
sudo python3 -m pip install pyautogui

ダウンロード・解凍したフォルダでコマンドプロンプトを開いて以下のコマンドを打つと説明が現れるので、それに従ってください。-nオプションは無くてもかまいません。

python record.py -n cookieBaker

クリックの記録が済んだら、以下のコマンドで記録を再生できます。

python play.py cookieBaker.py -d 10 -r 0.5

dオプションで記録を再生する時間を、rオプションでクリックから次のクリックまでの間を設定できます。クリックから次のクリックまでの間をあまり小さくしすぎるとうまく動きません(0,001ぐらいが限度)。

工夫した点

クリックした場所を検出するために半透明なウィンドウを使う。

アクティブでないときのマウス処理とか受け取ってくれる上手いライブラリがなんかあるでしょ~なんて思ってたら無かったので、いろいろ悩んだ末こうしました。ただこうすると、クリックして出てくるメニュー画面に対して何かしたいときに「メニュー呼び出しのクリックを記録->半透明ウィンドウを最小化->本来のウィンドウでメニューを開く->半透明ウィンドウを戻す->メニューに対するクリックを記録」とする必要があるので不便です。

記録したログを保存するとき、pythonソースコードをつくる。

pythonには任意のタイミングでソースコード(正確にはモジュール)を読む関数__import__があるのでこうしました。ソースコード中のクリックを記録した配列(record)に対して、以下のように一発でアクセスできるので便利です。

      def __init__(self, logName):
            self.record = __import__(os.path.basename(logName)[:-3]).record

またソースコードを作るときには、クリックが検出されたらその都度座標を文字列としてファイルに書き込めばいいので、バッファなどを用意する必要もなく簡単です。

def addPointToFile(self, x, y):
    # pythonソースコードに[x, y]を追加する
    dx = self.root.winfo_rootx() # ウィンドウのずれを修正
    dy = self.root.winfo_rooty()
    print("Logging : %d, %d" % (x + dx, y + dy))
    # pythonでは[a,b]を[a, b,]と書いても問題ない
    self.file.write("[%d, %d], " % (x + dx, y + dy))

また記録をソースコードにすると記録の編集もしやすくなります。例えば最初のクリックを100回繰り返すようにしたければログファイルを開いて、最初の部分を

record = [ [(何か), (何か)] ] * 100 + [ ... ]

とすればOKです。

実践

3つのクリッカーゲームで試してみました。クリックを記録して再生するまでを録画したので貼っておきます。文字やカーソルが小さいので大画面で見ること推奨です。


Cookie Clicker


Clicker Heroes


AdVenture Capitalist

思ったほど派手じゃなかったのが多少残念ですが、人力でやるよりはるかに速いので満足です。

感想

機能を削ったおかげですぐできた。