Bazaar of baghdadとマリガン
前置き
バザーデッキの安定性を評価するために、マリガン回数を計算してみた。
パウダー関係で分岐が多く、パウダーを使ったかどうかでバザーを引ける確率が変化するため、理論的に計算するのは困難と考えシミュレーションで計算した。
前提条件
-バザーがあれば必ずキープする
-バザーがなければ必ずマリガンする
-マリガンする際にパウダーがあれば必ず使用する。その際に追放するカードはランダムとする。
結論
考察
パウダーについて考察する。
パウダーのメリットデメリットは以下とする。
メリット:マリガン回数を減らし実質的な初手枚数が増える。
デメリット:マリガン以降は、バザーで捨てる以外に活躍しない札でありデッキを薄める。
バザーでピッチスペルや土地などの捨てたくない札を捨てざるを得ないことが多いので、パウダーはカード0.7枚分の働きをすると仮定すると実質的な見れる枚数は以下の通り。
20枚見れる場合(7ターン毎回バザーを起動した場合)であっても、パウダーを採用した方が実質的な枚数が多い。よって、バザーがなければ100%マリガンするのであれば、パウダーは必ず4枚採用するべきである。
一方、バザーなしでゲームをする場合等、パウダーが無価値な場合は採用しない方が実質的な枚数が多い。(この場合、そこまでマリガンしないので実質的にもっとパウダー不採用有利と考える。)
クレイドルヴァイン等のサイド後ゲームプランでバザーが無くても良いのであれば、サイドアウトしても良いかもしれない 。(相手がバザー対策で針や力戦をハードマリガンしそうな場合など。)
感想
平均初手枚数6.12枚、7枚キープ確率54%と想像以上に、バザーデッキはマリガンしない。3連続7枚キープ7枚7枚7枚、バザーで7枚キープは犯罪とよく言うがそうなる確率は15.7%もあり、初手にアンリコがある確率は11.7%であるため、初手アンリコの方が犯罪である。
また、バザーデッキの平均初手枚数が6.12枚と分かったので、実際の初手枚数の余剰欠損を考慮して戦績を今後評価しようと思う。(バザーデッキに3連敗したが、7ゲームで初手合計枚数が48枚あり相手が5.16枚余剰しているから仕方がない。等。)
おまけ:
ソースコード(Java)
import java.util.ArrayList;
import java.util.Collections;
public class BazaarSim {
static final int PowderNum = 4;
static final int StartNum = 7;
public static void main(String[] args) {
double sumHand = 0;
int iteration = 10000000;
int bunpu[] = new int[8];
for(int i = 0; i < 8; i++) {
bunpu[i] = 0;
}
for(int j = 0; j < iteration ; j++) {
ArrayList<Integer> deck = new ArrayList<>();
for(int i = 0; i < 60 ; i++) {
deck.add(i);
}
Collections.shuffle(deck);
int mulligan = 0;
boolean keep = false;
while(mulligan < StartNum && !keep) {
if(isBazaar(deck,StartNum)) {
keep = true;
}else if(isPowder(deck,StartNum)){
boolean powderContinue = true;
while(powderContinue && !keep) {
//バザーがなくてパウダーがある場合はパウダーを使う
for(int k = 0; k < StartNum - mulligan; k++) {
deck.remove(0);
}
Collections.shuffle(deck);
if(isBazaar(deck,StartNum - mulligan)) {
keep = true;
}
if(!isPowder(deck,StartNum - mulligan)) {
powderContinue = false;
}
}
}
if(!keep) {
Collections.shuffle(deck);
mulligan++;
}
}
int hand = StartNum - mulligan;
sumHand += hand;
bunpu[hand]++;
}
double aveHand = sumHand/iteration;
System.out.println("平均初手枚数:" + aveHand);
for(int i = 0; i < 8; i++) {
System.out.println("初手" + i + "枚:" + bunpu[i]);
}
}
static boolean isBazaar(ArrayList<Integer> deck, int cards) {
for(int i = 0; i < cards ; i++) {
//0-3 バザー
if(deck.get(i) < 4) {
return true;
}
}
return false;
}
static boolean isPowder(ArrayList<Integer> deck, int cards) {
for(int i = 0; i < cards ; i++) {
//4-7 パウダー、バザーがあるときは関係ないので4足す
if(deck.get(i) < 4 + PowderNum) {
return true;
}
}
return false;
}
}
この記事が気に入ったらサポートをしてみませんか?