【BDSP自動化04】特性「ものひろい」自動化【ふしぎなアメ・ぎんのおうかん】
こんにちは。ますたーです。
今回は、特性「ものひろい」による道具集めを自動化しました。
ダイパリメイク自動化の記事、第4弾になります。
なお、Arduino Leonardo自動化の導入・機材構成については導入記事を参考にしてください。
導入記事:【Arduino自動化01】Arduino開発環境の導入
※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。
概要
とくせい「ものひろい」による道具集めを自動化しました。条件付き*1・低確率ながら「ぎんのおうかん」「ふしぎなアメ」などを自動で収集することができます。実測値として、筆者は約13時間放置で「ぎんのおうかん」9個が入手できました*2。
目次です。
手動で周回する方は→効率的な「ぎんのおうかん」の集め方まで、プログラムのソースコードだけ欲しいという方は→ソースコードまで、それぞれ読み飛ばしてください。
- 概要
- 「ぎんのおうかん」「ふしぎなアメ」を量産したい!
- 特性「ものひろい」で、「ふしぎなアメ」が1%~の確率で拾える
- 効率的に野生ポケモンと出会うには「あまいかおり」
- 効率的な「ぎんのおうかん」の集め方(ものひろい周回方法)
- Arduino Leonardoによる自動化の準備
- ソースコード
- プログラムのあとがき(テクニカルな人向け)
- あとがき
「ぎんのおうかん」「ふしぎなアメ」を量産したい!
まずは、目的の整理から。
言わずもがな、「ぎんのおうかん*3」や「ふしぎなアメ」は、対戦用ポケモンの育成およびレベル上げに欠かせないアイテムです。しかし、今作は、ポケモン剣盾と違い、「ぎんのおうかん」や「ふしぎなアメ」の入手手段が非常に限られています。正攻法で複数入手するためにはいずれもバトルタワーの周回が必須です。
対戦初心者やエンジョイ勢にとってバトルタワーは敷居が高く、挑戦するのも大変ですし、「最初の挑戦のための3匹/4匹育成」も一苦労です。また、ぎんのおうかんは「25BP」・ふしぎなアメは「20BP」と、それぞれ決して安くはない絶妙な交換レートとなっており、日常的にバトルタワーを攻略している人以外は、気軽に交換できるものとは言えません。
一方、バトルタワー「以外」での複数入手方法としては、特性「ものひろい」が挙げられます。特性「ものひろい」であれば、野生ポケモンやトレーナーとの戦闘を行うだけで良いため、比較的気楽です。また、確率入手とはなりますが、副次的に換金アイテムや進化アイテムなど、別アイテムの収集も一緒に行えるため、旨味も大きいです。
したがって、今回は「ものひろい」による道具集めに着目して、道具の効率的な収集を目指していきます。バトルタワーの周回は目を離すわけにいきませんし、相手が結構強いのがストレスなんですよね。
特性「ものひろい」で、「ふしぎなアメ」が1%~の確率で拾える
まずは、特性「ものひろい」についておさらいです。すでに知っているよ!という方は→効率的に野生ポケモンと出会うには「あまいかおり」まで読み飛ばしOK。
「ものひろい」とは、「戦闘終了後に10%の確率で何かしらの道具を拾ってきてくれる」効果を持つ特性で、拾ってきてくれるアイテムはそのポケモンのレベルによって決まっています。例えば、Lv.32のポケモンなら「Lv.31~Lv.40」のアイテムテーブルからランダムに拾ってきてくれます。
「ものひろい」で拾えるアイテムの一覧
下記の表が、レベルごとに拾えるアイテムの一覧ですが、要するに
- 「ふしぎなアメ」はLv.11以上で拾える(確率は1%。Lv.51超なら確率は4%~5%)
- 「ぎんのおうかん」はLv.71以上で拾える(確率は1%)
ということを抑えておけばOKです。
どうぐ | ~Lv.10 | ~20 | ~30 | ~40 | ~50 | ~60 | ~70 | ~80 | ~90 | ~100 |
---|---|---|---|---|---|---|---|---|---|---|
キズぐすり | 35% | |||||||||
ちいさなキノコ | 25% | 8% | ||||||||
むしよけスプレー | 8% | 30% | ||||||||
いいキズぐすり | 8% | 8% | 30% | |||||||
ピッピにんぎょう | 8% | 8% | 9% | 30% | ||||||
おおきなキノコ | 3% | 8% | 9% | |||||||
シルバースプレー | 3% | 8% | 9% | 9% | 30% | |||||
なんでもなおし | 3% | 4% | 8% | 9% | 9% | 30% | ||||
げんきのかけら | 3% | 4% | 3% | 8% | 9% | 10% | 30% | |||
すごいキズぐすり | 3% | 4% | 3% | 4% | 8% | 9% | 10% | 30% | ||
ピーピーエイド | 1% | 1% | 3% | 4% | 4% | |||||
ゴールドスプレー | 4% | 3% | 4% | 4% | 9% | 9% | 10% | 30% | ||
やみのいし | 4% | 3% | 4% | 4% | 4% | 4% | 5% | 9% | 10% | |
ひかりのいし | 4% | 3% | 4% | 4% | 4% | 4% | 5% | 9% | 10% | |
めざめいし | 4% | 3% | 4% | 4% | 4% | 4% | 5% | 9% | 10% | |
ふしぎなアメ | 1% | 1% | 1% | 1% | 4% | 4% | 5% | 4% | 5% | |
きんのたま | 3% | 4% | 4% | 4% | 4% | 5% | 4% | 5% | ||
まんたんのくすり | 3% | 4% | 4% | 4% | 9% | 9% | 8% | 30% | ||
ピーピーリカバー |
1% | 1% | 4% | 4% | 4% | |||||
ポイントアップ | 1% | 1% | 1% | 4% | 4% | 5% | 4% | 5% | ||
あかいいと | 1% | 1% | 1% | 1% | 1% | 1% | 1% | 1% | ||
たべのこし | 1% | 1% | 1% | 1% | 1% | 1% | 1% | 1% | ||
メンタルハーブ | 1% | 1% | 1% | 1% | 1% | 1% | 1% | 1% | ||
パワフルハーブ | 1% | 1% | 1% | 1% | 1% | 1% | 1% | 1% | ||
しろいハーブ | 1% | 1% | 1% | 1% | 1% | 1% | 1% | 1% | ||
げんきのかたまり | 4% | 4% | 4% | 4% | 9% | 9% | 9% | |||
ピーピーエイダー | 1% | 1% | 4% | 5% | 4% | 5% | ||||
ピーピーマックス | 1% | 1% | 4% | 5% | ||||||
ぎんのおうかん | 1% | 1% | 1% |
レベル91~100が「ものひろい」の最高効率
前節では、レベル11以上で「ふしぎなアメ」、レベル71以上あれば「ぎんのおうかん」が拾えることを紹介しました。
上記の表からも明白ですが、「ものひろい」の特性をもつポケモンのレベルが高いほど、拾えるアイテムの内容が充実してきます。そして、言わずもがなレベル91以上の時のアイテムリストが最も充実しています。
また、Lv.91~100は、ラインナップも然ることながら、それぞれの入手確率も極大値を取ります。具体的には、「ひかりのいし」「やみのいし」「めざめいし」の確率がそれぞれ10%まで跳ね上がったり、「ふしぎなアメ」「ポイントアップ」がそれぞれ5%になったりします。進化アイテムや育成に必要なアイテムが10~20回に1度の割合で入手できる、ということですね。
要するに「ものひろい」の要員はなるべく高レベルが望ましい、ということです。
効率的に野生ポケモンと出会うには「あまいかおり」
さて、ここからは「ものひろい」の発動条件である戦闘についてです。あくまでも余談ですので、不要な方は→「効率的な「ぎんのおうかん」の集め方」まで読み飛ばす。
「特性『ものひろい』の発動条件」と書くと仰々しいですが、要するに「トレーナーとバトル」または「野生ポケモンとバトル」でOKです。
トレーナーとの再戦はBDSP自動化01(自動お金稼ぎ)でもお世話になった「バトルサーチャー」を使うことで実現できますが、「チャージ歩数がかかること」「確率で再戦に応じてくれない場合があること」を鑑みると、試行回数を稼ぎたい「ものひろい」用途には不適と言えます。
そこで、野生ポケモンとの戦闘に軍配が上がりますが、エンカウントの度に草むらを走り回るのは非常にストレスです。特に、狭い草むらになると、意図せず草むらから出てしまったり、自転車の動きが遮られるなどの阻害要因があるからです。また「すごいつりざお」など、その場を動かずに野生ポケモンとエンカウントする方法もありますが、最大でも5割しかエンカウントできず、シビアなボタン押下が要求される点がマイナスです。これらは共通して「目が離せない」という欠点を抱えています。
一方、「あまいかおり」を使うと、一歩も動かずに野生ポケモンと確定でエンカウントができます。すなわち、効率的なエンカウントが可能です。
手順としては、手持ちポケモンを開いて「あまいかおり」を使うだけのわずか2ステップですし、2回目以降は「秘伝技エフェクト」がスキップされるため、まさに誂え向きと言えます。
効率的な「ぎんのおうかん」の集め方(ものひろい周回方法)
以上の話を踏まえると、手持ち6匹を「ものひろい」で埋めつつ、「あまいかおり」が使えるポケモンを用意するのが最高効率であると言えます。
まずは「ものひろい」要員5匹と「あまいかおり」要員1匹を準備
BDSP環境において、比較的入手が容易な「ものひろい」持ちポケモンは、「パチリス」「エイパム」「ヒメグマ(シャイニングパールのみ出現)」などが挙げられます。地下大洞窟のポケモンは出現時のレベルも高く、拾えるアイテムがレベルに依存する「ものひろい」要員としてはまさにうってつけです。
特にパチリスは入手が容易であり、レベルにこだわらなければ「たにまのはつでんしょ」で簡単に出会うことができます(出現率25%)。
なお、特性「ものひろい」のポケモンはすべて2種類以上の特性をもつため、捕まえたら必ず特性を確認しておきましょう。ものひろいの「つもり」だった、では時間がもったいないです。
「あまいかおり」要員には「ヒメグマLv.100」が最適解
「あまいかおり」はほとんどの植物ポケモンが利用可能です。BDSPだと、ノモセ大湿原で出会える「マスキッパ」や、比較的序盤で手に入りやすい「ロゼリア」「ミツハニー」などがレベルわざとして習得可能です。ただし、数ある「あまいかおり」要員の中でも、特筆すべき採用候補は「ヒメグマ」でしょう。
ヒメグマは、BDSPにいるポケモンの中で唯一、特性「ものひろい」と「あまいかおり」を両立できるポケモンです*4。シャイニングパール版でのみ「岩石の空洞」に低確率で出現します。残念ながらブリリアントダイヤモンドでは出現しませんので、パール版から連れてくるか、あまいかおり要員を1匹と割り切るか(=ものひろいを5匹でやるか)が必要です。
地下大洞窟でのエンカウントになるため、殿堂入り後であれば初期レベルも60超と高く、オススメです。なお、「あまいかおり」はLv.22で習得可能なため、捕まえたらノモセシティの「技思い出し」で「あまいかおり」を思い出させてあげましょう。
ただし、「リングマ」に進化すると特性が変わってしまいますので、ヒメグマを利用する場合は、進化させないように注意しましょう。もっとも、「ものひろい」要員として利用する所以で「かわらずのいし」をもたせることはできないため、Lv.100まで育てるのが大変であれば、無理にヒメグマを使う必要はありません(あまいかおり要員として割り切って使いましょう)。
あとは序盤の草むらでひたすら周回
ここまで準備ができれば、あとは簡単。
201番道路など、野生ポケモンのレベルがあまり高くなく、こちらの攻撃でワンパンで倒せる場所に向かいます。この時、使うわざは命中100または必中技を使い、必ず1撃で倒せるようにしておきましょう。
草むらに入ったら、「あまいかおり」を使って野生ポケモンをおびき寄せ、それをひたすら倒し続けます。一連の流れを大体4~5回繰り返したら、手持ちポケモンのどうぐを回収しましょう。
あとは、これをひたすら繰り返すだけです。
前述の通り、「ものひろい」で拾えるアイテムは、そのポケモンのレベルが参照されますので、「ぎんのおうかん」を集めるためには、少なくともLv.71以上で周回をしましょう。「ものひろい」6匹で、1~2時間ほどで1個の「ぎんのおうかん」が手に入ります。
なお、手持ちポケモンのPPが無くなったら、Yボタンでコミュニケーションルームに入る(レポートを書くかの確認でBボタン)ことで、道具を消費せずにその場で回復することができますので活用しましょう。
Arduino Leonardoによる自動化の準備
おまたせしました。ここからはプログラムを使った自動周回の方法について解説です。
とは言っても、上記の手順をプログラムで実装しているだけなので、大きな準備は手動周回のときと変わりません。ソースコードの冒頭に書き換えができる場所がありますので、それに合わせて修正いただくだけでOKです。
手持ちの「あまいかおり」要員と「ものひろい」要員の位置を入力
まずは、手持ちポケモンに「あまいかおり」要員1匹と「ものひろい」要員を準備します。そして、そのポケモンの手持ちでの順番に応じて、プログラムを書き換えます。
具体的には、「あまいかおり」が使えるポケモンが何匹目かをAMAI_KAORIに1~6で指定します。また、手持ち6匹について、それぞれの特性が「ものひろい」かどうかを配列monohiroiに「true」または「false」のいずれかで入力していきます。
なお、特別な事由がない場合は、「ものひろい」の要員は5匹または6匹集めておくことを強くオススメします。また、あまいかおり要員は何匹目でも構いませんが、「きりばらい」「あなをほる」などのフィールドで使える技を複数持っていないことが前提となります。
先頭ポケモンの1つ目のわざ「PP」を入力
続いて、先頭(1匹目)のポケモンの1番目のわざのPPをプログラムに入力します。
使う技は、必ず命中100または必中技を使うようにしてください。
これにより、PPが0になった時に、Yボタンから「コミュニケーションルーム」に入ってPPの回復を行ってくれます。
周回の単位回数(アイテム収集の周期)を入力
続いて、何試行ごとに手持ちポケモンのどうぐを回収するかを「NUM_OF_BATTLE」に数字で入力してください。手持ち6匹が「ものひろい」であれば、オススメは「4」です。理由は後述します。
「ものひろい」の発動確率は1匹につき10%ずつですから、手持ちの「ものひろい」要員の数や、確率のお好みに応じて調整してください。参考までに、戦闘回数ごとの、「ものひろい」の発動確率を下図の通り、計算してまとめてみました。
少なくとも1個以上のアイテムを拾うためには、特性「ものひろい」を6匹集めて「4回」の戦闘をこなすことで、確率が9割を超えます。同様に、「ものひろい」が5匹しかいない場合でも、「5回」の戦闘を行えば、確率が9割を超えます。この数字を参考に、NUM_OF_BATTLEをご決定ください。
戦闘時間を入力
基本的に戦闘中はA連打で周回をしていきますので、充分に長い時間を入力してください。戦闘前の主人公カットインや、登場時のジャンプ(なつき)、色違いエフェクト・「いかく」などの発動特性、「こちらを向いてうなずいた」「きゅうしょにあたった!」「褒めてもらおうときゅうしょに当てた!」「こうかはばつぐんだ!」などなど、あらゆる遅延を考慮して十分に長い数字を入力してください。
特に「レベルアップ」とそれに伴う「進化」「技覚え」などが発生する恐れがある場合は、これらも想定いただき、ご利用いただければと思います。極力、各ポケモンのレベルは100にしておき、余計な時間がかからないようにしておきましょう。
自動化にむけてゲーム側の準備
最後に、下記を確認すればOKです。
- 「あまいかおり」が使える条件下である(草むらの中・雨などが降っていない)こと
- 目の前に話しかけられるもの・人・ポケモン(連れ歩き含む)などがいないこと
- Xボタンでメニューを開いた時に「ポケモン」にカーソルがあっていること
- Yボタンでコミュニケーションルームに入れる(ポケセン地下1階を訪れておく)こと
ソースコード
ソースコードです。Xボタンで「ポケモン」にカーソルが合う状態でArduino Leonardoを挿せば動きます。
基本的には、手動周回と同様の準備が必要です。概要はソースコード冒頭のコメントに記載の通りです。よくわからなければ本ブログ記事を見返して修正の上、ご使用ください。
プログラムのあとがき(テクニカルな人向け)
※プログラムに興味無いよ、という人は→あとがきまで読み飛ばす。
普段、私はC言語などについてブログで書くことはめったに無いのですが、実装中に大きなコーディングミスをしたので忘備録として残します。C言語を普段から触っている人・読める人は「何をいまさらww」と思われるかもしれませんが、私は趣味なので…大目に見てください。
仮引数の配列はsizeofで要素数が計算できない
結論から言うと、配列のサイズをsizeof演算子で計算できるのは、配列を宣言したスコープ内に限られる、という言語仕様(よく考えれば当たり前)に注意しましょう、ということです。より厳密には、sizeofにポインタを与えると、そのサイズを計算する、ということです。具体例を交えます。
(意図通りに動かないプログラム:配列の長さを、外部の関数内で計算しようとしている)
このソースコードでは、main関数内で定義された配列「array」を、外部の関数void print_int_array()に渡し、要素を1つずつprintfで印字(しようと)しています。
print_int_arrayの中では、引数の配列のサイズ(長さ)が分からないため、sizeof演算子を駆使して、配列arrのメモリサイズを、同じく配列arrの要素1つ分のサイズで除することで配列長を計算(しようと)しています*5。一見、うまくいきそうです。
しかしながら、これが意図通りに動作しません。
理由は明白で、仮引数「arr」の実態がintのポインタであり、それ以上の情報がないからです(arrという名前がミスリードを誘いますが、仮引数の名前が「int *ptr」だったら気付ける仕様ですね)。
もっと詳しく言えば、この実装において「sizeof(arr)」で計算されるのは、配列のメモリ上の長さではなく、int型のポインタのサイズになるからです。つまり、上記の1行は、下記と同等であると言えます(これを見れば、意図どおりでは無いことが明白です)。
sizeof(arr)と書いていた部分が、sizeof(int*)に書き換わっています。これは、「arr」の宣言が、配列ではなく仮引数として指定したポインタだからです。この一文の計算結果は、その環境(アーキテクチャ)によりけりですが、少なくとも、(意図した)arrの情報同士を比較しているわけでは無いので、正しくないことは自明ですよね。
つまり、この仕様を踏まえると、外部の関数に配列を渡したら、その関数からはその配列の長さを知る術は無い、ということです。冷静に考えれば、だからこそ文字列には終端記号(\0)が入るわけですし、ポインタもNULLが用意されているのですよね。このあたりの理解が浅かったなぁ、と反省しました。
ちなみに、上記のプログラムを意図通りに動くように実装するには、下記のように、配列を定義したスコープ内でsizeofを使うほかありません。
(意図通りに動くプログラム:配列を定義したスコープ内でsizeofを使って配列長を計算)
結論、何がまずかったのかといえば、「『sizeof(配列名) / sizeof(配列名[0]);』で、配列の長さが計算できる!」と(プログラマが)盲信していることです。特に、プログラミング解説サイトが有象無象に乱立する現代において、上記の認識で説明・紹介をするサイトもいくつか見受けられるので、注意が必要です*6。
なぜ気づいたか
今回、loop()にベタ打ちで書いていた処理をすべて関数にして、可読性を上げようとしたのが発端でした。
手持ちポケモンの「ものひろい」要員かどうかを判別する配列「bool monohiroi[]」の要素数、すなわち手持ちポケモンの数が「6匹」とは限らない場合を想定し、上記と同様の実装でpickItems()関数を実装した時に、何故か「2匹分しか道具を回収してくれない」という事象が発生したのです。
Arduinoには数字を表示したりするディスプレイが無いため、プログラミングにおけるデバッグ作業は動いている様子から確認するしかありません。6回のループが回る「はず」の部分で、5回や7回ならループ判定、0回なら条件判定部分、1回ならループカウンタ、といった具合に、実装エラー箇所が特定できるのですが、今回は決まって「2回」という中途半端な回数であり、少し悩みました。一方で、「ループ回数」を指定しているソースは当該sizeof演算子で記述した部分しかなかったため、これについて、C言語の関連仕様をWebで調べて読み直し、上記を理解できました。
上記を踏まえると、2回ループが回っていたことからArduino Leonardoのint型は2byte、ポインタは4byteの実装系だと推察できます。現に過去、筆者のコーディングミスによりint型の最大値は32767で2byteだったことが判明したことからも、おそらく、そういう仕様なのだろうと思われます。
以上の知見は、見る人が見ればためになるかも、と思いつつ、今後自分が同様のミスをしないよう、ここに「あとがき」として記載しておきます。
あとがき
今回はダイパリメイク自動化第4弾として、「ふしぎなアメ」「ぎんのおうかん」「ポイントアップ」の無限回収を実装しました。いやぁ~ついにできました!
これでやっと地獄のようなBDSP厳選環境から脱出できますね…!(厳選も育成もまだ0匹。やっとやる気が出てきます←おい)
育成環境を整えるために「バトルタワーに挑戦」する、というのが非常に億劫でして、なかなか殿堂入り後のシナリオを進める気が起こらないという状況でした。特に、今は雑に「コンテスト攻略もしたいなぁ~」と思っていて、前回・前々回記事でも書いたとおり、シール用のきのみを集めたり、ふれあい広場のきのみを集めたり、といったのんびりプレイ状況でした。
その一方で、先月にはお陰様で本ブログの歴代最高PV数を叩き出し、PV数や検索流入を鑑みると、やはりというべきかBDSP環境においても「厳選」「育成」に関わる自動化を望む声も多く、それに応える形での実装を考えた、という次第でした。
確かに、今作は「レベル上げ」がかなりめんどくさい上に、「厳選」も簡単では無いことから、エンジョイ勢の自分としても「ふしぎなアメ」の増産体制を望んでいたこともあり、今回の実装チャレンジは我ながら大成功だったと思います。
今後も、ゆるっとブログを更新しつつ、自動化もチャレンジしつつ、マイペースに遊んでいけたらと思いますので、引き続きよろしくおねがいいたします。
ではではc⌒っ.ω.)っ
前回記事:【BDSP自動化03】低レアきのみ自動購入【クラボのみ】
次の記事:【BDSP自動化05】地下大洞窟でディグダ探し【ポケモンの石像✨】
導入記事:【Arduino自動化01】Arduino開発環境の導入
ポケモン剣盾の記事:ポケモン剣盾Arduino自動化 カテゴリーの記事一覧
ポケモンBDSPの記事:ダイパリメイクArduino自動化 カテゴリーの記事一覧
YouTubeチャンネル:ますたーの忘備録 - YouTube
---
*1:「ものひろい」で拾えるアイテムは、そのポケモンのレベルによって変わります。ぎんのおうかんを拾うためには、「ものひろい」のポケモンのレベルが「71以上」必要です
*2:13時間放置で「ぎんのおうかん」9個:手持ち全員Lv100・1戦闘あたり25秒・手持ち1匹目「あまいかおり」・手持ちの「ものひろい」6匹・4戦ごとにアイテム回収・20戦ごとにYY通信でHP回復の条件下での実測値
*3:ぎんのおうかん:手持ちのLv100ポケモンのどれか1つののうりょく(個体値)を「さいこう!」(最大値)まで鍛えることができるアイテム。厳密には「すごいとっくん」を行うためのアイテム
*4:余談ですが、「ものひろい」「あまいかおり」を両立できるポケモンは「ヒメグマ」が文字通り唯一無二です。剣盾はもちろん、USUM以前の環境においても他にいません
*5:同一スコープ内で宣言された配列の長さを求めるには、「sizeof(配列名)/sizeof(配列名[0])」で計算できます。例えば、int型が4byteの環境で、int array[10]で宣言したとすれば、sizeof(array)で、arrayのメモリ長=40byte, sizeof(array[0])で4byte、これらで除算すれば40/4=10で配列長が求められる、というロジックです
*6:余談ですが、sizeof演算子による配列サイズ計算にポインタを渡した実装について、一般社団法人JPCERTコーディネーションセンターがコーディングエラー例として解説しています