Skip to content

Latest commit

 

History

History
154 lines (111 loc) · 7.86 KB

GetRuneSummary.md

File metadata and controls

154 lines (111 loc) · 7.86 KB

Python-DVMGetAutoRuneSummary

目次

概要

Pythonとそのライブラリを用い、ゲームの操作を自動化。
プレイヤーが通常入手しづらい情報をできるだけ効率的に取得する。

取得したデータはユーザが利用する想定で加工し、tsvファイルとして保存する。

デモ動画

Get rune overview automatically
左側...ゲーム画面(自動操作)
右側...エディタと情報が追記されていく様子を捉えるターミナル

目的と評価

  • OCRによる情報の取得と加工

    • ☑️ 達成できた 🔲 概ね達成できた 🔲 達成できなかった
      • 結果は実用レベルに到達しなかったが、満足の行く結果だった。
      • 取得方法を工夫することができた。
      • 取得内容が不十分でも、補正することができ、それによって利用できる情報も有ることが分かった。
  • OCRへの興味を充足させる

    • ☑️ 達成できた 🔲 概ね達成できた 🔲 達成できなかった
  • 実際にゲーム内で行うには非常に煩雑な作業の自動化

    • 🔲 達成できた 🔲 概ね達成できた ☑️ 達成できなかった
    • 実用できるレベルではない。
  • 自分の発想をもって課題解決の方法を導き出す。

    • ☑️ 達成できた 🔲 概ね達成できた 🔲 達成できなかった
    • このテーマ自体が通常のプレイではできない情報の取得の仕方へのアプローチ。そして自動化。
    • +のテンプレートを利用することで、適切な対象を無理なく選び出す
    • 色の変わらないピクセルを指定することでレアリティの判別をより安定感の高いものとした。
    • ステータス名や値を取得するために、画像の拡大をするなどの発想で対応できた。
      • フォント毎に二値化のためのしきい値を変更した。

使用ライブラリ及び役割

コンポーネント名 用途
PyAutoGUI マウスの自動操作
OpenCV マウス操作向けの座標取得、条件判定のための画像比較
Pillow 画面キャプチャの取得、画像のトリミング
PyOCR 画像から文字情報を取得
pandas ログ出力の整形、取得情報のtsv出力

前回の自動ルーン強化プロジェクトから流用した主なモジュール

コンポーネント名 用途 種類
GetUniqueCoordinates 取得された近い座標を一つにまとめる 関数

フローチャート

サイズが大きいので折りたたみ

フローチャート

工夫・苦労した点

◎,○…効果のあった内容。◎は特にそう感じたところ。
…期待通りに行かなかった点

工夫


  • a.ピクセルの色を見てレアリティの判別をした。

    ◎際どい場面では誤検出も有るテンプレートマッチングと違い、常に安定した結果が出る。

    • この動作を意識してのテンプレート作成をした(テンプレートの左上ピクセルにレアリティの色が入るような画像を指定した)
  • b.二値化の際のしきい値をフォントに合わせて変更した。

    ○ 検出精度の向上が図れた

    ○ 画像検出の原理を利用した上でのアプローチをとることができたと思う。

    • 画像を拡大して保存することによって、多少細やかなしきい値設定ができるようになる
    • ※サンプルコードのコピペではなく、再現性があって、仕組みを自分の言葉で説明できるやり方を得た。

    ☓ 処理時間の増大

    • 画像のサイズや取得内容を工夫することで本番では想定よりかは短い時間だった。
  • c.コンソール上に出力されるログの可視性への配慮(着色や体裁)

    ○ テストやデバッグの際に目を余り使わなくてすむ(着色に意味をもたせているので識別にかかる負担が少ない)

    • 情報が多かったり正確であろうとしたことで逆に使いづらい場面もあり、適切な出力を考える意味で良い経験だった。
  • d.モジュールの再利用

    ○ 工数大幅削減と実績が有るので非常に助かった。

  • e.コーディング品質の改善

    ○ ひとつか2つ汎用的な関数が作れたと思う。
    ○ 正規表現を一つのクラスに収めてIDEのインテリセンスが聞くようにだとか、同じ内容を分散させないようにしてメンテナンス性の向上。

苦労


  • 処理終了までにかかる時間

    • ユーザによるとは思うが、処理開始から終了までに2時間ほどかかる。
    • 今回最も時間がかかる処理は画像の二値化で、精度向上にはやむないかもしれない。
  • 適切な正規表現パターンの模索

    • 正規表現は得意だと思っていたが、それでも実際の出力を補正しきれなかった。

残っている改善点


  • 特定の項目、特定の値の区別

    • 例えば3~25の間にある攻撃力のパラメータは%と+の両方のパターンがあり、それを区別する方法。
      • 多分OCRの検出モードを変更して、更に数値だけを検出する工程を追加するなどで対応が可能と考えられる。
  • 不定期に発生する誤クリック

    • テスト中数回遭遇したが、発生条件が不明。
      • 起動プロセス一覧のボタンを押していることが原因と思われるが特定の場所で発生するわけではない。
  • 単純な検出精度か正規表現による補正力

    • 実用可能でないだけでなく、ここで正確な情報が取得できるのであればデータ分析にも持っていけるので結構重要。

得られたこと/もの


  • 自動化による手間と感じていた作業からの開放
  • 見づらいログの経験値を得た。
    • インデントが揃っているだけでもだいぶ違う。
    • 正直中身が多少不足していても、追跡しやすい情報が見やすければ良いと思った。
      • あるいはインデントが揃うような情報の記載の仕方をするなど。
  • 憧れのあったpandasに触ることができた
    • 本来想定されている用途ではないと思う。

課題・改善したいこと


  • 綺麗なコーディング

    • フローの中でいきなり関数を作り出したりしてしまった
  • 変数の命名規則が一貫しない、似たような変数名をつけたい場面がとても多かった。

  • コーディング量が多い。

    • 多分メインオプションとサブオプションで分けた時の正規表現処理がダブっているんだと思う。