見出し画像

【ポケポケ】『ピカチュウex』デッキにおける たねポケモンの枚数についての考察【シミュレーション】

ピカチュウexで、最速90ダメージ、出したいんですよぉ〜〜〜!!!

ポケポケでピカチュウexデッキを使っていると、
「ピカチュウexで90ダメージを出して目の前のポケモンを倒したいのに、ベンチのたねポケモンの数が足りない!」
という場面によく遭遇します。しますよね?

ということで、ピカチュウexデッキに必要なたねポケモンの枚数を、プログラミングを使用したシミュレーションから考察してみました。


方法

Pythonを用いて、ターン終了時までの実際の挙動をシミュレーションします。(といっても私はプログラミング初心者ですので、知り合いのスシコラ使いにコードを書いてもらいました。細かな要件や使用したコードは末尾に記載しますので、興味のある方はどうぞ。)

『ピカチュウex』が最速で90ダメージを出すという状況を少し簡単に考える条件として、以下のように”条件A”を定義します。

 条件A:後攻2ターン終了時に、手札に「ピカチュウexを1枚以上含むたねポケモン4枚以上」が存在する

今回は、この条件Aを満たす確率 をシミュレーションから近似的に求めます。

結果

横軸に「デッキ内の(『ピカチュウex』を除く)たねポケモンの枚数」を、縦軸に「全試行回数のうち条件Aを満たした回数の割合」を示したのが、下記のFigure 1です。

Figure 1. デッキ内のたねポケモンの枚数と
条件Aを満たす回数の割合との関係

考察

シミュレーション結果から

Figure 1を見ると、(『ピカチュウex』を除く)たねポケモン枚数を10枚程度に増やすと、『ピカチュウex』が後攻最速で90ダメージを出せる確率が最大になると考えられます。

また、たねポケモン枚数が11枚以上になると確率が漸減していくように見えますが、これはたねポケモンを増やしすぎると最初の手札や『モンスターボール』などで山札を引く時に『ピカチュウex』を手札に引きこめる確率が減ることが原因と思われます。

大会環境から

直近の大会では以下のような、(『ピカチュウex』を除く)たねポケモン枚数が5枚のデッキレシピが多いようです。

Ursiiday's Pocket Weekly #9(2024/12/29)準優勝 Trucob氏のデッキリスト
Year-Ender: Mythical Island Showdown(2024/12/28)優勝 ArcaninosShiny氏のデッキリスト

上記のシミュレーション結果から考えると、たねポケモン5枚のデッキで後攻最速90ダメージを出すことのできるのは60%程度であり、最大である約75%の確率を出せるたねポケモン10枚入りのデッキとは構成の乖離があるようです。

この構成の乖離には、以下のような要因が影響していると考えられます。

① 他に入れたいトレーナーカードがある
このゲームには、『ナツメ』や『サカキ』、『マチス』などの強力なトレーナーカードがあり、これらのカードがたねポケモンとデッキの枠を取り合う形になります。
最近はピカチュウexデッキが流行り始めているようですので、上記のデッキリストはミラー意識の『ゼブライカ』や『きずぐすり』入りのデッキリストになっています。

② 最速90ダメージが求められていない環境
元も子もないですが、最速90ダメージの重要度が低い環境であればたねポケモンの枚数を増やす意味は薄いです。
また後述しますが、今回の記事では先攻の場合を考慮できていないので、先攻最速(3ターン目)を考えるともう少したねポケモンの枚数条件が緩くなると考えられます。
しかし、早い展開で高いダメージを出せることはピカチュウexデッキの大きな強みのひとつですので、環境や仮想敵を想定してたねポケモンの枚数を調整するのが適切かと思います。

例)最速90ダメージで吹き飛ばしたい方々

結論

以上を考えると、ピカチュウexデッキのテンポの安定感を増すには、環境に応じてプラス1~2枚たねポケモンを追加することを考慮する余地はあるかと思われます。

候補としては、『サンダーex』『デデンネ』『エレブー』あたりでしょうか。今後、優秀なでんきタイプのたねポケモンが追加されることにも期待したいところです。


補足事項等(シミュレーションの要件, 研究の限界, ソースコード)

今回のシミュレーションの要件

・『ピカチュウex』, 『博士の研究』, 『モンスターボール』は必ず各2枚ずつデッキに入れる
・『博士の研究』, 『モンスターボール』が手札にある場合は、そのターンに必ず使用する
・『博士の研究』と『モンスターボール』がどちらも手札にある場合は、先に『博士の研究』を使用する
・簡単のため、『スピーダー』『リーフ』は考慮しない
・シミュレーション回数は各たねポケモンの枚数の条件毎に10万回に設定

研究の限界

  • 後攻2ターン目に『ピカチュウex』を引いたパターンは考慮外
     このパターンでは1ターン目にエネルギーを『ピカチュウex』に付けられないため、実際は最速でワザを打てないのですが、今回のプログラムでは考慮されていません。また、『ピカチュウex』にエネルギーが足りていてもバトル場のポケモンが逃げるために『スピーダー』『リーフ』が必要な状況があり、それも今回のシミュレーションには含まれていません。ですので、実際の確率はFigure 1で示した値よりも少し下がると予想されます。

  • 先攻3ターン目は考慮外
     今回の研究では後攻2ターン目終了時のみを考察しています。先攻の最速パターン(先攻3ターン目)の場合は、1ターン目のドローの分、条件を満たせる確率は高くなります。
    これに関しては重要な情報だと思いますので、今後の研究でフォローできたらと思います。

ソースコード

〜special special thanks~
・知り合いのスシコラ使いプログラマー

曰く、「頑張りました!」とのことですので、お詳しい方は是非目を通してみてください。

import numpy as np
import matplotlib.pyplot as plt

# シミュレーション回数
N = 100000

def pokepoke_turn(DECK,HAKASE,MONBO,PIKA,tane,OTHER,turn_total):
    te = [] # 手札の初期化
    card_lst = ['博士の研究','モンスターボール','ピカチュウ','たね','その他']
    card_num = [HAKASE,MONBO,PIKA,tane,OTHER]
    # 山札の初期化
    yama = [item for item, count in zip(card_lst, card_num) for _ in range(count)]

    # 最初の手札を引く
    while(True):
        draw_0 = np.random.choice(yama, size=5, replace=False)
        if 'たね' in draw_0:
            for i in range(5):
                yama.remove(draw_0[i])
                te.append(draw_0[i])
            break
    # print("初期の手札:",te)
    # print("初期の山札:",yama)

    # turn ターン分
    for turn in range(turn_total):
        trainer = 0 # 博士の研究をそのターンに使ったかフラグ
        
        # ターン最初のドロー       
        draw = np.random.choice(yama)
        # print(f"{turn+1}ターン目のドロー:",draw)
        yama.remove(draw)
        te.append(draw)
        
        # 手札に博士の研究がある時
        if '博士の研究' in te:
            trainer = 1
            te.remove('博士の研究')
            for i in range(2):
                draw = np.random.choice(yama)
                yama.remove(draw)
                te.append(draw)
        # 手札にモンスターボールがある時
        while('モンスターボール' in te):
            te.remove('モンスターボール')
            if ('たね' in yama) or ('ピカチュウ' in yama):
                tanes = list(filter(lambda x: x in ['たね', 'ピカチュウ'], yama))
                draw = np.random.choice(tanes)
                yama.remove(draw)
                te.append(draw)
          
        # print(f"{turn+1}ターン目終了時の手札:",te)
        # print(f"{turn+1}ターン目終了時の山札:",yama)
    
    return te

def main():
    # 試すたねの枚数の最小と最大
    tane_min = 1
    tane_max = 14

    prob_lst = np.array(())
    for tane in range(tane_min,tane_max+1):
        DECK = 20 # デッキトータル枚数
        HAKASE = 2 
        MONBO = 2
        PIKA = 2
        OTHER = DECK - HAKASE - MONBO - PIKA - tane
        turn_total = 2
        
        cnt = 0 # たねが手札に4枚以上含まれる回数
        for n in range(N):
            te = pokepoke_turn(DECK,HAKASE,MONBO,PIKA,tane,OTHER,turn_total)
            tane_num = te.count("たね")
            pika_num = te.count("ピカチュウ")
            if (tane_num >= 3 and pika_num >= 1) or (tane_num >= 2 and pika_num >= 2): 
                cnt = cnt + 1
        prob = cnt / N
        prob_lst = np.append(prob_lst,prob)
    # print(prob_lst)
    # 全ターン数分を重ねてプロットするため
    x = np.arange(tane_min,tane_max+1)
    plt.bar(x,prob_lst,label=f'{turn_total}turn')
    # plt.bar(x,prob_lst)

    plt.xticks(x)
    plt.yticks(np.arange(0,1.1,0.1))
    plt.ylim(0,1)
    plt.grid(axis='y')
    plt.xlabel('number of tane(excluding pika)')
    plt.ylabel('proportion of A')
    plt.legend()
    plt.savefig(f'pika_{turn_total}turn.png',format='png')


if __name__ == "__main__":
    main()

引用

大会のデッキレシピは以下のサイトから引用しています。


では、
できたので、かえりまぁ〜〜〜す!!!

いいなと思ったら応援しよう!