寿司打を自動化してみた話

yutanpoyutanpo1227

寿司打

大学生活なんだか暇だったのでPythonで寿司打を自動化してみた!って話をします。
ちなみに作ったのはかなり前なのでうろ覚えでこのブログ書いてます。

寿司打とは

まず初めに寿司打を知らない人向けに説明します。
寿司打とは、有名なタイピングゲームで昔まではランキングがあってかなり競われていました。
久しぶりに周りがやっていたのでやってみたらランキングが廃止されていたのでこれは自動化してもいいよね??(かなりグレー)ということでやってみました。

環境

Python 3.8.2
  • selenium : サイトアクセスのため
  • pyautogui : クリックなどの動作
  • opencv-python : 画像処理
  • numpy : 画像処理
  • mss : 高速なスクリーンショット
  • PIL : 画像への変換
  • Pyocr : 文字認識

概略

コード全体を載っけるのは気がひけるため概略のみとさせていただきます。

  1. seleniumで寿司打にアクセスする
    寿司打

  2. 難易度選択までクリックで進めスペースキー押下でゲームスタート(クリック位置は座標で指定)
    寿司打

    (Macの場合なぜかpyautoguiの座標を半分の値にするとうまくいく)

  3. ゲーム画面のスクリーンショットを取得し、文字位置だけを切り抜く
    寿司打

    スクリーンショットにはmssを用いている。
    当初pyautoGUIのscreenshotを使っていたが、mssの方が圧倒的に高速で撮影できるためmssを使うことにした。

  4. 切り抜いた画像を二値化し色を反転する
    寿司打

    二値化した画像を色反転させることで文字を黒色にした方が文字認識がしやすい

  5. Pyocr(tesseract)を使い文字認識を行い、文字列を取得する

  6. 取得した文字列をseleniumのsendkeysで入力する
    pyautoguiのwrite関数よりも断然入力が早いためseleniumのsendkeysを使うことにした。

  7. 3~6を繰り返す

以上の方法で寿司打を自動化することができました。

実際の動作

結果はこんな感じです。
寿司打

実際に動いている動画はこちらのツイートをご覧ください。

実際に動かしてみると早すぎて時間が減るどころかボーナスの時間増加の方が多く無限に時間が増えていきます。
ちなみに寿司打はなぜか340皿以上打とうとするとクラッシュするので340回でループを止めています。