2021/09/07

【ポケモン剣盾×Arduino_12】草むら色違い厳選自動化(画像認識無し)

※本記事は、ポケモン剣盾の草むらなどに無限湧きするシンボル、ランダムエンカウントする野生ポケモンついて、色違いが出現するまでの周回を自動化するプログラムについて解説した記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

 

本記事では、 画像認識等は行わず、マイコン単体(Leonardo)での自動化となります。厳選するポケモン、場所に合わせて微調整する必要があり、また画像認識よりも効率は落ちるのでご了承ください。

 今回は、設定例として一礼野原の草むら、特に「クレッフィ」の厳選を行いました。

 

2021/10/06追記:色証厳選プログラムとして他に、「固定シンボル」の厳選プログラムも公開しております。欲しいポケモン(+その進化前)の出現場所を確認し、「固定シンボル」と「草むらシンボル」のうち厳選しやすい方法を選んでください。

 

本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。


 

きっかけ、動機

第9回の自動化にて、固定シンボルの色違い厳選を行いました。空を飛ぶで行くことのできる場所から近い位置に出現する固定シンボルについて、メタグロスなどの色違い厳選が可能となりました。やる気さえあれば、様々なポケモンの厳選が可能です。

一方で、すべてのポケモンを厳選できるわけではなく、ポケモンの移動速度や出現箇所による効率の低下や、そもそも固定シンボルとして出現しないなどの制約も多くなります。

 

今回はクレッフィの厳選をすることにしました。出現箇所を調べてみると固定シンボルとして出現しないポケモンであり、固定シンボル厳選自動化を流用することができませんでした(一礼野原にて草むらシンボル5%)。そこで、草むらでの色違い厳選の自動化を新たに作成することとしました。

これで何ができるの?

草むらや洞窟、水上などにシンボル、ランダムエンカウントするポケモンに対して、

 フィールドで約1秒移動を行う
→色違い意外と戦闘に入ったら逃げる
 /エンカウントしなかったらメニューを開いて戦闘に入らないようにする
→1秒移動→・・・

を繰り返します。そして戦闘時は、色違いの光るエフェクトが発生した場合のラグ(約2秒)を利用して動作を分岐させ、自爆技等で瀕死になることで次のポケモンの選択画面に移動し、ループが途切れるようにしています(第04回の記事のレジ系などと同様)。

一礼野原の場合、1周40秒程度でエンカウントします(うち目的のクレッフィは半数程度)。画像認識等を使っていないため効率は劣りますが、マイコン単体で自動化するため、自動化中のPCの起動などが必要ありません。


原理、おおまかな流れ

概要

本プログラムでは、

 フィールドで約1秒移動を行う(移動パート
色違い意外と戦闘に入ったら逃げる(戦闘パート
 /エンカウントしなかったらメニューを開いて戦闘に入らないようにする(メニュー待機パート
1秒移動→・・・

を繰り返し、草むらなどに出現する野生ポケモンとの戦闘を繰り返し行います。戦闘で色違いが出現した場合にループが途切れるようにしました(戦闘待機パート)。

 

今回公開するプログラム公開では、

「1秒の移動~戦闘、逃げる」を1ループとして行ったVer.1.0と、

効率化のために移動頻度を2倍にしたVer.2.0をそれぞれ作成しました。

以下では、Ver.1.0を基準に移動パート(非戦闘時①)」、「戦闘パート(戦闘時)」、「メニュー待機パート(非戦闘時②)」、「戦闘待機パート(色違い出現時に分岐)」に分けて説明します。最後に「Ver.2.0での変更点」を説明します。

 

移動パート (非戦闘時)

移動パートでは、1ループ当たり約1秒だけ移動を行います。この1秒間にエンカウントを行うことで、色違いの光るエフェクト約2秒の有無を判定できるようにします。 


具体的には、逃げて戦闘終了orメニュー閉じを行った直後からスティックを倒し、1秒間移動を行います。1秒の間にポケモンと接触することができれば戦闘パートに移ります。一方で接触しなかった場合はXボタンでメニューを開き、1ループが終わるまで待機します。


移動において考慮すべきことは以下のようになります。

①移動を繰り返すことにより立ち位置が大きくずれないようにする

②目的のポケモンと接触しやすくする

上記の①②を考慮することで効率や精度の向上が見込まれます。

 

今回の移動は1回あたり約1秒間行い、そのあいだに野生ポケモンと接触します。ポケモンと接触した瞬間に移動が中断されるため、1回あたりの移動距離が不規則に変化します。そのため、できるだけ単調な動きにすることが必要となります。

 

ここで候補として、以下の2通りの動きを考えていきます。

以下は自身で移動ルートを考えていた際の所感をメモしていますので参考程度にどうぞ。次のパートまで読み飛ばしてもらって構いません。最終的にはクレッフィ用としてB-2を採用しています。

 

A. 直線方向にのみ移動し、何度か動いた後に180°方向転換を行う

おそらく単調な動きとして真っ先に上がるかと思います。

試しに上、下、上、下・・・と順に動くような移動を試してみたところ、徐々に上か下にずれていき、最終的には草むらの外で移動を繰り返すようになってしまいました。

そのため、壁や崖に近い草むらで周回を行い、壁などを定位置として定期的にぶつかるようにする下4回、上5回(壁衝突)、下4回、上5回・・・など)動きをおすすめします。これにより、長時間の自動化でも草むらの外へ出てしまう可能性を減らせるかと思います。 


 また、方向転換を行う際の問題点として、自転車だと大回りしてしまうため、徐々に左右にずれていく可能性があります。そのため、少なくとも方向転換時は自転車に乗らないようにすることをおすすめします。基本的には常に歩いて移動することになるかと思います。 


別の問題点として、ポケモンによっては移動範囲になかなか近づいてこない可能性があります。対策として、口笛(Lスティック押し込み)でポケモンを呼ぶシンボルが消滅するくらい遠くまで移動するように連続で下移動などを行う、などをおすすめします。

口笛を吹く場合、自転車に乗っているとき(ベル鳴らし)は移動しながら可能ですが、歩いているときは立ち止まってしまいます。歩行時はずれを防ぐため、口笛を鳴らす1秒間は動かないままの方が調整しやすいかもしれません。

 

B. 右スティックの視点移動をしながら移動することで円を描く移動を行う

上記Aの直線運動の次に単調な動きとして、円運動が挙げられます。これについては、カメラ視点を右スティックで自由に動かすことのできるワイルドエリアやDLCエリア専用となります。

 具体的には、左スティックを→、右スティックを←に倒し続けることで円運動を行います。

ここでは、円運動として2通りの移動速度を試してみました。

 

B-1. 大きく円運動

 大きく円運動を行う、つまり左スティックを全開で倒した場合の特徴としては、

・動きが速いため、素早く動き回るポケモンや、プレイヤーに対して逃げようとするポケモンと接触しやすくなります。

・足の遅いポケモンが円の内側に出現した場合、永遠にプレイヤーに追い付けず内側に溜まってしまいます。新規湧きが少なくなる可能性があるので注意。

 

B-2. 小さく円運動

小さく円運動を行う、つまり左スティックをあまり倒さず移動速度が小さい場合の特徴としては、

・円運動の内側にポケモンが溜まることがないため、比較的安定して新しいポケモンが湧いてきます。

・移動距離はほとんどないため、自分から寄ってくるポケモンしかエンカウントすることができません。ラッキーなどのプレイヤーを見つけると逃げ出すポケモンとは基本的にエンカウントできません。

 

移動パートまとめ

 移動パートの移動ルートについては、エンカウントのしやすさやズレの小ささなどを考慮して、最終的にB-2. 小さく円運動 を選びました。自転車に乗ってゆっくり移動しつつ、ベルを鳴らしています。プレイヤーを見つけると近寄ってくる大半のポケモンに対してはこれで問題ないかと思います。

ただし、こちらはワイルドエリア等限定の方法となります。通常のガラル道路などカメラ視点変更ができない場所でやる場合は、Aを参考に作ることをおすすめします。その他、動きの遅いポケモンなどをターゲットにする場合は適宜調整してください。


戦闘パート(戦闘時)

移動パートの約1秒間で野生ポケモンとの戦闘が始まった時の説明となります。

だいたい第04回の記事のレジ系や第9回の記事の固定シンボルなどと同様、もといコピペです。最後の数文以外はそのままですので飛ばしてもらって構いません。

 

戦闘パートでは、基本的には「たたかう」「ポケモン」「バッグ」「にげる」の選択画面で「にげる」を選択して戦闘を終了します。

「にげる」を選択する操作は簡単です。「たたかう」などのコマンド画面で、

1. 十字ボタン上↑を1回押し、カーソルを「たたかう」から「にげる」に動かす

2. Aボタンを押す(うまくにげきれた!)

これだけです。

問題は、「色違いが出たときに逃げるを押してはならない」ということです。

戦闘時における、色違いと通常色とで異なる点は色違いの出現時に「キランッ★」と光るエフェクトが入る点です。

この光るエフェクトによって通常色と比較して約2秒ほど演出が長くなり、つまりは「たたかう」コマンドが表示されるまでの時間が2秒ほど長くなります。 この約2秒間のあいだにボタン入力を入れることで、色違い出現時の操作を通常時と分岐させることができます。つまり、約2秒間のあいだに入力された十字ボタン上↑が反応せずに戦闘を開始させることができます。色違い出現時の分岐した行動を待機パートとし、引き続き説明します。

 

今回の草むら厳選では、ポケモンとのエンカウントの猶予を1秒程度取っております。そのため、この1秒間のどのタイミングで戦闘が始まっても、十字ボタン上↑の入力を2秒以内に入れる必要があります。 

そして今回の注意点として、エンカウントするポケモンが様々ということがあります。ポケモンによっては「いかく」などの特性により「たたかう」までの時間がずれることが考えられます。

そこで今回は、特性「かがくへんかガス」であるマタドガスの使用を強く推奨します。化学変化ガスにより戦闘開始時の特性発動を防ぎ、かつクリアボディ等のポケモンにも「おきみやげ」を発動することができます。

 

メニュー待機パート(非戦闘時②)

移動パートの約1秒間で野生ポケモンとの戦闘が始まらなかったの説明となります。

 

色違いを光るエフェクト約2秒の微妙な時間差で判定するため、移動パートの約1秒以外での戦闘を回避する必要があります。そのための方法として、

フィールド上からメニュー画面を開き、戦闘終了の時間まで維持し続ける

こととしました。

移動パートの約1秒間の後、Xボタンを押してメニューを開きます。その後は、ループを終えて次の移動パートが来るまでメニュー画面を閉じないように維持します。

戦闘パート、メニュー待機パート、そして後述する戦闘待機パートの3種類の状況において共通のボタン操作を行うため、すべてのパートに対応するように操作を調整します。

今回の調整では、メニューを開いている最中にカーソルの上下や「ポケモン」の選択を行います。

 

左上「バッグ」 ・・・・・右上「リーグカード」

左下「ポケモン」 ・・・・・右下「設定」

と配置し、マイコン接続時は左上にカーソルがある状態でスタートしてください。

基本的には左端でカーソルが動き、左下の「ポケモン」が選択されます。

その他3か所については、万が一操作が暴走して選ばれても影響が少ないため。


戦闘待機パート(色違い出現時に分岐)

ここはすべてコピペです。飛ばし(ry

 

色違いが出現した場合に、戦闘パートから分岐させることが可能となりました。分岐させた後には、ボールを投げて捕獲する必要があります。ただし、マスターボール以外のボールで捕獲できる確率は低く、画像認識等なしに全自動で捕獲するのは現実的でないと判断しました。

そこで必要となるのは、

人間が色違いの出現に気づくまで倒したり逃げたりしない

ということです。 

ただし、マイコン自体は色違いの出現を判断できないので、移動パートと戦闘パートを繰り返します。その中で、左スティックやA、Bボタンの入力は必須となります。

戦闘時において、Bボタンを連打しても画面が切り替わらず、「たたかう」コマンド画面に移ることがない状況として、戦闘ポケモンが瀕死になり、「次のポケモンを選択」する状況を利用します。


手持ちポケモンの選択画面で唯一、先頭が瀕死した直後の状態ではBボタンを連打して画面をキャンセルすることができません。また、カーソルが瀕死ポケモン(一番上)にある場合はAボタンを連打しても選出できず、画面が切り替わりません。

つまり、戦闘ポケモンが瀕死になり、次のポケモンを選択する画面に移動することができれば、次のポケモンが選択されずにハマり続けるといった状況を作り出すことが可能となります。

このハマりが解消されないように各パートの操作を調節します。

他の固定シンボル用にプログラムを改変する場合は、わざと時間をずらしてみるなどして「次のポケモンを選択」する画面で2番目以降のポケモンが繰り出されないことを確認してください。


Ver.2.0での変更点

以上、各パートについて、移動パートと戦闘パートをベースとして作成したものがVer.1.0となります。移動パート約1秒、戦闘パート約20秒とし、ポケモンと接触できなかった時は戦闘パートの約20秒をメニュー待機パートとなるように調整しました。

 

問題点として、1ループに対して移動パートが短く、メニュー待機パートが長すぎることが挙げられました。 そこで、Ver.2.0では1ループ当たりを半分の時間である10秒とし、戦闘パートは2ループ、メニュー待機パートは1ループごとに行えるようにしました。これにより、移動頻度が2倍となるため、効率は良くなったかと思います(上の図はイメージ図です。時間などガバガバです。)。


準備、必要なもの

本スケッチでは、特に以下の準備が必要となります。

手持ちの1番目は瀕死のポケモンを置く。特性はじりょくなど特定ポケモンの出現率増加、あるいはシンクロやメロメロボディなどで目的に合わせたポケモンを出しやすくすることを推奨。(今回は入力がシビアなため、「戦闘待機パート」にてマタドガス以外にもう1匹瀕死にする必要があります。)

手持ちの2番目は特性「かがくへんかガス」のマタドガスを置く。 技は「おきみやげ」1つだけにする。また、なつき度は下げておくことを推奨。(なつき度によりモーションやテキストが増えるため。連れ歩きしないことでなつき度が増加しにくくなる

連れ歩きをしなければ、ピョンピョン跳ねるモーションをとるところまでなつき度が挙がることはないようです(最近知りました)。

・その他に捕獲用のポケモンやボールを用意

・Xボタンで表示されるメニュー画面は、左上「バッグ」、左下「ポケモン」、右上「リーグカード」、右下「設定」にする(上記「メニュー待機パート」参照)。カーソルを左上に合わせた状態で自動化を開始する。

・厳選したい場所に移動し、自転車に乗った状態で草むらなどに入る(セーブしておく)

時間を変更して天候を設定する。日付が変わると天候も変わり、ループ時間が変化する可能性があるため午前0時ごろにしておくことを推奨

 

作成したスケッチ

今回は一礼野原のクレッフィなどを対象とし、雨、日照りあるいは霧の天候で実行しました。基本的に晴れ、曇り、雷雨以外の天候(「ひざしがつよい」などのテキストが1文だけ)であればそのまま使えるかと思います。 

もしかすると、天候メッセージのない晴れと曇りだと、Ver.2.0での時間調整がさらにシビアになり、うまくいかないかもしれません。その場合はVer.1.0を使う、色違いマタドガスを使うなどしてください。

 

作成したスケッチは以下のようになります。

スケッチのファイルはこちら(Ver.2.0) 


一連の動作を確認したいのであれば、Ver.1.0も見ておくことをおすすめします。

Ver.1.0はこちら

なお、執筆者がスケッチを作成するにあたり使用した環境は以下のようになります。

・データは日本語のシールド(パッケージ版+DLCあり)


使用する言語やポケモン、あるいは本体やソフトの動作環境などによって「たたかう」が表示されるまでの時間が前後する可能性があります。

その場合はスケッチ赤字のdelayを調節してください。通常色が出現したときに、「たたかう」コマンドが表示されてから2秒以内にカーソルが「逃げる」に動く(=十字上ボタンを入力する)ようにしてください。Ver2.0の場合、2ループで1回の戦闘が終わるため、戦闘時の時間に対して半分の時間をdelayにて増減させてください。

また、大幅な時間調整が必要な場合は、「おきみやげ」をした後に「次のポケモン」でなく「逃げる」を選択することがないかを確認してください。


本スケッチを実際に使用した動画はこちら↓

 

↓Ver.1.0 (こちらの方が動作は分かりやすいです)

 
/**
* こちらはVer.1.0、安定版。エンカウントのための移動頻度が小さいため、効率化したVer.2.0を推奨
* 主に動作原理の確認用にどうぞ
* 任意の草むらにて、ランダム湧きするシンボルを無作為に厳選。
* 画像認識等は用いず、遭遇して光るエフェクトが出る約2秒の時間差で色違いを判定。
* 「ありじごく」でランダムエンカを、「じりょく」で鋼ポケモンをでやすくするなど、
* 目的のポケモンのエンカウント率を上げることを推奨。
* 戦闘時は化学変化ガスによって威嚇などの特性を無効化。
*
* 今回は一礼野原のクレッフィ厳選のために調整。
* 天候やフィールド、ROMの言語などによって戦闘時のテキスト時間が変化するため要時間調整
*
* 初期条件は以下の通り
* 1. 手持ちの1番目は瀕死のポケモンを置く。特性はじりょくなど特定ポケモンの出現率増加、
*   あるいはシンクロやメロメロボディなどで目的に合わせたポケモンを出しやすくすることを推奨。
* 2. 手持ちの2番目は特性「かがくへんかガス」のマタドガスを置く。   
*   技は「おきみやげ」1つだけにする。
*   また、なつき度は下げておくことを推奨
*   (なつき度によりモーションやテキストが増えるため。連れ歩きしないことでなつき度が増加しにくくなる)
* 3. その他、捕獲要因やボールを用意
* 4. Xボタンで表示されるメニュー画面は、
*   左上「バッグ」、左下「ポケモン」、右上「リーグカード」、右下「設定」にする。
*   カーソルを左上に合わせた状態で自動化を開始する
* 5. 厳選したい場所に移動し、自転車に乗った状態で草むらなどに入る(セーブしておく)
* 6. 時間を変更して天候を設定する。日付が変わると天候も変わり、ループ時間が変化する可能性があるため
*   午前0時ごろにしておくことを推奨
* 7. マイコンを挿して周回スタート
*/


#include <auto_command_util.h>

// 直前に1秒間移動し、戦闘を行うorエンカウントせずメニューを開いた状態を保つ
void randomEncount(){
    //エンカウントしなかった場合はメニューを開いたまま待機
    // メニューを維持するため、今後「Aボタン押した回数」「Bボタン押した回数」を調整
    // A,Bボタンを押した後は時間を長めにとるor認識されないように短い時間に連続させる

    pushButton(Button::X, 50);
    pushButton(Button::X, 1400);
    // 戦闘開始~「たたかう」が表示されるまで待機。13秒くらい?
    // 下の時間は、使用する言語、ポケモン等で多少ずれる可能性があり、delay要調整
    // 色違いのエフェクトが約2秒のため、「たたかう」が表示されて2秒以内に次の十字上↑入力がされるようにする

    // 「たたかう」表示までの時間は以下のdelay(xxx)を調整。
    // 戦闘時、ボール選択画面なら戻る

    pushButton(Button::Y, 900);
    pushButton(Button::B, 900);
    delay(300);
    // 戦闘継続しているならカーソルを「たたかう」に戻し、Aボタン押して自爆技を選択
    pushHatButtonContinuous(Hat::UP, 1500);
    pushButton(Button::A, 400);
    pushButton(Button::A, 1400);
    pushButton(Button::B, 1900);
    delay(1000);
    // 「たたかう」表示されて戦闘開始、色違い光モーションなければ十字上>逃げる
    // 色違いならば、1つめの上入力間に合わないため戦闘>自爆技で自分側瀕死
    // Aボタンを2回以上連続して押す場合は、次のポケモン選択画面で一番上以外のポケモンを繰り出さないようにする

    pushHatButton(Hat::UP, 1000);
    // 逃げる、逃げた直後(5秒後くらい)に下へ1秒進み、再びエンカウント
    // 先ほどエンカウントしていない場合、メニューを閉じてから進む
    pushButton(Button::A, 1900);

    pushButton(Button::B, 1900);
    pushButton(Button::B, 400);
    // 約0.5秒後に戦闘終了
}

// 直線移動する場合はこちらを参考に調整してください
void moveStraight(){
    //方向転換時にすれが起こるため徒歩推奨
    for(int i=0; i<4; i++){
      SwitchController().setStickTiltRatio(0, 100, 0, 0);
      delay(1500);
      SwitchController().setStickTiltRatio(0, 0, 0, 0);
      randomEncount();
    }
    for(int i=0; i<5; i++){
      SwitchController().setStickTiltRatio(0, -100, 0, 0);
      delay(1500);
      SwitchController().setStickTiltRatio(0, 0, 0, 0);
      randomEncount();
    }
}

//小さく円運動をしてエンカウント
void moveCircle(){
    //野生ポケモンから見つかりやすくするため自転車推奨
    for(int i=0; i<4; i++){
      SwitchController().setStickTiltRatio(40, 0, 100, 0);
      delay(900);
      pushButton(Button::LCLICK, 500);
      SwitchController().setStickTiltRatio(0, 0, 0, 0);
      randomEncount();
    }
    
}

void setup(){
    pushButton(Button::B, 300, 13);
    
}

void loop(){
    //フィールド画面へ戻ると同時に1秒進む
    moveCircle();
}
 

 

↓Ver.2.0  (Ver.1.0を元にループを半分に調整、作った本人も良く分からない)

 
/**
* こちらはVer.2.0、効率版。移動頻度をVer.1.0の2倍にした分、動作がちょいシビア。
* 動作確認したい場合はVer.1.0も確認しておくことを推奨。
*
* 任意の草むらにて、ランダム湧きするシンボルを無作為に厳選。
* 画像認識等は用いず、遭遇して光るエフェクトが出る約2秒の時間差で色違いを判定。
* 「ありじごく」でランダムエンカを、「じりょく」で鋼ポケモンをでやすくするなど、
* 目的のポケモンのエンカウント率を上げることを推奨。
* 戦闘時は化学変化ガスによって威嚇などの特性を無効化。
*
* 今回は一礼野原のクレッフィ厳選のために調整。
* 天候やフィールド、ROMの言語などによって戦闘時のテキスト時間が変化するため要時間調整
*
* 初期条件は以下の通り
* 1. 手持ちの1番目は瀕死のポケモンを置く。特性はじりょくなど特定ポケモンの出現率増加、
*   あるいはシンクロやメロメロボディなどで目的に合わせたポケモンを出しやすくすることを推奨。
* 2. 手持ちの2番目は特性「かがくへんかガス」のマタドガスを置く。   
*   技は「おきみやげ」1つだけにする。
*   また、なつき度は下げておくことを推奨
*   (なつき度によりモーションやテキストが増えるため。連れ歩きしないことでなつき度が増加しにくくなる)
* 3. その他、捕獲要因やボールを用意
* 4. Xボタンで表示されるメニュー画面は、
*   左上「バッグ」、左下「ポケモン」、右上「リーグカード」、右下「設定」にする。
*   カーソルを左上に合わせた状態で自動化を開始する
* 5. 厳選したい場所に移動し、自転車に乗った状態で草むらなどに入る(セーブしておく)
* 6. 時間を変更して天候を設定する。日付が変わると天候も変わり、ループ時間が変化する可能性があるため
*   午前0時ごろにしておくことを推奨
* 7. マイコンを挿して周回スタート
*/

#include <auto_command_util.h>

// 直前に1秒間移動し、戦闘を行うorエンカウントせずメニューを開いた状態を保つ
//非エンカウント時の効率化のため、ループ2周を戦闘1セットとし、非戦闘時の動く時間を2倍にする

void randomEncount(){
    //エンカウントしなかった場合はメニューを開いたまま待機
    pushButton(Button::X, 50, 2);
    delay(100);
    pushButton(Button::Y, 200);
    //Aを押した後から次の上入力を入力するまでの2秒以内に「たたかう」が表示されるようにする
    pushButton(Button::A, 1900);
    // ↓のdelayの値を調整。2ループで戦闘1回分のため、1戦闘あたりで増減させたいミリ秒の半分の値を入力
    //JPN300,Chi150,Eng400、言語などによるテキストの差で時間調整必要

    delay(300);
    // 「たたかう」表示されて戦闘開始、色違い光モーションなければ十字上>逃げる
    pushHatButton(Hat::UP, 50);
    // 逃げる、逃げた直後(5秒後くらい)に下へ1秒進み、再びエンカウント
    // 先ほどエンカウントしていない場合、メニューを閉じてから進む

    pushButton(Button::A, 300);
    pushButton(Button::A, 1000);
    pushButton(Button::B, 100, 2);
    pushHatButtonContinuous(Hat::UP, 1400);
    pushButton(Button::B, 100);
    pushButton(Button::A, 100);
    // 約0.5秒後に戦闘終了
}

//小さく円運動をしてエンカウント
void moveCircle(){
    //野生ポケモンから見つかりやすくするため自転車推奨
    for(int i=0; i<4; i++){
      SwitchController().setStickTiltRatio(40, 0, 100, 0);
      delay(900);
      pushButton(Button::LCLICK, 500);
      SwitchController().setStickTiltRatio(0, 0, 0, 0);
      randomEncount();
    }
    
}

void setup(){
    pushButton(Button::B, 300, 13);
    
}

void loop(){
    //フィールド画面へ戻ると同時に1秒進む
    moveCircle();
}
 

 

最後に

本スケッチを使用することで、色証厳選をマイコン単体、画像認識無しで行うことができます。おそらく画像認識を利用した自動化の方が時間当たりの周回効率が良いと思われますが、こちらは画像認識のためにPCなどを長時間稼働させる必要がなくなります。

以前に公開した固定シンボルの色厳選と使い分けることで、大半のポケモンの色証厳選が可能になったかと思います。固定シンボル厳選での難易度などを考慮したうえで、より効率の良い方を使い分けてもらうのが良いかと思います。

 

プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。 


Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】
by カエレバ

6 件のコメント:

  1. プログラムの公開ありがとうございます。
    早速、ver1.0を利用させて頂いたんですがポケモン戦闘時ループなどは正常に動いているのですが円移動せずにずっと右に動いています。
    どのように調整すればよいでしょうか

    返信削除
  2. ワイルドエリア限定っての読み飛ばして4番道路でやってるのが原因でした……
    すみません(´・ω・`)

    返信削除
    返信
    1. 4番道路などワイルドエリア以外で行う場合は、移動ルートを直線移動に改変してください(上下、左右移動など)。円運動よりズレが生じやすいので、定期的に壁にぶつかるなどすることでズレを制限できるかと思います。

      削除
  3. コメント失礼します
    本スケッチを検証した際に
    #include  の部分にエラーが起きてマイコンに書き込むことができないのですが原因や対処方法などはありますか?いろいろ自分でも調べたのですがわからなかったです、よければ対応お願いします。

    返信削除
    返信
    1. #include にエラーが起きるのであれば、
      ①NintendoSwitchControllフォルダがlibraries内に入っていない
      ②複数の類似するライブラリが存在するために干渉しあっている
      ③ライブラリが対応していないマイコン(UNO R3など)を使用している
      のどれかが考えられます。
      エラーメッセージを読み(検索)、librariesフォルダなどを確認してみて下さい。それでも解決しないようであれば、エラーメッセージなどを詳しく書いていただけると助かります。

      削除
  4. このコメントは投稿者によって削除されました。

    返信削除

【ポケモンSV×arduino06】道具プリンター乱数自動化(藍の円盤)

 ※本記事は、ポケモンSVの藍の円盤(DLC)にて、 道具プリンター を決まった日時に起動することで 特定のアイテム、ボールを狙って量産する操作を自動化 するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。 本記事の内...