大学生活なんだか暇だったので Python で寿司打を自動化してみた!って話をします。 ちなみに作ったのはかなり前なのでうろ覚えでこのブログ書いてます。
寿司打とは
まず初めに寿司打を知らない人向けに説明します。 寿司打とは、有名なタイピングゲームで昔まではランキングがあってかなり競われていました。 久しぶりに周りがやっていたのでやってみたらランキングが廃止されていたのでこれは自動化してもいいよね??(かなりグレー)ということでやってみました。
環境
Python 3.8.2
- selenium : サイトアクセスのため
- pyautogui : クリックなどの動作
- opencv-python : 画像処理
- numpy : 画像処理
- mss : 高速なスクリーンショット
- PIL : 画像への変換
- Pyocr : 文字認識
概略
コード全体を載っけるのは気がひけるため概略のみとさせていただきます。
-
selenium で寿司打にアクセスする
-
難易度選択までクリックで進めスペースキー押下でゲームスタート(クリック位置は座標で指定)
(Mac の場合なぜか pyautogui の座標を半分の値にするとうまくいく)
- ゲーム画面のスクリーンショットを取得し、文字位置だけを切り抜く
スクリーンショットには mss を用いている。 当初 pyautoGUI の screenshot を使っていたが、mss の方が圧倒的に高速で撮影できるため mss を使うことにした。
- 切り抜いた画像を二値化し色を反転する
二値化した画像を色反転させることで文字を黒色にした方が文字認識がしやすい
-
Pyocr(tesseract)を使い文字認識を行い、文字列を取得する
-
取得した文字列を selenium の sendkeys で入力する
pyautogui の write 関数よりも断然入力が早いため selenium の sendkeys を使うことにした。
- 3~6 を繰り返す
以上の方法で寿司打を自動化することができました。
実際の動作
結果はこんな感じです。
実際に動いている動画はこちらのツイートをご覧ください。
実際に動かしてみると早すぎて時間が減るどころかボーナスの時間増加の方が多く無限に時間が増えていきます。 ちなみに寿司打はなぜか 340 皿以上打とうとするとクラッシュするので 340 回でループを止めています。