見出し画像

【初心者】C++でアマツエルフのマリガンを考えてみた

みなさんこんにちは、エアーマンです。


はじめに

C++の勉強ついでに、シャドウバースに関連した何かができないかと考えていました。始めは「リノエルフのマリガンについて」を検証しようとして断念し、「機械ビショップのマリガンについて」を考えていたところに新環境が来てこれら2つのデッキが環境から消滅。新環境で何かいい感じのデッキがないかなと思っていたところにアマツエルフの存在に気づきました。

ほんとにプログラミング初心者なので、いろいろ教えていただけたら幸いです。ソースコードは最後に載せていますので、お暇な方は改善のアドバイス等いただきたく思います。


アマツエルフについてとマリガン

【アマツエルフ】は、《フェアリーブレイダー・アマツ》の起動により《フェアリー》を疾走させて勝つデッキで、起動させるためには手札に《フェアリー》が6枚以上なければなりません。

画像1

今回はこちらのリストを想定します。

《導きの巫女・コッコロ》や《森を彩る者・エルフクイーン》に関しては、実装を簡単にするためデッキに入れないこととします。また、《対空射撃》で《フェアリーウィスパラー》を戻すといった動きは考えないこととします。

このデッキのマリガンといえば、キーカードである《フェアリーブレイダー・アマツ》を全力で探しに行くということをされている方が多いと思います。ですが、アマツがない場合でも《悪戯の精霊》をキープすることも考えられます。これは《悪戯の精霊》のフェアリー生成にはラグがあり、なるべく1ターン目に置きたいカードであること、唯一フェアリーを3枚生成できるカードなため他のフェアリー生成カードの要求値が下がることが上げられます。

今回は、以下の3パターンのマリガンを実装し、比較していきます

マリガン⓪・・・マリガンなし
マリガン①・・・《フェアリーブレイダー・アマツ》のみ単キープ
マリガン②・・・《フェアリーブレイダー・アマツ》《悪戯の精霊》の単キープ


実装

疑似乱数を用いてドローするカードを決定し、アマツとフェアリー生成札6枚を引いたらループを終了させます。ただし《ウォーターフェアリー》には1ターンのラグを、《悪戯の精霊》は3ターンにかけてフェアリーを加えることとします。

これを各マリガン方法ごとに100000回行い、何ターン目にアマツの起動条件を満たしたかをカウントしていきます。

100000回のうちそのターンまでにアマツが起動した回数をそれぞれ結果として出力しています。

プログラムはホストWindows10にVMwareで仮想マシンubuntu18.04.4LTSを使いVScodeで書いています。(こういうの何を言えばいいのか分からない)

結果

以下がマリガン⓪の結果です。

0T目アマツ 0
1T目アマツ 637
2T目アマツ 11743
3T目アマツ 56790
4T目アマツ 118650
5T目アマツ 198713
6T目アマツ 290806
7T目アマツ 385498
8T目アマツ 476679
9T目アマツ 558724
10T目アマツ 629927
11T目アマツ 689557
12T目アマツ 738710
13T目アマツ 779180
14T目アマツ 812829
15T目アマツ 840571
16T目アマツ 864297
17T目アマツ 884583
18T目アマツ 902384
19T目アマツ 917971
20T目アマツ 931818
21T目アマツ 943688
22T目アマツ 954228
23T目アマツ 963453
24T目アマツ 971268
25T目アマツ 977855
26T目アマツ 983348
27T目アマツ 987902
28T目アマツ 991541
29T目アマツ 994265
30T目アマツ 996400
31T目アマツ 997950
32T目アマツ 998996
33T目アマツ 999596
34T目アマツ 999890
35T目アマツ 1000000
36T目アマツ 1000000
37T目アマツ 1000000

以下がマリガン①の結果です。

0T目アマツ 0
1T目アマツ 742
2T目アマツ 15455
3T目アマツ 74522
4T目アマツ 144062
5T目アマツ 230749
6T目アマツ 326186
7T目アマツ 421642
8T目アマツ 511144
9T目アマツ 590520
10T目アマツ 658278
11T目アマツ 714794
12T目アマツ 760763
13T目アマツ 798631
14T目アマツ 829217
15T目アマツ 854887
16T目アマツ 876439
17T目アマツ 894837
18T目アマツ 911120
19T目アマツ 925532
20T目アマツ 937941
21T目アマツ 948775
22T目アマツ 958405
23T目アマツ 966694
24T目アマツ 973851
25T目アマツ 979947
26T目アマツ 985061
27T目アマツ 989170
28T目アマツ 992336
29T目アマツ 994863
30T目アマツ 996754
31T目アマツ 998145
32T目アマツ 999064
33T目アマツ 999600
34T目アマツ 999903
35T目アマツ 1000000
36T目アマツ 1000000
37T目アマツ 1000000

以下がマリガン②の結果です。

0T目アマツ 0
1T目アマツ 932
2T目アマツ 18054
3T目アマツ 83594
4T目アマツ 158528
5T目アマツ 250787
6T目アマツ 350869
7T目アマツ 449773
8T目アマツ 541561
9T目アマツ 622084
10T目アマツ 689977
11T目アマツ 745068
12T目アマツ 789215
13T目アマツ 824120
14T目アマツ 852004
15T目アマツ 875108
16T目アマツ 894108
17T目アマツ 910047
18T目アマツ 924007
19T目アマツ 936225
20T目アマツ 946830
21T目アマツ 956220
22T目アマツ 964300
23T目アマツ 971406
24T目アマツ 977553
25T目アマツ 982649
26T目アマツ 986947
27T目アマツ 990544
28T目アマツ 993416
29T目アマツ 995596
30T目アマツ 997242
31T目アマツ 998437
32T目アマツ 999233
33T目アマツ 999689
34T目アマツ 999931
35T目アマツ 1000000
36T目アマツ 1000000
37T目アマツ 1000000


考察

結果の一部をまとめてみました。

3ターン目アマツ
マリガン⓪ 56790
マリガン① 74522
マリガン② 83594

4ターン目アマツ
マリガン⓪ 118650
マリガン① 144062
マリガン② 158528

5ターン目アマツ 
マリガン⓪ 198713
マリガン① 230749
マリガン② 250787

だいたい5ターン目までにアマツが起動すれば間に合っていると言えると思いますが、そのすべてにおいてマリガン②が一番優秀であることが分かります。だいたい100万回中1/4は5アマツできるということになりますね。あれ、意外と少ない・・・?

つまり、結論としてはマリガンはアマツ全力ではなく悪戯の精霊もキープすべきということになります。


今後の課題

今回はアマツ+フェアリー生成札のセットキープのようなキープは実装しませんでした。アマツの成功率が体感より低くなってしまったのはここにあるのかなと思います。実際はアマツを引けていれば《スピリットシャイン》はキープします。《萌芽の化身》や《森嵐らしの報い》などフェアリーを1枚しか生成しないカードに関してはキープが分かれるところだと思いますので、また追加で検証していけたらと思います。


ソースコード

自分で書いてそのままなので見にくくてすみません。一時的に//で消したとことかそのままですみません。(次の記事ではなるべく綺麗にします)

デッキは0~39で定義し、
0~2 《ウォーターフェアリー》
3~5 《萌芽の化身》
6~8 《森荒らしへの報い》
9~11 《フェアリーウィスパラー》
12~14 《スピリットシャイン》
15~17 《悪戯の精霊》
18~20 《フェアリーブレイダー・アマツ》
21~39 フェアリー生成とは関係のないカード 
と当てはめます。


マリガン⓪

 #include <iostream> #include <vector> #include <stdio.h> #include <time.h> #include  <unistd.h> #include  <sys/time.h>
using namespace std;

//デッキの中身を列挙する関数
void print(vector<int> V) {
   for (int i=0; i<V.size(); i++) {
       cout << V[i] << " ";
   }
   cout << endl;
}

//乱数を初期化する関数
void InitRand() {
   struct timeval tv;
   gettimeofday(&tv, NULL);
   srand(tv.tv_sec + tv.tv_usec);
   //srand((unsigned int)time(NULL));
}

//ドローするカードを残りデッキから決める関数
int drowcard(vector<int> V) {
   return rand() % V.size();
}

//メイン関数
int main() {
   int T[39];
for (int i=0; i<40; i++) {T[i]=0;};


   for(int i=0; i<1000000; i++) {

   vector<int> V; //デッキの中身を列挙したベクトルを定義
   
   //デッキVにカードを0から39まで設定
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }

//山上6枚のカードを決める
   InitRand(); //乱数の初期化
   int X1 = drowcard(V); //ドローするカードの位置を決定
   int C1=V[X1]; //ドローしたカードの種類を保存
   V.erase(V.begin() + X1); //ドローしたカードをデッキから消す
   InitRand();
   int X2 = drowcard(V);
   int C2=V[X2];
   V.erase(V.begin() + X2);
   InitRand();
   int X3 = drowcard(V);
   int C3=V[X3];
   V.erase(V.begin() + X3);
   //cout << "マリガン前" << " " << C1 << " " << C2 << " " << C3 << endl; //マリガン前の手札を出力
 

  

   

//デッキVを再定義
   V.clear();
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }


//特殊な操作が必要なカードを定義
   int fairy = 0;
   int amatu = 0;
   int water = 0;
   int water2 = 0;
   int water3 = 0;
   int seirei = 0; 
   int seirei2 = 0;
   int seirei3 = 0;
   int A = 0;


 V.erase(V.begin() + C1); //1枚目はC1を引く

   if (2 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを生成するカードならフェアリーカウントを1進める
   if (8 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを2枚生成するカードならフェアリーカウントをさらに1進める

if (C1 == 0) {water++;}; //それがウォーターフェアリー1枚目の場合
   if (C1 == 1) {water2++;}; //それがウォーターフェアリー2枚目の場合
   if (C1 == 2) {water3++;}; //それがウォーターフェアリー3枚目の場合

   if (C1 == 15) {seirei = seirei +3;}; //それが悪戯な精霊1枚目の場合
   if (C1 == 16) {seirei2 = seirei2 +3;}; //それが悪戯な精霊2枚目の場合
   if (C1 == 17) {seirei3 = seirei3 +3;}; //それが悪戯な精霊3枚目の場合

   if (17 < C1 && C1 < 21) {amatu++;}; //それがアマツの場合
  


//2枚目について同様に行う
if (C1<C2) {V.erase(V.begin() + C2 -1);} else {V.erase(V.begin() + C2);};
   if (2 < C2 && C2 < 15) {fairy++;};
   if (8 < C2 && C2 < 15) {fairy++;};  

if (C2 == 0) {water++;};
   if (C2 == 1) {water2++;};
   if (C2 == 2) {water3++;};

   if (C2 == 15) {seirei = seirei +3;};
   if (C2 == 16) {seirei2 = seirei2 +3;};
   if (C2 == 17) {seirei3 = seirei3 +3;};

   if (17 < C2 && C2 < 21) {amatu++;};


//3枚目について同様に行う
if (C1<C3 && C2<C3) {V.erase(V.begin() + C3 -2);} 
  else {if (C1<C3 || C2<C3) {V.erase(V.begin() + C3 -1);}
           else {V.erase(V.begin() + C3);};};

     


   if (2 < C3 && C3 < 15) {fairy++;};
   if (8 < C3 && C3 < 15) {fairy++;};  

if (C3 == 0) {water++;};
   if (C3 == 1) {water2++;};
   if (C3 == 2) {water3++;};

   if (C3 == 15) {seirei = seirei +3;};
   if (C3 == 16) {seirei2 = seirei2 +3;};
   if (C3 == 17) {seirei3 = seirei3 +3;};

   if (17 < C3 && C3 < 21) {amatu++;};


   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 

//フェアリーが6枚以上かつアマツが1枚以上になったら終了
   while (fairy<6 || amatu<1) {
         InitRand();
   int XX = drowcard(V);
   //cout << " " << endl;
   //cout << "引いたカード" << " " << V[XX] << endl;
   if (water > 0) {fairy++; water = water -1;};
   if (water2 > 0) {fairy++; water2 = water2 -1;};
   if (water3 > 0) {fairy++; water3 = water3 -1;};
   if (seirei > 0) {fairy++; seirei = seirei -1;};
   if (seirei2 > 0) {fairy++; seirei2 = seirei2 -1;};
   if (seirei3 > 0) {fairy++; seirei3 = seirei3 -1;};


   if (V[XX] == 0) {water++;};
   if (V[XX] == 1) {water2++;};
   if (V[XX] == 2) {water3++;};

   if (2 < V[XX] && V[XX] < 15) {fairy++;};
   if (8 < V[XX] && V[XX] < 15) {fairy++;};  

   if (V[XX] == 15) {seirei = seirei +3;};
   if (V[XX] == 16) {seirei2 = seirei2 +3;};
   if (V[XX] == 17) {seirei3 = seirei3 +3;};

   if (17 < V[XX] && V[XX] < 21) {amatu++;};
     V.erase(V.begin() + XX);
   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 
   A++;
   
 
   }

  
   
   for (int i=39; i>A-1; i--) {T[i]++;};
 
   
  

   };

   for (int i=0; i<38; i++) {
cout << i << "T目アマツ " << T[i] << endl;
   }

   return 0;
}

マリガン①

 #include <iostream> #include <vector> #include <stdio.h> #include <time.h> #include  <unistd.h> #include  <sys/time.h>
using namespace std;

//デッキの中身を列挙する関数
void print(vector<int> V) {
   for (int i=0; i<V.size(); i++) {
       cout << V[i] << " ";
   }
   cout << endl;
}

//乱数を初期化する関数
void InitRand() {
    struct timeval tv;
   gettimeofday(&tv, NULL);
   srand(tv.tv_sec + tv.tv_usec);
   //srand((unsigned int)time(NULL));
}

//ドローするカードを残りデッキから決める関数
int drowcard(vector<int> V) {
   return rand() % V.size();
}

//メイン関数
int main() {
        int T[39];
for (int i=0; i<40; i++) {T[i]=0;};

   for(int i=0; i<1000000; i++) {

   vector<int> V; //デッキの中身を列挙したベクトルを定義
   
   //デッキVにカードを0から39まで設定
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }

//山上6枚のカードを決める
   InitRand(); //乱数の初期化
   int X1 = drowcard(V); //ドローするカードの位置を決定
   int C1=V[X1]; //ドローしたカードの種類を保存
   V.erase(V.begin() + X1); //ドローしたカードをデッキから消す
   InitRand();
   int X2 = drowcard(V);
   int C2=V[X2];
   V.erase(V.begin() + X2);
   InitRand();
   int X3 = drowcard(V);
   int C3=V[X3];
   V.erase(V.begin() + X3);
   //cout << "マリガン前" << " " << C1 << " " << C2 << " " << C3 << endl; //マリガン前の手札を出力
 

InitRand();
   int X4 = drowcard(V);
   int C4=V[X4];
   V.erase(V.begin() + X4);
InitRand();
   int X5 = drowcard(V);
   int C5=V[X5];
   V.erase(V.begin() + X5);
InitRand();
   int X6 = drowcard(V);
   int C6=V[X6];
   V.erase(V.begin() + X6);

//アマツがマリガンで来た場合それをキープしそれ以外は戻す
//1枚目がアマツ
   if (17 < C1 && C1 <21) {
     C2=C4;
     C3=C5;
      }
//2枚目がアマツ
      else {
             if (17 < V[X2] && V[X2] <21) {
               C1=C4;
               C3=C5;
               }
//3枚目がアマツ
               else {
                      if (17 < V[X3] && V[X3] <21) {
                     C1=C4;
                     C2=C5;
                      }
//アマツなし
                      else {
                            C1=C4;
                            C2=C5;
                            C3=C6;
                                                      
                           }
               
                   }
           };
       
   


//cout << "マリガン後" << " " << C1 << " " << C2 << " " << C3 << endl; //マリガン後のハンドを出力
  

   

//デッキVを再定義
   V.clear();
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }


//特殊な操作が必要なカードを定義
   int fairy = 0;
   int amatu = 0;
   int water = 0;
   int water2 = 0;
   int water3 = 0;
   int seirei = 0; 
   int seirei2 = 0;
   int seirei3 = 0;
   int A = 0;


 V.erase(V.begin() + C1); //1枚目はC1を引く

   if (2 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを生成するカードならフェアリーカウントを1進める
   if (8 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを2枚生成するカードならフェアリーカウントをさらに1進める

if (C1 == 0) {water++;}; //それがウォーターフェアリー1枚目の場合
   if (C1 == 1) {water2++;}; //それがウォーターフェアリー2枚目の場合
   if (C1 == 2) {water3++;}; //それがウォーターフェアリー3枚目の場合

   if (C1 == 15) {seirei = seirei +3;}; //それが悪戯な精霊1枚目の場合
   if (C1 == 16) {seirei2 = seirei2 +3;}; //それが悪戯な精霊2枚目の場合
   if (C1 == 17) {seirei3 = seirei3 +3;}; //それが悪戯な精霊3枚目の場合

   if (17 < C1 && C1 < 21) {amatu++;}; //それがアマツの場合
  


//2枚目について同様に行う
if (C1<C2) {V.erase(V.begin() + C2 -1);} else {V.erase(V.begin() + C2);};
   if (2 < C2 && C2 < 15) {fairy++;};
   if (8 < C2 && C2 < 15) {fairy++;};  

if (C2 == 0) {water++;};
   if (C2 == 1) {water2++;};
   if (C2 == 2) {water3++;};

   if (C2 == 15) {seirei = seirei +3;};
   if (C2 == 16) {seirei2 = seirei2 +3;};
   if (C2 == 17) {seirei3 = seirei3 +3;};

   if (17 < C2 && C2 < 21) {amatu++;};


//3枚目について同様に行う
if (C1<C3 && C2<C3) {V.erase(V.begin() + C3 -2);} 
  else {if (C1<C3 || C2<C3) {V.erase(V.begin() + C3 -1);}
           else {V.erase(V.begin() + C3);};};

     


   if (2 < C3 && C3 < 15) {fairy++;};
   if (8 < C3 && C3 < 15) {fairy++;};  

if (C3 == 0) {water++;};
   if (C3 == 1) {water2++;};
   if (C3 == 2) {water3++;};

   if (C3 == 15) {seirei = seirei +3;};
   if (C3 == 16) {seirei2 = seirei2 +3;};
   if (C3 == 17) {seirei3 = seirei3 +3;};

   if (17 < C3 && C3 < 21) {amatu++;};


   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 

//フェアリーが6枚以上かつアマツが1枚以上になったら終了
   while (fairy<6 || amatu<1) {
         InitRand();
   int XX = drowcard(V);
   //cout << " " << endl;
   //cout << "引いたカード" << " " << V[XX] << endl;
   if (water > 0) {fairy++; water = water -1;};
   if (water2 > 0) {fairy++; water2 = water2 -1;};
   if (water3 > 0) {fairy++; water3 = water3 -1;};
   if (seirei > 0) {fairy++; seirei = seirei -1;};
   if (seirei2 > 0) {fairy++; seirei2 = seirei2 -1;};
   if (seirei3 > 0) {fairy++; seirei3 = seirei3 -1;};


   if (V[XX] == 0) {water++;};
   if (V[XX] == 1) {water2++;};
   if (V[XX] == 2) {water3++;};

   if (2 < V[XX] && V[XX] < 15) {fairy++;};
   if (8 < V[XX] && V[XX] < 15) {fairy++;};  

   if (V[XX] == 15) {seirei = seirei +3;};
   if (V[XX] == 16) {seirei2 = seirei2 +3;};
   if (V[XX] == 17) {seirei3 = seirei3 +3;};

   if (17 < V[XX] && V[XX] < 21) {amatu++;};
     V.erase(V.begin() + XX);
   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 
   A++;
   
 
   }


  
 for (int i=39; i>A-1; i--) {T[i]++;};


   };

   for (int i=0; i<38; i++) {
cout << i << "T目アマツ " << T[i] << endl;
   }


   return 0;
}

マリガン②

 #include <iostream> #include <vector> #include <stdio.h> #include <time.h> #include  <unistd.h> #include  <sys/time.h>
using namespace std;

//デッキの中身を列挙する関数
void print(vector<int> V) {
   for (int i=0; i<V.size(); i++) {
       cout << V[i] << " ";
   }
   cout << endl;
}

//乱数を初期化する関数
void InitRand() {
   struct timeval tv;
   gettimeofday(&tv, NULL);
   srand(tv.tv_sec + tv.tv_usec);
   //srand((unsigned int)time(NULL));
}

//ドローするカードを残りデッキから決める関数
int drowcard(vector<int> V) {
   return rand() % V.size();
}

//メイン関数
int main() {

       int T[39];
for (int i=0; i<40; i++) {T[i]=0;};


   for(int i=0; i<1000000; i++) {

   vector<int> V; //デッキの中身を列挙したベクトルを定義
   
   //デッキVにカードを0から39まで設定
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }

//山上6枚のカードを決める
   InitRand(); //乱数の初期化
   int X1 = drowcard(V); //ドローするカードの位置を決定
   int C1=V[X1]; //ドローしたカードの種類を保存
   V.erase(V.begin() + X1); //ドローしたカードをデッキから消す
   InitRand();
   int X2 = drowcard(V);
   int C2=V[X2];
   V.erase(V.begin() + X2);
   InitRand();
   int X3 = drowcard(V);
   int C3=V[X3];
   V.erase(V.begin() + X3);
   //cout << "マリガン前" << " " << C1 << " " << C2 << " " << C3 << endl; //マリガン前の手札を出力
 

InitRand();
   int X4 = drowcard(V);
   int C4=V[X4];
   V.erase(V.begin() + X4);
InitRand();
   int X5 = drowcard(V);
   int C5=V[X5];
   V.erase(V.begin() + X5);
InitRand();
   int X6 = drowcard(V);
   int C6=V[X6];
   V.erase(V.begin() + X6);

//アマツがマリガンで来た場合それをキープしそれ以外は戻す
//1枚目がアマツ
   if (17 < C1 && C1 <21) { //1枚目がアマツだったら
     if (C2 < 15 || 17 < C2) {C2=C5;}; //2枚目が精霊じゃないなら2枚目はマリガン
     if (C3 < 15 || 17 < C3) {C3=C6;}; //3枚目が精霊じゃないなら3枚目はマリガン
      }
//1枚目がアマツじゃないなら
      else { if (C1 < 15 || 17 < C1) {C1=C4;}; //1枚目が精霊じゃないなら1枚目はマリガン
             if (17 < C2 && C2 <21) { //2枚目がアマツだったら
                if (C3 < 15 || 17 < C3) {C3=C6;}; //3枚目が精霊だったら3枚目はマリガン
                }
//2枚目がアマツじゃないなら
               else { if (C2 < 15 || 17 < C2) {C2=C5;}; //2枚目が精霊じゃないなら2枚目はマリガン
                      if (17 < C3 && C3 <21) {;} //3枚目がアマツだったら何もしない
                    
//アマツなし
                      else {
                            C1=C4; //1枚目をマリガン
                            C2=C5; //2枚目をマリガン
                            C3=C6; //3枚目をマリガン
                                                      
                           }
               
                   }
           };
       
   


//cout << "マリガン後" << " " << C1 << " " << C2 << " " << C3 << endl; //マリガン後のハンドを出力
  

   

//デッキVを再定義
   V.clear();
   for (int i=0; i<40; i++) {
   V.push_back(i);
   }


//特殊な操作が必要なカードを定義
   int fairy = 0;
   int amatu = 0;
   int water = 0;
   int water2 = 0;
   int water3 = 0;
   int seirei = 0; 
   int seirei2 = 0;
   int seirei3 = 0;
   int A = 0;


 V.erase(V.begin() + C1); //1枚目はC1を引く

   if (2 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを生成するカードならフェアリーカウントを1進める
   if (8 < C1 && C1 < 15) {fairy++;}; //それがフェアリーを2枚生成するカードならフェアリーカウントをさらに1進める

if (C1 == 0) {water++;}; //それがウォーターフェアリー1枚目の場合
   if (C1 == 1) {water2++;}; //それがウォーターフェアリー2枚目の場合
   if (C1 == 2) {water3++;}; //それがウォーターフェアリー3枚目の場合

   if (C1 == 15) {seirei = seirei +3;}; //それが悪戯な精霊1枚目の場合
   if (C1 == 16) {seirei2 = seirei2 +3;}; //それが悪戯な精霊2枚目の場合
   if (C1 == 17) {seirei3 = seirei3 +3;}; //それが悪戯な精霊3枚目の場合

   if (17 < C1 && C1 < 21) {amatu++;}; //それがアマツの場合
  


//2枚目について同様に行う
if (C1<C2) {V.erase(V.begin() + C2 -1);} else {V.erase(V.begin() + C2);};
   if (2 < C2 && C2 < 15) {fairy++;};
   if (8 < C2 && C2 < 15) {fairy++;};  

if (C2 == 0) {water++;};
   if (C2 == 1) {water2++;};
   if (C2 == 2) {water3++;};

   if (C2 == 15) {seirei = seirei +3;};
   if (C2 == 16) {seirei2 = seirei2 +3;};
   if (C2 == 17) {seirei3 = seirei3 +3;};

   if (17 < C2 && C2 < 21) {amatu++;};


//3枚目について同様に行う
if (C1<C3 && C2<C3) {V.erase(V.begin() + C3 -2);} 
  else {if (C1<C3 || C2<C3) {V.erase(V.begin() + C3 -1);}
           else {V.erase(V.begin() + C3);};};

     


   if (2 < C3 && C3 < 15) {fairy++;};
   if (8 < C3 && C3 < 15) {fairy++;};  

if (C3 == 0) {water++;};
   if (C3 == 1) {water2++;};
   if (C3 == 2) {water3++;};

   if (C3 == 15) {seirei = seirei +3;};
   if (C3 == 16) {seirei2 = seirei2 +3;};
   if (C3 == 17) {seirei3 = seirei3 +3;};

   if (17 < C3 && C3 < 21) {amatu++;};


   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 

//フェアリーが6枚以上かつアマツが1枚以上になったら終了
   while (fairy<6 || amatu<1) {
         InitRand();
   int XX = drowcard(V);
   //cout << " " << endl;
   //cout << "引いたカード" << " " << V[XX] << endl;
   if (water > 0) {fairy++; water = water -1;};
   if (water2 > 0) {fairy++; water2 = water2 -1;};
   if (water3 > 0) {fairy++; water3 = water3 -1;};
   if (seirei > 0) {fairy++; seirei = seirei -1;};
   if (seirei2 > 0) {fairy++; seirei2 = seirei2 -1;};
   if (seirei3 > 0) {fairy++; seirei3 = seirei3 -1;};


   if (V[XX] == 0) {water++;};
   if (V[XX] == 1) {water2++;};
   if (V[XX] == 2) {water3++;};

   if (2 < V[XX] && V[XX] < 15) {fairy++;};
   if (8 < V[XX] && V[XX] < 15) {fairy++;};  

   if (V[XX] == 15) {seirei = seirei +3;};
   if (V[XX] == 16) {seirei2 = seirei2 +3;};
   if (V[XX] == 17) {seirei3 = seirei3 +3;};

   if (17 < V[XX] && V[XX] < 21) {amatu++;};
     V.erase(V.begin() + XX);
   //print(V);
   //cout << "フェアリーカウント" << " " << fairy << endl; 
   A++;
   }
 
 for (int i=39; i>A-1; i--) {T[i]++;};
   }

   
   

   for (int i=0; i<38; i++) {
cout << i << "T目アマツ " << T[i] << endl;
   }

   return 0;
}

コードを載せたら文字数すごいことになる。
終わり。




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