ドキドキするとき無敵でしょ

映画とプログラミングの話

CookieClickerを自動化してみた

今は円城塔の『バナナ剥きには最適の日々』という本を読んでいる。
随分と文章が論理的だな、と思ったら Ph.D を持っているということがわかった。

なぜ CookieClicker を自動化するのか

wikipedia の項目を参照してみると、以下のような記載がある

About.comはこのゲームを究極のスキナー箱と呼んでいる

スキナー箱については本文とはあまり関係がなくことの発端でしかないため詳しい説明は一切省く。
私はまさにクッキーをクリックすることに夢中になり、ゴールデンクッキーが出るまでの間ひたすらにクッキーをクリックし
ゴールデンクッキーが出るのが楽しみで楽しみで仕方なくなり寝食を忘れクッキーを焼き続けた。
これでは私生活に影響が出る、と感じたためクッキークリッカーを自動化することを私は決意した。
これはクッキークリッカー依存症を克服すべく、決意した私の記録である。

考えた手法

当初、私はカーネルモジュールでクッキークリッカーを自動化しようと考えていた。
しかし、現在のレベルでは難しいと考えたため別のアプローチを行うことで問題を解決することにした。
それはテストツールを使うことである。
selenium というWeb の UI 自動テストツールがある。これを Python + selenium + chrome という組み合わせで使った記事を見つけたため、これらを応用し
クッキーを自動でクリックできるようにした。

結果

最初は Go で並行・並列処理を学ぶついでにやろうと思ったが Python にも threding というライブラリがあったのでこれを使用して行った。

https://github.com/GunjiD/automatic-baking

こんな感じになった。色々並行して行っていたため、時間がかかってしまった

引っかかったとこ

そもそも平行・並列処理についてまだわかってない部分が多いので、調べる必要があると感じた。
セーブの書き込みを並列実行した際に txt に吐き出せなくてなぜだめなのかがわからなかった。
バッファの問題ではないか、という友人からの指摘があり flush() を組み込むことで定期セーブの実装に成功した。
多分吹っ飛んでるっぽいけどなんで吹っ飛ぶのかよくわからんのでちゃんとここを調べたい。
thred のお気持ちになりたい。
あと夜中つけっぱなしにしたらこの前プログラムが落ちたので、あんまり良いコードではないな、と思った。

今後の予定

無限にクリックし続けてセーブもできるので、自動購入できるようにしたいと思ったが
Rui Ueyama さんのセキュキャンでコンパイラ作った話の記事で「一気にいろんなもの作るよりちょっとずついろんな層を作るのがいい」
という話だったので、自動購入よりグラフ化できるようにログを取る機能を追加したいと考えている。

感想

ゲーム自体への興味がまるで薄れてしまい、クッキー依存症にならずに済んだ。
危うく死ぬまでスキナー箱の中にいたであろう私を救ってくれた Python に感謝する。
空いた時間を数学と SICP に有効活用して計算機科学の勉強を進めたい。

イトウ製菓のチョコチップクッキーがうまい