見出し画像

【BDSP】伝説ポケモン色違い厳選を自動化してみる!【poke-controller】

今更感はありますがポケットモンスターBDSPの色違い厳選を自動化したので、忘備録もかねて書きます。
プログラム云々はいいからダウンロードだけしたい方は「ダウンロード」の項目まで飛んでください。


作ろうと思った経緯

ポケットモンスターBDSPでは多くの伝説ポケモンを捕まえることができます
ですが、そこで色違いの伝説ポケモンを手に入れたいとなると
1/4096というソシャゲのガチャも真っ青な確率との勝負となります。
確率的には一体出るまで2,839回まわして半々
6,592回まわしてようやく8割…というように気が遠くなる作業です。
手動でやるにはあまりに辛すぎる…ということで自動化しようと思います!

具体的な方法

ポケモンの自動化については色んな手法がありますが
今回はarduino leonardoというマイコンボードとpoke-controllerという
画像認識を使うことのできるソフトを使って自動化していきます。

poke-controller (v3.0.2.7.0a Modifired)
arduino leonardoとシリアル変換機(DSD TECH SH-U09C)

なぜ画像認識を使うかというと動作の安定化と特定のポケモンだけではなく
アルセウスのように上に進むことでエンカウントするポケモン
固定シンボルに話しかけることでエンカウントするポケモン
両方に対応させるためです。

プログラムの動作

今回のプログラムが初めて書いたプログラムになるので
いろいろと最適化不足なところがあるとは思いますが
とりあえず動いてるのでヨシ!ってことにします。

プログラミング初心者はまずフローチャートを書けとよく言われているので
書き方があっているかは疑問ではありますが書いてみました。

自分がわかりゃいいんだよって書いたものなので参考にはしないでね

至ってシンプルですね。
とにかく繰り返しの動作が多いのでwhile True(無限ループ)を
多用していきます。
例えば最初の「~が現れた」等のテキストが表示されるまで
Aボタンと上入力を繰り返す箇所では

			while True:
				self.press(Button.A, 0.1, 0.1)
				self.press(Direction.UP, 0.15, 0.1)

				if (self.isContainTemplate('BDSP_Atari/BDSP_arawareta_kana.png', threshold=0.9, use_gray=True, show_value=False) \
						or self.isContainTemplate('BDSP_Atari/BDSP_arawareta_kanji.png', threshold=0.9, use_gray=True,show_value=False)):
					print("バトル開始です!")
					break

というように書きました。
while True:で下記の動作を繰り返し、if文で「~が現れた」もしくは
「~があらわれた」というテキストを画像認識したとき
「バトル開始です!」と表示したのちbreakで次の処理へ進む
というような流れです。

次の「~が現れた」のテキストが表示されて消えるまでの間Aボタンを連打する動作、表示が消えて1秒待つ動作も同じ仕組みで動かしています。

上の動作を終えた後、if文を使い
「いっておいで!」等のテキストが表示されているかそうでないかで
色違いか通常色かを識別しています。
(色違いの場合、エフェクト表示でテキストが出てくるまで約2秒ズレる)

			if( self.isContainTemplate('BDSP_Atari/BDSP_itteoide.png', threshold=0.9, use_gray=True, show_value=False) \
					or self.isContainTemplate('BDSP_Atari/BDSP_yuke.png', threshold=0.9, use_gray=True, show_value=False)):

				# リセット動作 (ここの動作が不安定な場合カッコ内の一番右の数字を大きくしてください)
				print("通常色なのでリセットします…")
				self.press(Button.HOME, 0.4, 1)
				self.press(Button.X, 0.3, 1)
				self.press(Button.A, 0.3, 1)

				# 再起動とカウントプラス(リセット動作と同様)
				print("ゲームを再起動するよー")
				self.press(Button.A, 0.3, 1)
				self.press(Button.A, 0.3, 1)
				count += 1


			# 色違いが出現した場合の動作
			else:
				print("色違いがでました!!やったね!")
				print("ここまで",count,"回かかりました")
				self.finish()

以上です。

説明するとほんと簡単な動作しかしてないですが
構文エラーとだいぶ格闘してました。
ほんとプログラマーの方々はすごいと思います…。

ダウンロード

動作上フィールドを移動するポケモン(クレセリア等)には
 対応していません
言語は漢字ひらがなのみ対応しています
・バグが見つかったら報告していただけると嬉しいです

早速うまく動作しない箇所が見つかったので修正しました。v1.1
各数値の微調整 v1.2

前提

poke-conを用いた画像認識が使える環境があることが必須となります。
導入に関しては「ポケコン導入 arduino」等で検索すると
わかりやすく解説されているページがあるのでそちらを参照してください。

使用方法

「BDSP_Atari.py」を下記のフォルダへ格納する
  Poke-Controller-master\SerialController\Commands\PythonCommands

「BDSP_Atari」という名前のフォルダを下記へ格納する 
  Poke-Controller-master\SerialController\Template

固定シンボルの正面もしくは上に何歩か進むと戦闘が始まる状態にして
レポートを書きコマンドを実行してください。
BDSP 色違い厳選自動化」と書かれたコマンドが本プログラムです。

この位置

あとがき

やりたかったことができて満足ですが
ハマナスパークの石板のために謎のかけらを集めるのが大変…
今度はこっちを自動化してみたい
理想は寝てる間や仕事の間、必要分掘り終えるまで動作してくれるような…
またプログラム勉強してできそうだったら挑戦してみたい

ということで以上となります。見てくださりありがとうございました。


この記事が気に入ったらサポートをしてみませんか?