ryubloblog’s diary

宮城県の仙台で働くプログラマーです。

【Switch自動化】ポケモンSVの学校最強大会を無限に周回した話

はじめに

ryubloblog.hatenablog.com

前回、ニンテンドーSwitchを自動操作してポケモンSVの学校最強大会を周回するプログラムを作成しました。
その中で課題点/改善点に下記をあげていました。

ここでお気付きの方もいるかと思いますが、現状のプログラムだとニンフィアが途中でリタイアする可能性があるのです。。。
リタイアすると残り時間ポケモンセンターで回復し続けます。
また、時間による設定を行なっているので学校最強大会中に処理が終わることがほとんどになっています。。
よって今後の追加機能としては下記を考えています。

  • 条件判定を行い回復アイテムを使用する。(社内でフィードバックがありニンフィア努力値のH180をSに振ったらあまりリタイアすることはなくなったので要検討)
  • ポケモンセンターに戻った際は学校最強大会にリエントリーできるようにする。
  • 学校最強大会が終了した時点で処理が終わるようにする。
  • レポート機能

今回はこれら課題点/改善点を解決するべく機能追加を行なって学校最強大会を無限に周回できるようにしました。
実装したソースコードは下記にあります。
インストールや実行方法はREADMEに記載してあります。

github.com

追加機能

大きく追加した機能はこちらです!

  • レポート判定機能
  • リエントリー機能

それではそれぞれの機能についてどのような機能でどのように実装したか解説したいと思います。

レポート機能

機能としては学校最強大会をエントリーする場所でレポートを書く機能になっています。

実装方法ですが、レポートを書くかどうかを判定する必要があります。
レポートを書くかどうかの判定には画像処理(OpenCV)を使用しています。
具体的には画像処理を使用して画面上に、「学校最強大会」が表示されているかどうかを判定している感じになります。

主な処理の流れとしては下記になります。

  1. 画面上の画像取得
  2. 取得画像をトリミング
  3. 2でトリミングした画像と比較元画像を2値化*1
  4. 3の2つの画像(正確にはNumPy配列)を比較し一致している要素を取得
  5. 4で取得した一致している要素数閾値を超えているか判定
  6. 閾値を超えている場合はレポートコマンドを実行

3の比較元画像↓

2値化した比較画像↓

このレポート機能を実装することで、課題点/改善点であった下記を達成することができます。

  • 学校最強大会が終了した時点で処理が終わるようにする。
  • レポート機能

この自動化プログラムは終了したい時間を設定するようになっているので、終了時間を過ぎているかつレポートを書いたタイミングで処理を終了させることで学校最強大会が終了した時点で処理を止めることができるようにもなっています。

リエントリー機能

機能としては、学校最強大会でリタイアしてポケモンセンター送りになった際に学校最強大会にリエントリーする機能になっています。
この機能を実現できたのは1番の要因は先程紹介したレポート機能にあります。
レポート機能がなかったら実現できなかったと言っても過言ではありません。
なぜレポート機能が必要だったのかについて説明していきたいと思いますが、まずは処理の流れを紹介していきます。

  1. 画面上の画像取得
  2. 取得画像をトリミング
  3. 2でトリミングした画像と比較元画像を2値化
  4. 3の2つの画像(正確にはNumPy配列)を比較し一致している要素を取得
  5. 4で取得した一致している要素数閾値を超えているか判定
  6. 閾値を超えている場合はゲーム終了、再起動コマンド実行

リタイアしたかどうかの判定処理はレポート機能と同じ方法になります。
なぜレポート機能が必要だったのか気付いた方もいるかもしれませんが、このリエントリー機能はリタイアしたかどうかを判定して、リタイアしていればゲームを終了して再度ゲームを開始する流れになっているため、学校最強大会終了後にレポートを書く機能が必要になっていました。(レポートを書いていないとこれまでの周回が無駄になる。。)

ただしリエントリー機能では比較画像を工夫する必要がありました。
当初、判定用の画像は「目の前が真っ暗になった」やポケモンセンターで回復をしてもらう際の文言で比較しようと思ったのですが、画像の取得が不安定であったり同じような要素が他の箇所にも存在するため、判定がうまくできていませんでした。

なので少し強引ではありますが、ポケモンセンターわざマシンの場所を使って判定するようにしています。

ポケモンセンターにいる時に取得できる画像↓

比較元画像↓

そしてこのリエントリー機能を実現することによって下記の課題点/改善点は達成することができました。

比較元画像についてゲーム内の時間帯それぞれで正しく判定できるの?という疑問を持つ方もいるかもしれませんが、問題なく判定できることは検証済みなのでご安心を!

補足:下記の機能も課題点/改善点で挙げていましたが、リエントリー機能があるのでいらないかなということで実装はしていません。

  • 条件判定を行い回復アイテムを使用する。(社内でフィードバックがありニンフィア努力値のH180をSに振ったらあまりリタイアすることはなくなったので要検討)

ソースコード

学校最強大会無限周回プログラム↓

カスタムクラス↓

最後に

個人的にですが、学校最強大会周回のプログラムは満足のいくものが出来上がったと感じています。
ガンガン稼いでポケモン育成頑張ります!

テラピース難民を救うため自動レイドにも挑戦したいですね。。。

ここまで読んでいただきありがとうございました!

*1:閾値を元に画像を0か1の状態(白黒)にすること