ryubloblog’s diary

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

【ポケモンSV】switchを自動操作して学校最強大会を周回してみた話

はじめに

とある勉強会にてswitchを自動操作するという話を聞き、やってみたい気持ちが強すぎたのでやってみました。
作成したものはこちらになります。

github.com

プログラムの簡単な説明ですが、ポケモンSVの学校最強大会でニンフィアを重労働させるプログラムになっています。
毎度のことながらポケモンを育成していくにあたってお金は大切ですので、仕事に行っている間や寝ている間にニンフィアに休まず働いてもらいましょう。
※ 重労働させるポケモンは自由です。

2023/04/03追記

本記事の強化版、学校最強大会を無限に周回するプログラムを作成したのでそちらも是非見てください!

ryubloblog.hatenablog.com

使用技術とシステム構成

GitHubのREADMEにも記載していますが下記になります。

自動化にあたってswitchをBluetooth接続する際に、joycontrolの使用を考えていたのですが、最新のswitchのバージョンでは動作が不安定らしいので下記のnxbtを使用することにしました。

github.com

インストールから使用するまでが簡単だったので感謝してます。
なんといってもデモで動作を見ることができたので実装イメージが持ちやすかったです。

環境構築

環境構築はREADMEに記載してあるので簡単に流れを説明していきます。

Step1

まずはラズパイのセットアップを行なっていきます。
やることとしては下記の2つの記事が参考になります。

Step2

依存関係のアップデート

$ sudo apt update
$ sudo apt upgrade

Step3

重労働プログラムのcloneとnxbtのインストール

$ git clone -b old_making_money https://github.com/ryu-0729/switch-pokemonsv-auto-project.git
$ cd switch-pokemonsv-auto-project
$ sudo pip3 install nxbt

Step4

内部Bluetoothの無効化と外部Bluetoothの接続
ここは地味にハマった箇所になるので意外と重要だと思っています。
こちらの記事の方法で実現しました。
ハマった理由としては、デモの実行の際には特に外部Bluetoothを接続する必要はなく動作することが確認できていたので、原因の特定まで時間がかかってしまいました。(恥ずかしい。。)

Step5

重労働させるポケモンの準備
こちらはポケモンSV側での準備になります。
重労働させたいかつ学校最強大会を1ウェポンで勝ち抜けるポケモンを準備してください。

ここまで準備が終わればあとはプログラムを実行するのみです!

プログラムの解説

では簡単に重労働プログラムの解説をしていきたいと思います。
下記ソースになります。

nxbtのリポジトリに用意してくれているdemo.pyファイルをカスタマイズした形になります。
やっていることはシンプルで、59行目のstart_game(controller_index)でコントローラーの接続画面からゲームを起動までを行なっています。
64行目のafter_hour = datetime.timedelta(hours=0, minutes=30)の引数で労働時間を決めます。(デフォルトでは30分)
あとは70行目以降で指定した時間までひたすらRボタンとAボタンを連打するようになっています。
Rボタンを押している理由は、ニンフィアの育成が中途半端なためテラスタルをして火力を底上げしています。。。。

それでは始業時間です。

$ sudo python makingMoney.py

実際の動作

簡単にではありますが、重労働させている様子を撮影しました。

youtu.be

課題点/改善点

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

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

上記の機能は主に下記の記事を参考にOpenCVOCRを使用して実現したいと考えています。

smdbanana.hatenablog.com

また、将来的には物体検出の技術を使用してなんやかんやできたら面白いかなと密かに思っています。

最後に

ここまで読んでいただきありがとうございます!
初の自動化に挑戦してみたわけですが、nxbtがとても使いやすく比較的簡単に自動化することができました。
また、外部の勉強会にはなりますが自動化に興味を持つきっかけをいただきとても感謝しています。
ありがとうございました。