u++の備忘録

【遊戯王デュエルリンクス】メテブラオートの初期手札で融合できる確率をPythonで計算 最適なデッキレシピの推定

 遊戯王デュエルリンクス*1におけるレベル上げ*2などで「メテブラオート」*3を使っていますが、スキル「バランス」*4がないキャラクターだと、少なからず手札事故で融合できないまま敗北することがあります。今回は、ランダムで配布される初期手札で融合できる確率を計算することで、できる限り手札事故が起こらないデッキレシピを推定します。

現在のデッキレシピ

 下図が、現在のデッキレシピです。感触として融合のための魔法カード*5が引けずに融合できないことが多いので、「バランス」を使用する場合よりも「融合」「フュージョン・ゲート」「融合賢者」の合計枚数を増やしています*6

f:id:upura:20170902235139p:plain

 ただし今回、例外的に「青竜の召喚士」*7はデッキの安定化のために3枚固定で入れることにします。また「サンダードラゴン」*8は当然3枚入れるのが良いため、3枚で固定します。

現在のデッキレシピにおいて初期手札で融合できる確率

 計算に用いたコードは、GitHub*9で公開しています。

デッキレシピの定義

# deck_list
deck_list = []
FUSION_CARD_NUM = 6 # 融合のための魔法カード
THUNDER_DRAGON_NUM = 3 # サンダードラゴン
RED_EYES_NUM = 3 # レッドアイズ
METEO_DRAGON_NUM = 2 # メテオドラゴン
SUMMONER_NUM = 3 # 青竜の召喚士
FUSION_SUPPORT_NUM = 3 # 融合呪印生物(指定された融合素材の片方の代わりにできるカード)
card_list = {"FUSION_CARD": FUSION_CARD_NUM,
             "THUNDER_DRAGON": THUNDER_DRAGON_NUM,
             "RED_EYES": RED_EYES_NUM,
             "METEO_DRAGON": METEO_DRAGON_NUM,
             "SUMMONER": SUMMONER_NUM,
             "FUSION_SUPPORT": FUSION_SUPPORT_NUM}

def deck_list_init():
    for card in card_list:
        for i in range(card_list[card]):
            deck_list.append(card)

初期手札の配布

 先攻の場合は初期手札が4枚、後攻の場合は5枚です。先攻か後攻かはランダムで決定します。

def first_hand_init():
    if np.random.rand() > 0.5:
        first_hand_num = 4
    else:
        first_hand_num = 5
    return random.sample(deck_list, first_hand_num)

融合できるか否かの判定

def can_fusion(first_hand):
    if "FUSION_CARD" not in first_hand:
        return False
    elif "THUNDER_DRAGON" in first_hand:
        return True
    elif "RED_EYES" in first_hand:
        if ("METEO_DRAGON" in first_hand) or ("FUSION_SUPPORT" in first_hand):
            return True
        else:
            return False
    elif "METEO_DRAGON" in first_hand:
        if ("RED_EYES" in first_hand) or ("FUSION_SUPPORT" in first_hand):
            return True
        else:
            return False
    else:
        return False

N回デュエルし、初期手札で融合できる確率を計算

def duel():
    deck_list_init()
    first_hand = first_hand_init()
    return can_fusion(first_hand)

def calc_prob():
    DUEL_NUM = 100000
    duel_result = []
    for duel_index in range(DUEL_NUM):
        duel_result.append(duel())
    print("Fusion Success Probability:" + str(sum(duel_result)/DUEL_NUM))

calc_prob()

出力

 現在のデッキレシピにおいて、初期手札で融合できる確率は約59%でした。乱数を使っているので、多少の数値は変動します。

Fusion Success Probability:0.59219

デッキレシピの調整

 続いて、上記の「デッキレシピの定義」に当たる部分をいろいろ変えながら、確率の変化を探索します。ここでもコードを書こうかと思ったのですが、あまりパターンがなく何を増減するかが若干複雑でコードを書く方がむしろ大変かと思ったので、手作業で判断しました。

 最初に、融合のための魔法カードの枚数を4~9枚で変動させてみました。上述したように「青竜の召喚士」と「サンダードラゴン」は3枚固定し、その他のカードをバランスを考えながら減らしています。

FUSION_CARD_NUM 4 5 6 7 8 9
THUNDER_DRAGON_NUM 3 3 3 3 3 3
RED_EYES_NUM 3 3 3 2 2 2
METEO_DRAGON_NUM 3 3 2 2 2 2
SUMMONER_NUM 3 3 3 3 3 3
FUSION_SUPPORT_NUM 4 3 3 3 2 1
Fusion Success Probability 0.507 0.561 0.592 0.601 0.604 0.591

 表の一番下の列の結果から、融合のための魔法カードの数は7、8枚が良さそうだと分かります。そこで、融合のための魔法カードの数が7、8枚のパターンを詳細に調べてみます。

FUSION_CARD_NUM 7 7 7 8 8 8 8
THUNDER_DRAGON_NUM 3 3 3 3 3 3 3
RED_EYES_NUM 3 3 2 3 3 2 2
METEO_DRAGON_NUM 3 2 2 3 2 2 1
SUMMONER_NUM 3 3 3 3 3 3 3
FUSION_SUPPORT_NUM 1 2 3 0 1 2 3
Fusion Success Probability 0.591 0.602 0.601 0.572 0.591 0.604 0.590

 この結果、表の右から2番目の列の組み合わせが最も確率が高そうだという結果が出ました。

おわりに

 こういう結果が得られたのは良いのですが、僕は「フュージョン・ゲート」を2枚、「融合賢者」を1枚しか持っていないので、自分で計算した最適なデッキレシピが組めません……。あと1枚ずつ手に入れたい(┐「ε:)_

*1:www.konami.com

*2:このスマホアプリでは、レベルアップのために多くの回数デュエルすることで経験値を稼ぐ必要がある

*3:このスマホアプリ内ではオートで戦うモードが有り、そのモードで使いやすい「メテオ・ブラック・ドラゴン」という融合モンスターの召喚に特化したデッキのこと

*4:初期手札にモンスターと魔法・罠がバランスよく入るため融合しやすい状態を作る効果を持つ

*5:緑色のカード。融合モンスターを出すためには、指定されている融合素材モンスター2枚以上と融合のための魔法カードを揃える必要がある

*6:バランスを使用する場合は魔法カードの合計枚数を5枚にするのが一般的

*7:appmedia.jp

*8:appmedia.jp

*9:github.com