見出し画像

【旧裏】(ウツギはかせ + オーキドはかせ)に組み込んだドロソが1ターン目の展開に与える影響

【まえがき】

  • 旧裏の最強ドロソといえばオーキドはかせとウツギはかせである

  • この最強タッグに組み合わせて相性の良いドロソとして以下が使われることが多い

    • マサキ

    • クルミ

    • ナツメの眼

  • しかしこれらのドロソが1ターン目の展開力にどの程度寄与するか定量的に調べた文献は私の調べた範囲では(多分)存在していない

  • そこで前述のドロソ, パソコン通信, およびカスミの勝負(私のお気に入りカード)のそれぞれをはかせタッグと組み合わせて1ターン目のみのシミュレーションを実施し, はかせタッグと相性の良いドロソを定量的に検討した

  • 【注意】大事なことなのでもう一度述べるがシミュレーションしたのは1ターン目のみである。2ターン目以降は進化カードが絡んで複雑なため今回は考慮していない。そのため今回の結果で2ターン目以降の議論はできないはずである(しかし本記事末尾では脳内シミュレーションをもとに議論している)。

【忙しい人向けの結論】

  • クルミ, マサキ, パソコン通信, カスミの勝負, ナツメの眼のいずれも1ターン目のドロー力に対する寄与は同程度

  • 一方で必要なカードをオーキドから保護する力に大きな差異があり, 具体的にはナツメの眼カスミの勝負>>マサキ>>パソコン通信の序列。

  • 1ターン目の展開力に差異がないのだから, ①どの程度リソースを保護したいか, ②カードに付帯する別の効果(例えばカスミの勝負ならハンデス), および③2ターン目以降の展開を考慮して最適なドロソを加えるのが良いと思う。

【その1】ウツギはかせ + オーキドはかせと相性の良いドロソを探す

  • (ウツギはかせ4枚 + オーキドはかせ4枚 + 任意のドロソ4枚)を投入した際の挙動をシミュレーションした。コードは本ページの末尾に記載した。

  • シミュレーションは個々の条件で100万回繰り返した

  • シミュレーションは先行を仮定した

  • シミュレーションは1ターン目終了までとした

  • デッキには12枚の捨てたくないカードが含まれていると仮定し(例えばぎゃくしめい, 悪エネルギーなどを想定), このうち何枚がオーキドあるいはパソコン通信によって切られてしまうのかを調べた

  • またデッキには8枚のたねポケモンが含まれており, ベンチが空いていれば手札に来た時点で強制的に場に出るように設定した。このたねポケモンを展開できた枚数についても調べた

  • 更にデッキにはいつでも使える2枚のトレーナーカード(ロケット団参上, スタジアムカードなどを想定)が含まれており, これらを1ターン目で使用できる確率も調べた。

  • 私のシミュレーションコードはカードの利用順に関してはかなりヒューリスティックであり, 正確性は保証されていない(コードを見ればお分かり頂けると思う)。したがって結果を参考にしすぎないようにお願いしたいし, 意見をコメントで頂けるととても助かります。

【その1結果】各ドロソが(ウツギ + オーキド)システムに与える影響

  • はかせ率: 初手で博士を引き込める確率

  • 切ってしまった切りたくない種類のカード: 捨てたくないのにオーキドやパソコン通信でトラッシュせざるを得なかったカード(ぎゃくしめいやプラスパワーなど)

  • 切ってしまった全ての種類のカード: トラッシュせざるを得なかったカードの総数(前述の切ってしまった切りたくない種類のカード数も含む)

  • 展開できたたねポケ数: 1ターン目終了時までに展開できたたねポケの数

  • 展開できたトレーナー数: 1ターン目終了時までに展開できたトレーナーカードの数

【その1考察】

  • 展開力に関しては個々のカードで意外と差がないという結論になった。任意にはかせを持ってこれるパソコン通信の結果が図抜けていると予想していただけに意外である。

  • これははかせ引き込み率と個々のカードでドローできる枚数とを考えるとを説明ができる。

    • マサキ, クルミ, カスミの勝負ははかせ率に殆ど差異がなく, さらにそれぞれのカードが期待値でドローできるカードの数も2枚程度(マサキはぴったり2)であるため, 同じような展開力になったと思われる。

    • ナツメの眼は自身に手札を増やす効果が無いところを高めの博士引き込み率でカバーしていると思われる。この高いはかせ引き込み率は, 初手の手札が多い状況で確実に同じ枚数をシャッフル&ドローできるからだろう(カスミの勝負もほぼ同じ枚数をシャッフル&ドローできるが確率が50%)。

    • パソコン通信は手札をむしろ減らしてしまう展開上のデメリットを, 極めて高い博士引き込み率でカバーしている。

  • 一方で, カードを保護する力については個々のカードでかなり差がある

    • まず, 当たり前だが切りたくないカードを保護する力に関してはクルミが抜けている。これは任意の捨てたくないカードを選んで山札に戻せるため。

    • 次に, 種類を問わずカードのトラッシュ枚数を減らす効果はカスミの勝負およびナツメの眼が優れていた。これはオーキドを抱え込んだ状況で, オーキドに優先してこれらのカードを打つ選択肢が取れることで, オーキドのトラッシュを抑制できるからだと考える。

    • パソコン通信はかなり悪い結果になった。パソコン通信を打つ際にトラッシュが必要なので当然である。

【その1まとめ】

  • クルミは展開力を備えつつリソース保護もできる優秀なカード。

  • ナツメの眼も今回の結果を見る限り, クルミに匹敵するほど展開力・リソース保護力共に優れるカード。

  • カスミの勝負は若干展開力に劣るものの, リソース保護力に優れる。プラパやぎゃくしめいなど切りたくないカードが多いデッキでは良いドロソだと思う。これにハンデス効果がついてくるのでお買い得(?)カードである。

  • マサキは展開力はあるもののリソース保護力が低い。切りたくないカードが多いデッキに投入する際はナツメの眼と併用したい。

  • パソコン通信はリソース保護力にかなりの問題あり。展開力も他の殿堂ポイントなしのドロソと比べて特に優れているわけではない。デッキに投入する際は1枚差しのトレーナーカードを持ってきたい, といった理由が必要だろう。

  • …というわけで, どうもナツメの眼とクルミが優秀な印象である。そこで次に(オーキドはかせ + ウツギはかせ + クルミ)または(オーキドはかせ + ウツギはかせ + ナツメの眼)システムと各ドロソとの相性について調べた

【その2】ウツギはかせ + オーキドはかせ + クルミと相性の良いドロソをシミュレーションで調べた

  • その1の結果よりクルミとナツメの眼はウツギ + オーキドシステムと相性がよさそうである。

  • ここではまず(ウツギ+オーキド+クルミ)システムと相性の良いドロソについてその1と同様にシミュレーションで検討した

【その2結果】各ドロソが(ウツギ + オーキド+クルミ)システムに与える影響

【その2】考察

  • 先程と同様に, 展開力に関しては個々のカードでほぼ差がなく, カード保護力に大きく差が生じるという結果になった。

  • 手札をトラッシュするパソコン通信はおいておくとして, マサキではそれなりの枚数をトラッシュしてしまっていることがわかる。これはせっかくクルミで減らした手札をマサキが増やしてしまうためであろう。

【その3】ウツギはかせ + オーキドはかせ + ナツメの眼と相性の良いドロソをシミュレーションで調べた

  • 続いて,(ウツギ+オーキド+ナツメの眼)システムと相性の良いドロソについてその1と同様にシミュレーションで検討した

【その3結果】各ドロソが(ウツギ + オーキド+ナツメの眼)システムに与える影響

【その3】考察

  • 先程と同様に, 展開力に関しては個々のカードでほぼ差がなく, カード保護力に大きく差が生じている(本日3回目の発言)。

  • 特筆すべきはマサキの結果。パソコン通信を除くと一番の展開力を保持しながらも, (ウツギ+オーキド+クルミ)システムに投入した際と比較して, かなりカードのトラッシュが抑制されていることがわかる。

【まとめ】

  • (ウツギ + オーキド)システムの1ターン目の展開力は今回検討したどのドロソを入れても大して変わらない。事故を減らしたいのならなんでもいいので数を投入することが大事。

  • リソース保護力を考慮すると, クルミおよびナツメの眼が優秀。特にクルミは状況を問わずに使いやすいので, まず優先されるべきカードだろう。ナツメの眼は手札が少ない状況で引き込んでしまうと詰まるのでクルミと比べると優先度は落ちる。

  • 以下には脳内予想した2ターン目以降の展開と今回のシミュレーション結果とを考慮しつつ, それぞれのコンビネーションについて語る。

    • (ウツギ + オーキド + クルミ + カスミの勝負)
      今回のシミュレーション結果中でも展開力・リソース保護力ともに優れていた組み合わせ。2ターン目以降も手札を減らすクルミと, 5枚以上に手札を増やさないカスミの勝負とが噛み合うことで常にオーキドを打ちやすい状況になり, 使い勝手はいいと思われる。懸念点はじゃんけんの勝敗の偏り。4回という少ない試行回数では中心極限定理による平均値2回への回帰も期待できず, 4回負けて全くドローできないということも十分あるうる。そのため別途若干のドロソを追加することで事故率を下げる工夫が必要かもしれない。その場合, この組み合わせは手札が減りがちなのでナツメの眼はあまり相性が良くないと思われる。マサキのメールなんかが意外と役に立つかもしれない。

    • (ウツギ + オーキド + マサキ + ナツメの眼)
      これも今回のシミュレーション結果中でも展開力・リソース保護力ともに優れていた組み合わせ。2ターン目もマサキで手札を増やしてからナツメの眼を打てるので, 使い勝手はいいと思われる。懸念点は2ターン目以降にオーキドを打てるところまで手札を減らせるかどうか。切りたくないカードが多いデッキではクルミを適宜投入する必要がありそう。

    • (ウツギ + オーキド + マサキ + クルミ)
      よく見る旧裏4点セット。今回の結果を見るに, この組み合わせは切らざるを得ないカードの枚数がどうしても多くなりがちと予想できる。これは手札を増やしながら博士をサーチするマサキと, 手札を減らしながら博士をサーチするクルミとが噛み合わないからだと思われる。マサキで手札を増やしてしまった状況でオーキドを引き込む状況を避けるためには, ナツメの眼を数枚投入することが有効だと思われる。

    • (ウツギ + オーキド + マサキ + クルミ + ナツメの眼)
      上記2つの組み合わせの欠点をカバーする美しい組み合わせ。欠点はドロソ枚数が嵩むためデッキスペースが圧迫される点。

  • 結局, 今まで散々語られてきたドロソ論とほぼ同じような結論になってしまい, かけた時間の割にあまり面白みのない記事になってしまった。先人は偉大である。しかしカスミの勝負が(あくまで期待値上は)マサキ, クルミに匹敵する展開力を備えており意外と強いということだけは述べておきたい

【使用コード】

class Field:
    def __init__(self, first, trials):
        self.deck = None
        self.hand = None
        self.side = None
        self.with_hakase = 0
        self.n_sutetakunai_trashed = 0
        self.n_others_trashed = 0
        self.n_deployed_tanepoke = 0
        self.n_deployed_trainer = 0
        self.n_oak_used = 0
        self.n_utsugi_used = 0
        self.n_kurumi_used = 0
        self.n_kasumi_no_shobu_used = 0
        self.n_masaki_used = 0
        self.trials = trials
        self.first = first
        self.param_sutetakunai_thld = 1

    def get_deck(self):
        deck = []
        deck = deck + ["オーキドはかせ"] * 4
        deck = deck + ["ウツギはかせ"] * 4
        deck = deck + ["マサキ"] * 4
       #deck = deck + ["エリカ"] * 4
        deck = deck + ["クルミ"] * 4
       #deck = deck + ["カスミの勝負"] * 4
       #deck = deck + ["パソコン通信"] * 4
        deck = deck + ["ナツメの眼"] * 2
       #deck = deck + ["新ポケモン図鑑"] * 4
       #print("ドロソ枚数:", len(deck))
        deck = deck + ["捨てたくない"] * 12
        deck = deck + ["たねポケ"] * 8
        deck = deck + ["すぐ使えるトレーナー"] * 2
        deck = deck + ["ダミー"] * (60 - len(deck))
        np.random.shuffle(deck)
        return deck

    def field_initialize(self):
        # flagをリセット
        self.flag_trainer_usable = True # トレーナー使える状況か?
        self.flag_hakase_already_counted = False # はかせはもう使われたか?
        while True:
            # デッキ初期化
            self.deck = self.get_deck()
            # 優先度をセット
            if "ナツメの眼" in self.deck:
                self.priority = [
                    "オーキドはかせ",
                    "ウツギはかせ",
                    "パソコン通信",
                    "新ポケモン図鑑",
                    "マサキ",
                    "エリカ",
                    "ナツメの眼"
                    "クルミ",
                    "カスミの勝負",
                    "たねポケ",
                    "すぐ使えるトレーナー",
                    "ダミー",
                    "捨てたくない"
                ]
            else:
                self.priority = [
                    "オーキドはかせ",
                    "ウツギはかせ",
                    "パソコン通信",
                    "新ポケモン図鑑",
                    "クルミ",
                    "マサキ",
                    "エリカ",
                    "カスミの勝負",
                    "たねポケ",
                    "すぐ使えるトレーナー",
                    "ダミー",
                    "捨てたくない"
                ]
            self.priority_computer_search = [
                "オーキドはかせ",
                "ウツギはかせ",
                "カスミの勝負",
                "マサキ",
                "エリカ",
                "クルミ",
                "ナツメの眼"
                "すぐ使えるトレーナー",
                "捨てたくない",
                "新ポケモン図鑑",
                "パソコン通信",
                "たねポケ",
                "ダミー",
            ]
            # 7枚ドロー
            self.hand = self.deck[0: 7]
            self.deck = self.deck[7:]

            # たねポケチェック
            self.pokemon = []
            tane_indices = [idx for idx, ele in enumerate(self.hand) if ele == "たねポケ"][0: 6] # 6枚以降はカウントしない
            self.n_deployed_tanepoke += len(tane_indices)
            if len(tane_indices) >= 1:
                # たねポケを場にだす
                for tanepoke_idx in tane_indices:
                    self.pokemon = self.pokemon + [self.hand[tanepoke_idx]]
                for tanepoke_idx in reversed(tane_indices):
                    self.hand.pop(tanepoke_idx)
            break
        # サイド
        self.side = self.deck[0: 6]
        self.deck = self.deck[6:]
        # 後攻なら1まい引く
        if self.first is False:
            self.hand = self.hand + self.deck[0: 1]
            self.deck = self.deck[1:]

    def use_hakase(self):
        # 両方ある
        if ("ウツギはかせ" in self.hand) and ("オーキドはかせ" in self.hand):
            n_sutetakunai, n_others = self.check_trash_by_oak()
            # 捨てたくないカードが少ないときだけオーキドを使う. そうでないならウツギを使う
            if (n_sutetakunai <= self.param_sutetakunai_thld) and (len(self.hand) <= 4):
                self.n_others_trashed += n_others
                self.use_oak()
            else:
                self.use_utsugi()
        # ウツギだけある
        elif ("ウツギはかせ" in self.hand):
            self.use_utsugi()
        # オーキドだけある
        elif ("オーキドはかせ" in self.hand):
            n_sutetakunai, n_others = self.check_trash_by_oak()
            self.n_others_trashed += n_others
            self.n_sutetakunai_trashed += n_sutetakunai
            self.use_oak()

    def check_trash_by_oak(self):
        sutetakunai_indices = [idx for idx, ele in enumerate(self.hand) if ele == "捨てたくない"]
        n_sutetakunai = len(sutetakunai_indices)
        n_others = len(self.hand) - n_sutetakunai
        return n_sutetakunai, n_others

    def use_utsugi(self):
        self.n_utsugi_used += 1
        self.hand.remove("ウツギはかせ")
        self.deck = self.hand + self.deck
        np.random.shuffle(self.deck)
        self.hand = self.deck[0: 7]
        self.deck = self.deck[7: ]
        self.flag_trainer_usable = False

    def use_oak(self):
        self.n_oak_used += 1
        self.hand = self.deck[0: 7]
        self.deck = self.deck[7: ]

    def use_kurumi(self):
        self.n_kurumi_used += 1
        self.hand.remove("クルミ") # クルミを消化
        self.hand = self.hand + self.deck[0: 2] # 2枚引く
        self.deck = self.deck[2:]
        # ドロソ以外を優先して2枚もとに戻す
        def return_specific_cards(target, returned_counter):
            while target in self.hand:
                if returned_counter == 2:
                    break
                returned_counter += 1
                self.hand.remove(target)
                self.deck = self.deck + [target]
            return returned_counter
        returned_counter = 0
        for target in reversed(self.priority):
            returned_counter = return_specific_cards(target=target, returned_counter=returned_counter)
        np.random.shuffle(self.deck)

    def use_natsume_no_me(self):
        self.hand.remove("ナツメの眼")
        # デッキにハンドをもどす
        self.deck = self.deck + self.hand
        np.random.shuffle(self.deck)
        # ハンド枚数ぶん引いてくる
        self.hand = self.deck[0: len(self.hand)] # handを上書き
        self.deck = self.deck[len(self.hand): ]
        np.random.shuffle(self.deck)

    def use_kasumi_no_shobu(self, seed):
        self.n_kasumi_no_shobu_used += 1
        self.hand.remove("カスミの勝負") # カスミの勝負を消化
        random.seed(a=seed)
        random_value = random.uniform(0, 1)
        if random_value > 0.5:
            # デッキにハンドをもどす
            self.deck = self.deck + self.hand
            np.random.shuffle(self.deck)
            # 5枚引いてくる
            self.hand = self.deck[0: 5] # handをover write
            self.deck = self.deck[5: ]
        else: #裏ならなにもおこらない
            pass

    def use_masaki(self):
        self.n_masaki_used += 1
        self.hand.remove("マサキ") # マサキを消化
        self.hand = self.hand + self.deck[0: 2] # 2枚引く
        self.deck = self.deck[2:]

    def use_erika(self):
        self.hand.remove("エリカ") # エリカを消化
        self.hand = self.hand + self.deck[0: 3] # 3枚引く
        self.deck = self.deck[3:]

    def use_shin_pokemon_zukan(self):
        self.hand.remove("新ポケモン図鑑") # カードを消化
        def put_specific_card_on_decktop(target):
            target_indices = [idx for idx, ele in enumerate(self.deck[0: 5]) if ele == target]
            non_target_indices = [idx for idx, ele in enumerate(self.deck[0: 5]) if ele != target]
            renumbered_top5 = [self.deck[idx] for idx in target_indices] + [self.deck[idx] for idx in non_target_indices]
            self.deck = renumbered_top5 + self.deck[5: ]
        # オーキドはかせ > パソコン通信 > ウツギはかせ > 新ポケモン図鑑 > クルミ > マサキの優先度で並び替える
        for target in reversed(self.priority):
            put_specific_card_on_decktop(target=target)

    def remove_specific_cards_from_hand(self, target, returned_counter):
        while target in self.hand:
            if returned_counter == 2:
                break
            if target == "捨てたくない":
                self.n_sutetakunai_trashed += 1
            else:
                self.n_others_trashed += 1
            returned_counter += 1
            self.hand.remove(target)
        return returned_counter

    def use_computer_search(self):
        # 手札枚数のチェックは外でやること
        self.hand.remove("パソコン通信")
        # 2枚捨てる
        returned_counter = 0
        for target in reversed(self.priority_computer_search):
            returned_counter = self.remove_specific_cards_from_hand(target=target, returned_counter=returned_counter)
        # オーキドかウツギを持ってくる
        sutetakunai_indices = [idx for idx, ele in enumerate(self.hand) if ele == "捨てたくない"]
        # 捨ててもいいばあい
        if (len(sutetakunai_indices) <= self.param_sutetakunai_thld) and (len(self.hand) <= 4):
            if "オーキドはかせ" in self.deck:
                self.deck.remove("オーキドはかせ")
                self.hand = self.hand + ["オーキドはかせ"]
            else:
                for target in self.priority_computer_search:
                    if target in self.deck:
                        self.deck.remove(target)
                        self.hand = self.hand + [target]
                        break
        # 捨てたくない場合
        else:
            if "ウツギはかせ" in self.deck:
                self.deck.remove("ウツギはかせ")
                self.hand = self.hand + ["ウツギはかせ"]
            else:
                for target in self.priority_computer_search:
                    if target in self.deck:
                        self.deck.remove(target)
                        self.hand = self.hand + [target]
                        break


    def first_turn_simulations(self):
        for i in tqdm(range(self.trials)):
            # 初期化
            self.field_initialize()
            while len(self.deck) > 0:
                # 1. 手札に展開用カードがあったら全部使う
                if ("たねポケ" in self.hand) and (len(self.pokemon) < 6):
                    self.pokemon = self.pokemon + ["たねポケ"]
                    self.hand.remove("たねポケ")
                    self.n_deployed_tanepoke += 1
                # 2. トレーナーが使えないなら終了
                elif self.flag_trainer_usable is False:
                    break

                # 使える状態のはかせが手元にいたらカウント
                if ("ウツギはかせ" in self.hand) or ("オーキドはかせ" in self.hand):
                    if self.flag_hakase_already_counted is False:
                        self.with_hakase += 1
                        self.flag_hakase_already_counted = True

                # [トレーナーを使っていく]
                n_sutetakunai, n_others = self.check_trash_by_oak() #手元の捨てたくないカードを確認
                if "すぐ使えるトレーナー" in self.hand:
                    self.hand.remove("すぐ使えるトレーナー")
                    self.n_deployed_trainer += 1
                # ナツメの眼がないならクルミを使う
                elif ("クルミ" in self.hand) and ("ナツメの眼" not in self.hand):
                    self.use_kurumi()
                # 手札にウツギがあってオーキドがないならマサキを使う
                elif ("ウツギはかせ" in self.hand) and ("マサキ" in self.hand) and ("オーキドはかせ" not in self.hand):
                    self.use_masaki()
                # ウツギはかせとカスミの勝負が被っているなら先にカスミの勝負を打つ
                elif ("カスミの勝負" in self.hand) and ("ウツギはかせ" in self.hand):
                    self.use_kasumi_no_shobu(seed=i)
                # カスミの勝負とナツメの眼が被っていて, 手札が5枚以下なら先にカスミの勝負を打つ
                elif ("カスミの勝負" in self.hand) and ("ナツメの眼" in self.hand):
                    if (n_others + n_sutetakunai) <= 5:
                        self.use_kasumi_no_shobu(seed=i)
                    else:
                        self.use_natsume_no_me()
                # オーキドとカスミの勝負が被っていて, 捨てる手札が少ないならならオーキドを, そうでないならカスミの勝負をうつ
                elif ("カスミの勝負" in self.hand) and ("オーキドはかせ" in self.hand):
                    if (n_sutetakunai <= self.param_sutetakunai_thld) and ((n_others + n_sutetakunai) <= 4) :
                        self.n_others_trashed += n_others
                        self.n_sutetakunai_trashed += n_sutetakunai
                        self.use_oak()
                    else:
                        self.use_kasumi_no_shobu(seed=i)
                # パソコン通信とカスミの勝負が被ったら手札が少ない場合を除いてカスミの勝負を先に打つ
                elif ("カスミの勝負" in self.hand) and ("パソコン通信" in self.hand) and (len(self.hand) >= 4):
                    self.use_kasumi_no_shobu(seed=i)
                # オーキドとナツメの眼が被っていて, 捨てる手札が少ないならならオーキドを, そうでないなら可能な限りマサキを打ってからナツメの眼をうつ
                elif ("ナツメの眼" in self.hand) and ("オーキドはかせ" in self.hand) and ("ウツギはかせ" not in self.hand):
                    if (n_sutetakunai <= self.param_sutetakunai_thld) and ((n_others + n_sutetakunai) <= 4) :
                        self.n_others_trashed += n_others
                        self.n_sutetakunai_trashed += n_sutetakunai
                        self.use_oak()
                    else:
                        while "マサキ" in self.hand:
                            self.use_masaki()
                        self.use_natsume_no_me()
                # パソコン通信とナツメの眼が被っていて, 手札が多いならナツメの眼をうつ, そうでないならパソコン通信を使う
                elif ("ナツメの眼" in self.hand) and ("パソコン通信" in self.hand) and ((n_others + n_sutetakunai) >= 5):
                    self.use_natsume_no_me()
                # はかせを使う
                elif ("ウツギはかせ" in self.hand) or ("オーキドはかせ" in self.hand):
                    self.use_hakase()
                # パソコン通信
                elif ("パソコン通信" in self.hand):
                    if len(self.hand) >= 3:
                        self.use_computer_search()
                    # 3枚より少ないなら縦引きドロソを使う
                    else:
                        if "マサキ" in self.hand:
                            self.use_masaki()
                            self.use_computer_search()
                        elif "エリカ" in self.hand:
                            self.use_erika()
                            self.use_computer_search()
                        else:
                            break
                # マサキ
                elif "マサキ" in self.hand:
                    self.use_masaki()
                # ナツメの眼
                elif "ナツメの眼" in self.hand:
                    self.use_natsume_no_me()
                # クルミ
                elif "クルミ" in self.hand:
                    self.use_kurumi()
                # カスミの勝負
                elif "カスミの勝負" in self.hand:
                    self.use_kasumi_no_shobu(seed=i)
                else:
                    break

    def print_simulation_result(self):
        print(f"はかせ確率: {self.with_hakase/self.trials*100:.01f}")
        print(f"{1/(1 - self.with_hakase/self.trials):.01f}回に1回は博士がひけない")
        print(f"捨てられた捨てたくないカードの平均枚数: {self.n_sutetakunai_trashed/self.trials:.02f} ", )
        print(f"捨てられたすべてのカードの平均枚数: {(self.n_others_trashed + self.n_sutetakunai_trashed)/self.trials:.02f}", )
        print(f"展開できたたねポケの平均枚数: {self.n_deployed_tanepoke/self.trials:.02f}", )
        print(f"展開できたトレーナーの平均枚数: {self.n_deployed_trainer/self.trials:.02f}", )
        print(f"オーキドの平均使用枚数: {self.n_oak_used/self.trials:.02f}", )
        print(f"ウツギの平均使用枚数: {self.n_utsugi_used/self.trials:.02f}", )
        print(f"クルミの平均使用枚数: {self.n_kurumi_used/self.trials:.02f}", )
        print(f"マサキの平均使用枚数: {self.n_masaki_used/self.trials:.02f}", )
        print(f"カスミの勝負の平均使用枚数: {self.n_kasumi_no_shobu_used/self.trials:.02f}", 



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