Python
Python3

Pythonで寿司打をやってみる

Python3で寿司打を解いてみた

先日Qiitaの記事でpython初心者が一年でやってことに「寿司打を解かしてみたり…」という記事があった気がして(追記:この記事でした),これなら自分にでもできそうだと思ったのでやってみました.
ただのチートなのは理解してますがランキングには登録してないので許してください.
動画↓
https://youtu.be/fSpRSJDFPLo

はじめに

昨日おとといくらいでマインスイーパーをPythonでといて(参照)その時はなぜかpyocrが使えなかったのでとてもめんどくさい方法で数字を読み取ったのですが,なんとなく使えたりしないかなあと試したところ使えるようになってました.
なので,さっそくやってみました.

環境

  • Python 3.6.4

画像から文字を読み込む

Pythonからpyocrを使い文字を読み込みました.
この記事を参考にさせていただきました.

moji.py
from PIL import Image
import sys
import pyocr
import pyocr.builders

def moji(a):
    tools = pyocr.get_available_tools()
    tool = tools[0]

    langs = tool.get_available_languages()
    lang = langs[0]
    #txtに変換した文字列を代入する
    txt = tool.image_to_string(
        Image.open(a + '.png'),
        lang="eng",
        builder=pyocr.builders.TextBuilder(tesseract_layout=6)
    )
    Text = list(txt)   #文字列を配列に変換
    count = len(Text)
    i = 0
    while True:   #寿司打の場合小文字アルファベットか'-'しか出てこないのでそれ以外の文字が出てきていたら削除する
        if i >= count:
            break
        if Text[i] < 'a' or Text[i] > 'z':
            if Text[i] != '-':
                del Text[i]
                count -= 1
            else:
                i += 1
        else:
            i += 1

    txt = str(''.join(Text))   #文字列に戻す
    return txt

スクリーンショットをとる

寿司打の場合真ん中の上下に日本語と英語(ローマ字)が表示されるので,下部分のアルファベット文字列をスクリーンショットで取得しました.
image.png

このときにアルファベット文字列の長さによって枠の大きさが変わるので微調整が必要でした.
screenshot19.png
(はるか遠くの銀河)
これをぎりぎりまで攻めることでかなり時間短縮になったようです.

main.py
import pyaoutgui
#省略
    img = pa.screenshot(
        imageFilename="screenshot" + str(i) + ".png",    # 保存先ファイル名
        region=(797, 588, 275, 30)    # 撮影範囲(x,y,width,height)
    )
#省略

入力

moji関数に画像(のファイル名)を送り文字列が返されます.
pyaoutguiを使って返された文字列を入力しました.

main.py
import pyoutgui as pa
#省略
    string = moji.moji("screenshot" + str(i))
    pa.typewrite(string, interval = 0.0)
#省略

時間をつぶす

画面の切り替えの瞬間をスクリーンショットで取ってしまわないように時間を調整しました.
ここもぎりぎりをせめることで早くなりました.

main.py
import time
#省略
    nowtime1 = time.time()
    while True:
        if time.time() - nowtime1 > 0.25:
            break
#省略

感想

画像から文字を読むなんてすごく難しそう!これができればきっと勉強になる!と思ったのですが,全く難しいことはなく勉強にはなりませんでした.
しかし,人力ではありえない記録が出るので楽しかったです.

コード全文

main.py
import moji
import pyautogui as pa
import time
start = time.time()
pa.mouseDown(x = 765, y = 588, button = 'left')
pa.mouseUp()
pa.typewrite(" ", interval = 0.0)
nowtime = time.time()
while True:
    if time.time() - nowtime > 1.5:
        break
i = 0
while True:
    if time.time() - nowtime > 300:
        break
    print(i)
    img = pa.screenshot(
        imageFilename="screenshot" + str(i) + ".png",    # 保存先ファイル名
        region=(797, 588, 275, 30)    # 撮影範囲(x,y,width,height)
    )
    string = moji.moji("screenshot" + str(i))
    pa.typewrite(string, interval = 0.0)
    print(string)
    nowtime1 = time.time()
    while True:
        if time.time() - nowtime1 > 0.25:
            break
    i += 1

おわり.