見出し画像

C#ポーカー役判定アルゴリズム


以前、独学でプログラムを組んだことがありまして、めちゃくちゃなコードではありますが、テキサスホールデムポーカーを題材にしたゲームを0から作りたい人はこれを踏み台にすればポーカーアプリ作るのに少しは時間短縮になると思い公開します。

きっと頭の良い人が改良して面白いゲームを作ってくれるはず!
最下部にソースを載せておきますね。こんなので良ければ参考にしてみてください。
(イライラしても責任は負いませんw)

解説

シャッフルと、個人的にめちゃくちゃ苦労した役判定だけ解説しますね。

これはテキサスホールデムを題材にしたアプリです。
カードはJOKER抜きの52枚を使用します。

このアプリではDEALを押すと手札とコミュニティーカード(共通札)が全て開きます。
画面中央に役の成立回数と今回の成立役、
画面右に配られた手札の種類
を表示します。

画像1

52枚のトランプは下記の通り表現しています。
1の桁がカードのスートです。(1:スペード 2:ハート 3:ダイア 4:クラブ)
上位2桁はカードの数字です。
(例:123→ダイアのQ)

       public class Deck
       {
           //52枚のデックを構成。
           public static int[] deck = new int[52]
           { 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131,
             12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132,
             13, 23, 33, 43, 53, 63, 73, 83, 93, 103, 113, 123, 133,
             14, 24, 34, 44, 54, 64, 74, 84, 94, 104, 114, 124, 134};
       }

で、それを時間をシード値にして混ぜます。

       public class Dealer
       {
           //シャッフルメソッド。DEALボタン押下時に1回だけ実行。山札を混ぜます。混ぜたデッキが戻り値です。
           public static int[] Shuffle()
           {
               int seed = Environment.TickCount;
               int tmp = 0;
               for (int i = 0; i < 52; i++)
               {
                   System.Random r = new System.Random(seed++);
                   int rnd = r.Next(52);
                   tmp = Deck.deck[i];
                   Deck.deck[i] = Deck.deck[rnd];
                   Deck.deck[rnd] = tmp;
               }
               return Deck.deck;
           }

手札とコミュニティーカード全部で7枚配ります。

       //DEALボタン押下時
       private void button1_Click(object sender, EventArgs e)
       {
           label9.Text = "";
           int[] judge = new int[7];
           int rank = 0;
           playcount++;
           Clear.ClearCard();
           Deck.deck = Dealer.Shuffle();
           Dealer.Deal(2);//プリフロップ
           pictureBox1.Image = image[0];
           pictureBox2.Image = image[1];
           rank = Rank.RankHand(Card);
           Dealer.Deal(3);//フロップ
           pictureBox3.Image = image[2];
           pictureBox4.Image = image[3];
           pictureBox5.Image = image[4];
           Dealer.Deal(1);//ターン
           pictureBox6.Image = image[5];
           Dealer.Deal(1);//リバー
           pictureBox7.Image = image[6];
           judge = Judge.JudgeHand(Card);


役判定は下記の流れで行います。

まずは同じスートが5枚以上あるかをチェックし、フラッシュであるかどうかの判定を行います。
YES:ロイヤルフラッシュ判定→ストレートフラッシュ判定→フラッシュ判定
NO:ストレート判定(A2345だけではなく、10JQKAも考慮する必要があります。)

ストレート判定がNOだった場合ペア系の役判定に突入です。
4カードは簡単ですが、厄介なのは3カード成立時に他のペアがある場合はフルハウスになることです。他にペアが無いか判定する必要があります。
そして判定は2ペア、1ペア、ハイカードと続いていきます。

       public class Judge
       {
           static int paircount = 0;
           static int suitcount = 0;//スートを数えます。5以上でフラッシュ。フラッシュ判定用。
           readonly static int[] hand = new int[6] { 0, 0, 0, 0, 0, 0 };//役とベストハンド。戻り値として扱う。hand[5]は役。
           //役判定メソッド。役を判定します。
           public static int[] JudgeHand(int[] judgehand)
           {
               for (int i = 0; i < 6; i++)//役、ベストハンド配列初期化
               {
                   hand[i] = 0;
               }
               suitcount = 0;
               paircount = 0;
               if (count >= 5)//グローバル変数 count 配った枚数が5枚以上であればフラッシュ・ストレート判定開始
               {
                   FlushJudge(judgehand);
                   if (hand[5] == 0)
                   {
                       StraightJudge(judgehand);
                   }
               }
               if (hand[5] == 0)
                   PairJudge(judgehand);
               if (hand[5] == 0)
               {
                   hand[5] = 10;//ここまで役が該当しなければハイカード確定
                   Array.Sort(judgehand);
                   Array.Reverse(judgehand);
                   int cnt = 0;
                   if (judgehand[6] / 10 == 1)
                   {
                       hand[0] = judgehand[6];
                       cnt++;
                   }

                   for (int i = cnt; i < 5; i++)
                   {
                       hand[i] = judgehand[i];
                   }
               }
               return hand;//戻り値はhand[0-4]がベストハンドhand[5]が役
           }

           //フラッシュ役判定。各スートをシーケンシャルで判定
           public static int[] FlushJudge(int[] judgehand)
           {
               int tmp = 0;//ソート用一時的な変数
               int bestcount = 0;
               int[] flushhand = new int[7] { 999, 999, 999, 999, 999, 999, 999 }; //フラッシュ判定格納用

               for (int i = 1; i <= 4; i++)//スペード・ハート・ダイア・クラブを順にiに代入
               {
                   suitcount = 0;
                   for (int j = 0; j < count; j++)//配られた枚数分スートを確認
                   {
                       if (judgehand[j] % 10 == i)//判定用配列よりスートを抽出し、現在参照しているスートと同じか判定
                       {
                           flushhand[suitcount] = judgehand[j];//フラッシュ判定用配列に数値を格納
                           suitcount++;//同スートカウントをインクリメント
                       }
                   }
                   if (suitcount >= 5)//同スートが5枚以上でフラッシュフラグを立てる。スートに対応する数字をフラグに格納
                   {
                       hand[5] = 5;//役をフラッシュにセット。
                       Array.Sort(flushhand);//フラッシュのスートを昇順に並び替え
                       //ロイヤルフラッシュ判定
                       if (flushhand[0] / 10 == 1)
                           for (int cnt = 0; cnt <= 2; cnt++)
                           {
                               if (flushhand[1 + cnt] / 10 == 10)
                                   if (flushhand[2 + cnt] / 10 == 11)
                                       if (flushhand[3 + cnt] / 10 == 12)
                                           if (flushhand[4 + cnt] / 10 == 13)
                                           {
                                               tmp = flushhand[0];
                                               for (int m = 0; m < 4; m++)
                                               {
                                                   hand[m] = flushhand[cnt + m + 1];
                                               }
                                               hand[4] = tmp;//Aを末尾に格納
                                               hand[5] = 1;//役はロイヤルフラッシュ
                                           }
                           }

                       //ストレートフラッシュ判定
                       if (hand[5] != 1)//ロイヤルフラッシュじゃなければ判定開始
                       {
                           for (int cnt = 0; cnt < suitcount - 4; cnt++)//昇順ソートしたフラッシュ配列を始点から+4枚目までを確認し、5連番であればストレートフラッシュ。
                           {
                               if (flushhand[cnt] / 10 == (flushhand[cnt + 1] / 10) - 1)
                                   if (flushhand[cnt] / 10 == flushhand[cnt + 2] / 10 - 2)
                                       if (flushhand[cnt] / 10 == flushhand[cnt + 3] / 10 - 3)
                                           if (flushhand[cnt] / 10 == flushhand[cnt + 4] / 10 - 4)
                                           {
                                               for (int m = cnt; m < 5 + cnt; m++)
                                               {
                                                   hand[m] = flushhand[m + cnt];
                                               }
                                               hand[5] = 2;
                                           }
                           }
                       }

                       if (hand[5] == 5)//フラッシュ
                       {
                           Array.Sort(flushhand);
                           Array.Reverse(flushhand);//配列をひっくり返して降順に
                           if (flushhand[6] / 10 == 1)//Aハイフラッシュかどうかを判定
                           {
                               hand[0] = flushhand[6];
                               bestcount++;
                           }
                           for (int cnt = 0; cnt < 7; cnt++)
                           {
                               if (flushhand[cnt] != 999)
                               {
                                   hand[bestcount] = flushhand[cnt];
                                   bestcount++;
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                       if (hand[5] != 0)
                           break;//フラッシュフラグが立ったらループを抜ける。他のスートは見ない。
                   }
               }
               return hand;
           }

           //ストレート判定
           public static int[] StraightJudge(int[] judgehand)
           {
               int[] numcount = new int[13] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
               int bestcount = 0;
               for (int cnt = 0; cnt < 7; cnt++)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (judgehand[cnt] / 10 == i + 1) //数字毎に枚数をカウント
                       {
                           numcount[i]++;
                       }
                   }
               }
               if (numcount[0] > 0)//Aハイストレート判定
               {
                   if (numcount[12] > 0)
                       if (numcount[11] > 0)
                           if (numcount[10] > 0)
                               if (numcount[9] > 0)
                               {
                                   hand[5] = 6;
                                   for (int i = 9; i < 13; i++)
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                               break;
                                           }
                                       }
                                       if (bestcount == 5)
                                           break;
                                   }
                                   Array.Sort(judgehand);//昇順ソートでjudgehand[0]にAを格納
                                   hand[bestcount] = judgehand[0];//Aをhand[0]に格納
                                   bestcount++;
                               }
               }
               if (hand[5] == 0)
               {
                   for (int i = 12; i >= 4; i--)
                   {
                       bestcount = 0;
                       if (numcount[i] > 0)
                           if (numcount[i - 1] > 0)
                               if (numcount[i - 2] > 0)
                                   if (numcount[i - 3] > 0)
                                       if (numcount[i - 4] > 0)
                                       {
                                           hand[5] = 6;
                                           for (int end = i; end >= i - 4; end--)
                                           {
                                               for (int j = 0; j < count; j++)
                                               {
                                                   if (judgehand[j] / 10 == end + 1)
                                                   {
                                                       hand[bestcount] = judgehand[j];
                                                       bestcount++;
                                                       break;
                                                   }
                                               }
                                               if (bestcount == 5)
                                                   break;
                                           }
                                       }
                   }
               }
               return hand;
           }

           //1ペア・2ペア・3カード・4カード・フルハウス判定
           public static int[] PairJudge(int[] judgehand)
           {
               int[] numcount = new int[13] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
               int bestcount = 0;
               for (int cnt = 0; cnt < 7; cnt++)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (judgehand[cnt] / 10 == i + 1) //数字毎に枚数をカウント
                       {
                           numcount[i]++;
                       }
                   }
               }
               if (numcount[0] == 4)//Aの4カードが含まれるなら
               {
                   hand[5] = 3;//4カード確定
                   for (int j = 0; j < count; j++)
                   {
                       if (judgehand[j] / 10 == 1)
                       {
                           hand[bestcount] = judgehand[j];
                           bestcount++;
                       }
                   }
               }
               if (hand[5] == 0)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (numcount[i] == 4)//同じ札が4枚あるか
                       {
                           hand[5] = 3;//フォーカード確定
                           for (int j = 0; j < count; j++)
                           {
                               if (judgehand[j] / 10 == i + 1)
                               {
                                   hand[bestcount] = judgehand[j];//ベストハンド配列に4カードの札を格納
                                   bestcount++;
                               }
                           }
                           break;
                       }
                   }
               }
               if (hand[5] != 0)
               {
                   if (numcount[0] != 4)//Aの4カードじゃなければ
                   {
                       if (numcount[0] > 0)
                       {
                           for (int j = 0; j < count; j++)
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];//ベストハンド配列にAを格納
                                   bestcount++;
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                   }
                   if (bestcount < 5)//上の処理をしていなければ
                   {
                       for (int m = 12; m >= 0; m--)//キッカー判定。一番大きい数字かつ4カード以外の数字をnumcount1以上の数字から探索
                       {
                           if (numcount[m] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの5枚目に格納
                           {
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != m + 1)//最大の数字が4カードの数字と同じじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == m + 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                           break;
                                       }
                                   }
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                   }
               }
               //フルハウス・3カード判定
               if (hand[5] == 0)
               {
                   if (numcount[0] == 3)//Aの3カードなら
                   {
                       hand[5] = 7;//3カードフラグ
                       for (int j = 0; j < count; j++)
                       {
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];
                                   bestcount++;
                               }
                           }
                       }
                   }
                   if (hand[5] == 0)
                   {
                       for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                       {
                           if (numcount[i] == 3)
                           {
                               hand[5] = 7;//3カードフラグ
                               for (int j = 0; j < count; j++)
                               {
                                   if (judgehand[j] / 10 == i + 1)
                                   {
                                       hand[bestcount] = judgehand[j];//ベストハンド配列に3カードの札を格納
                                       bestcount++;
                                   }
                               }
                               if (bestcount == 3)
                                   break;
                           }
                       }
                   }
                   if (hand[5] == 7)//3カードフラグは立っているか
                   {
                       if (numcount[0] == 2)//Aのペアが含まれるなら
                       {
                           hand[5] = 4;//3カードからフルハウスにランクアップ
                           for (int j = 0; j < count; j++)
                           {
                               if (hand[0] / 10 != 1)//3カードの数字がAじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                               {
                                   if (judgehand[j] / 10 == 1)
                                   {
                                       hand[bestcount] = judgehand[j];
                                       bestcount++;
                                   }
                               }
                           }
                       }

                       if (bestcount != 5)
                       {
                           for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                           {
                               if (bestcount == 5)
                                   break;
                               if (hand[0] / 10 != i + 1)//最大の数字が3カードの数字と同じじゃなければペアの札を見る(便宜上配列の一番最初[0]を参照)
                                   if (numcount[i] >= 2)
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           {
                                               if (judgehand[j] / 10 == i + 1)
                                               {
                                                   hand[bestcount] = judgehand[j];//ベストハンド配列にペアの札を格納
                                                   bestcount++;
                                               }
                                           }
                                       }
                                       hand[5] = 4;//3カードからフルハウスにランクアップ
                                       break;
                                   }
                           }
                       }
                       if (hand[5] == 7)//3カードキッカー判定
                       {
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//3カードの数字がAじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }

                           for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつ3カード以外の数字をnumcount1以上の数字から探索
                           {
                               if (bestcount == 5)
                                   break;

                               if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの4,5枚目に格納
                               {
                                   for (int j = 0; j < count; j++)
                                   {
                                       if (hand[0] / 10 != i + 1)//最大の数字が3カードの数字と同じじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                           }
                                           if (bestcount == 5)
                                               break;
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
               if (hand[5] == 0)//2ペア・1ペア判定
               {
                   if (numcount[0] == 2)//Aのペアなら
                   {
                       paircount++;
                       for (int j = 0; j < count; j++)
                       {
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];
                                   bestcount++;
                               }
                           }
                       }
                   }
                   for (int i = 12; i >= 1; i--)//高い数字からシーケンシャル探索
                   {
                       if (numcount[i] == 2)
                       {
                           paircount++;
                           {
                               for (int j = 0; j < count; j++)
                               {
                                   if (judgehand[j] / 10 == i + 1)
                                   {
                                       hand[bestcount] = judgehand[j];//ベストハンド配列にペアの札を格納
                                       bestcount++;
                                   }
                               }
                               if (paircount == 2)
                                   break;
                           }
                       }
                   }
                   switch (paircount)
                   {
                       case 1:
                           hand[5] = 9;//1ペア確定
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//ペアの数字がAじゃなければ3,4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }
                           for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつペア以外の数字をnumcount1以上の数字から探索
                           {
                               if (bestcount == 5)
                                   break;

                               if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの3,4,5枚目に格納
                               {
                                   for (int j = 0; j < count; j++)
                                   {
                                       if (hand[0] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ3,4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                           }
                                           if (bestcount == 5)
                                               break;
                                       }
                                   }
                               }
                           }
                           break;

                       case 2:
                           hand[5] = 8;//2ペア確定
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//ペアの数字がAじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }
                           if (bestcount != 5)//5枚格納されていなければ以下処理を行う
                               for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつペア以外の数字をnumcount1以上の数字から探索
                               {
                                   if (bestcount == 5)
                                       break;

                                   if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの5枚目に格納
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           if (hand[0] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                           {
                                               if (hand[2] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ5枚目に格納(便宜上2ペアの数字(配列の3番目)を参照)
                                               {
                                                   if (judgehand[j] / 10 == i + 1)
                                                   {
                                                       hand[bestcount] = judgehand[j];
                                                       bestcount++;
                                                   }
                                                   if (bestcount == 5)
                                                       break;
                                               }
                                           }
                                       }
                                   }
                               }
                           break;
                   }
               }

               return hand;
           }
       }

ただただポーカーが好きな素人が組んだ物なので、考え方だけ参考にしていただけたらと思います。
微力ながら、誰かの助けになれれば幸いです!

全ソース

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
           Deck.deck = Dealer.Shuffle();
       }
       static int playcount = 0;//DEALした回数。役や手札の確率を求める際に使用
       static int count;//配られたのは何枚目か
       static int[] Card = new int[7];//配列0,1が手札。2~6は共通札。
       static Image[] image = new Image[7];//0~1が手札、2~6がボード画像
       static Image[] resultimage = new Image[5];//役判定後の5枚を表示する
       static double[] handcount = new double[10];//出た役の回数
       static double[] handpro = new double[10];//出た役の確率。playcount/handcountで算出
       static double[] rankcount = new double[17];//出た手札(スーテッド等)の回数
       static double[] rankpro = new double[17];//出た手役の確率。playcount/rankcountで算出
       static double pocketcount = 0;
       static double pocketpro = 0;

       //DEALボタン押下時
       private void button1_Click(object sender, EventArgs e)
       {
           label9.Text = "";
           int[] judge = new int[7];
           int rank = 0;
           playcount++;
           Clear.ClearCard();
           Deck.deck = Dealer.Shuffle();
           Dealer.Deal(2);//プリフロップ
           pictureBox1.Image = image[0];
           pictureBox2.Image = image[1];
           rank = Rank.RankHand(Card);
           Dealer.Deal(3);//フロップ
           pictureBox3.Image = image[2];
           pictureBox4.Image = image[3];
           pictureBox5.Image = image[4];
           Dealer.Deal(1);//ターン
           pictureBox6.Image = image[5];
           Dealer.Deal(1);//リバー
           pictureBox7.Image = image[6];
           judge = Judge.JudgeHand(Card);
           RankCounter.RankCount(rank);
           if (rank <= 13)
           {
               pocketcount++;
               pocketpro = Math.Round(pocketcount / playcount * 100, 2, MidpointRounding.AwayFromZero);
           }
           HandCounter.HandCount(judge[5]);
           label11.Text = string.Format("   プレイカウント:{0,9}回", playcount);
           label10.Text = string.Format(" ロイヤルフラッシュ:{0,9}回 {10}%\r" +
                                        "ストレートフラッシュ:{1,9}回 {11}%\r" +
                                        "    フォーカード:{2,9}回 {12}%\r" +
                                        "     フルハウス:{3,9}回 {13}%\r" +
                                        "     フラッシュ:{4,9}回 {14}%\r" +
                                        "     ストレート:{5,9}回 {15}%\r" +
                                        "    スリーカード:{6,9}回 {16}%\r" +
                                        "      ツーペア:{7,9}回 {17}%\r" +
                                        "      ワンペア:{8,9}回 {18}%\r" +
                                        "     ハイカード:{9,9}回 {19}%\r"
               , handcount[0], handcount[1], handcount[2], handcount[3], handcount[4],
               handcount[5], handcount[6], handcount[7], handcount[8], handcount[9],
               handpro[0], handpro[1], handpro[2], handpro[3], handpro[4], handpro[5],
               handpro[6], handpro[7], handpro[8], handpro[9]);
           label12.Text = string.Format(
                            "        AA:{0,9}回 {17}%\r" +
                            "        KK:{1,9}回 {18}%\r" +
                            "        QQ:{2,9}回 {19}%\r" +
                            "        JJ:{3,9}回 {20}%\r" +
                            "        TT:{4,9}回 {21}%\r" +
                            "        99:{5,9}回 {22}%\r" +
                            "        88:{6,9}回 {23}%\r" +
                            "        77:{7,9}回 {24}%\r" +
                            "        66:{8,9}回 {25}%\r" +
                            "        55:{9,9}回 {26}%\r" +
                            "        44:{10,9}回 {27}%\r" +
                            "        33:{11,9}回 {28}%\r" +
                            "        22:{12,9}回 {29}%\r" +
                            "    ポケットペア:{34,9}回 {35}%\r" +
                            " スーテッドコネクタ:{13,9}回 {30}%\r" +
                            "     スーテッド:{14,9}回 {31}%\r" +
                            "      コネクタ:{15,9}回 {32}%\r" +
                            "       その他:{16,9}回 {33}%\r"
                            , rankcount[0], rankcount[12], rankcount[11], rankcount[10], rankcount[9],
                              rankcount[8], rankcount[7], rankcount[6], rankcount[5], rankcount[4],
                              rankcount[3], rankcount[2], rankcount[1], rankcount[13], rankcount[14],
                              rankcount[15], rankcount[16],
                              rankpro[0], rankpro[12], rankpro[11], rankpro[10], rankpro[9], rankpro[8], rankpro[7], rankpro[6], rankpro[5],
                              rankpro[4], rankpro[3], rankpro[2], rankpro[1], rankpro[13], rankpro[14], rankpro[15], rankpro[16], pocketcount, pocketpro);
           for (int i = 0; i < judge.Length - 1; i++)
           {
               Display.CardDisplay(judge[i],i);
           }
           pictureBox8.Image = resultimage[0];
           pictureBox9.Image = resultimage[1];
           pictureBox10.Image = resultimage[2];
           pictureBox11.Image = resultimage[3];
           pictureBox12.Image = resultimage[4];
           label9.Text = Display.HandDisplay(judge[5]);
       }

       //DEAL×100ボタン押下時
       private void button2_Click(object sender, EventArgs e)
       {
           label9.Text = "";
           int[] judge = new int[7];
           int rank = 0;
           for (int cnt = 0; cnt < 100; cnt++)
           {
               playcount++;
               Clear.ClearCard();
               Deck.deck = Dealer.Shuffle();
               Dealer.Deal(2);//プリフロップ
               pictureBox1.Image = image[0];
               pictureBox2.Image = image[1];
               rank = Rank.RankHand(Card);
               Dealer.Deal(3);//フロップ
               pictureBox3.Image = image[2];
               pictureBox4.Image = image[3];
               pictureBox5.Image = image[4];
               Dealer.Deal(1);//ターン
               pictureBox6.Image = image[5];
               Dealer.Deal(1);//リバー
               pictureBox7.Image = image[6];
               judge = Judge.JudgeHand(Card);
               RankCounter.RankCount(rank);
               if (rank <= 13)
               {
                   pocketcount++;
                   pocketpro = Math.Round(pocketcount / playcount * 100, 2, MidpointRounding.AwayFromZero);
               }
               HandCounter.HandCount(judge[5]);
           }
           label11.Text = string.Format("   プレイカウント:{0,9}回", playcount);
           label10.Text = string.Format(" ロイヤルフラッシュ:{0,9}回 {10}%\r" +
                                        "ストレートフラッシュ:{1,9}回 {11}%\r" +
                                        "    フォーカード:{2,9}回 {12}%\r" +
                                        "     フルハウス:{3,9}回 {13}%\r" +
                                        "     フラッシュ:{4,9}回 {14}%\r" +
                                        "     ストレート:{5,9}回 {15}%\r" +
                                        "    スリーカード:{6,9}回 {16}%\r" +
                                        "      ツーペア:{7,9}回 {17}%\r" +
                                        "      ワンペア:{8,9}回 {18}%\r" +
                                        "     ハイカード:{9,9}回 {19}%\r"
               , handcount[0], handcount[1], handcount[2], handcount[3], handcount[4],
               handcount[5], handcount[6], handcount[7], handcount[8], handcount[9],
               handpro[0], handpro[1], handpro[2], handpro[3], handpro[4], handpro[5],
               handpro[6], handpro[7], handpro[8], handpro[9]);

           label12.Text = string.Format(
                            "        AA:{0,9}回 {17}%\r" +
                            "        KK:{1,9}回 {18}%\r" +
                            "        QQ:{2,9}回 {19}%\r" +
                            "        JJ:{3,9}回 {20}%\r" +
                            "        TT:{4,9}回 {21}%\r" +
                            "        99:{5,9}回 {22}%\r" +
                            "        88:{6,9}回 {23}%\r" +
                            "        77:{7,9}回 {24}%\r" +
                            "        66:{8,9}回 {25}%\r" +
                            "        55:{9,9}回 {26}%\r" +
                            "        44:{10,9}回 {27}%\r" +
                            "        33:{11,9}回 {28}%\r" +
                            "        22:{12,9}回 {29}%\r" +
                            "    ポケットペア:{34,9}回 {35}%\r" +
                            " スーテッドコネクタ:{13,9}回 {30}%\r" +
                            "     スーテッド:{14,9}回 {31}%\r" +
                            "      コネクタ:{15,9}回 {32}%\r" +
                            "       その他:{16,9}回 {33}%\r"
                            , rankcount[0], rankcount[12], rankcount[11], rankcount[10], rankcount[9],
                              rankcount[8], rankcount[7], rankcount[6], rankcount[5], rankcount[4],
                              rankcount[3], rankcount[2], rankcount[1], rankcount[13], rankcount[14],
                              rankcount[15], rankcount[16],
                              rankpro[0], rankpro[12], rankpro[11], rankpro[10], rankpro[9], rankpro[8], rankpro[7], rankpro[6], rankpro[5],
                              rankpro[4], rankpro[3], rankpro[2], rankpro[1], rankpro[13], rankpro[14], rankpro[15], rankpro[16], pocketcount, pocketpro);

           for (int i = 0; i < judge.Length - 1; i++)
           {
               Display.CardDisplay(judge[i], i);
           }
           pictureBox8.Image = resultimage[0];
           pictureBox9.Image = resultimage[1];
           pictureBox10.Image = resultimage[2];
           pictureBox11.Image = resultimage[3];
           pictureBox12.Image = resultimage[4];
           label9.Text = Display.HandDisplay(judge[5]);
       }

       public class Clear
       {
           //カード初期化
           public static void ClearCard()
           {
               count = 0;
               for (int i = 0; i < 7; i++)
               {
                   Card[i] = 0;
                   image[i] = null;
               }
           }
       }

       public class Deck
       {
           //52枚のデックを構成。1の位がスート 1:スペード 2:ハート 3:ダイア 4:クラブ 上位2桁は数字。
           public static int[] deck = new int[52]
           { 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131,
             12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132,
             13, 23, 33, 43, 53, 63, 73, 83, 93, 103, 113, 123, 133,
             14, 24, 34, 44, 54, 64, 74, 84, 94, 104, 114, 124, 134};
       }

       public class Dealer
       {
           //シャッフルメソッド。DEALボタン押下時に1回だけ実行。山札を混ぜます。混ぜたデッキが戻り値です。
           public static int[] Shuffle()
           {
               int seed = Environment.TickCount;
               int tmp = 0;
               for (int i = 0; i < 52; i++)
               {
                   System.Random r = new System.Random(seed++);
                   int rnd = r.Next(52);
                   tmp = Deck.deck[i];
                   Deck.deck[i] = Deck.deck[rnd];
                   Deck.deck[rnd] = tmp;
               }
               return Deck.deck;
           }

           //カードを引数で得た数字分配ります
           public static void Deal(int DealCount)
           {
               for (int i = 0; i < DealCount; i++)
               {
                   Card[count] = Deck.deck[count];//デッキから1枚手札orボードに配る
                   //カード表示用配列imageにresourcesから得た画像を格納
                   switch (Card[count])
                   {
                       case 11:
                           {
                               image[count] = Properties.Resources.s01;
                               break;
                           }
                       case 21:
                           {
                               image[count] = Properties.Resources.s02;
                               break;
                           }
                       case 31:
                           {
                               image[count] = Properties.Resources.s03;
                               break;
                           }
                       case 41:
                           {
                               image[count] = Properties.Resources.s04;
                               break;
                           }
                       case 51:
                           {
                               image[count] = Properties.Resources.s05;
                               break;
                           }
                       case 61:
                           {
                               image[count] = Properties.Resources.s06;
                               break;
                           }
                       case 71:
                           {
                               image[count] = Properties.Resources.s07;
                               break;
                           }
                       case 81:
                           {
                               image[count] = Properties.Resources.s08;
                               break;
                           }
                       case 91:
                           {
                               image[count] = Properties.Resources.s09;
                               break;
                           }
                       case 101:
                           {
                               image[count] = Properties.Resources.s10;
                               break;
                           }
                       case 111:
                           {
                               image[count] = Properties.Resources.s11;
                               break;
                           }
                       case 121:
                           {
                               image[count] = Properties.Resources.s12;
                               break;
                           }
                       case 131:
                           {
                               image[count] = Properties.Resources.s13;
                               break;
                           }
                       case 12:
                           {
                               image[count] = Properties.Resources.h01;
                               break;
                           }
                       case 22:
                           {
                               image[count] = Properties.Resources.h02;
                               break;
                           }
                       case 32:
                           {
                               image[count] = Properties.Resources.h03;
                               break;
                           }
                       case 42:
                           {
                               image[count] = Properties.Resources.h04;
                               break;
                           }
                       case 52:
                           {
                               image[count] = Properties.Resources.h05;
                               break;
                           }
                       case 62:
                           {
                               image[count] = Properties.Resources.h06;
                               break;
                           }
                       case 72:
                           {
                               image[count] = Properties.Resources.h07;
                               break;
                           }
                       case 82:
                           {
                               image[count] = Properties.Resources.h08;
                               break;
                           }
                       case 92:
                           {
                               image[count] = Properties.Resources.h09;
                               break;
                           }
                       case 102:
                           {
                               image[count] = Properties.Resources.h10;
                               break;
                           }
                       case 112:
                           {
                               image[count] = Properties.Resources.h11;
                               break;
                           }
                       case 122:
                           {
                               image[count] = Properties.Resources.h12;
                               break;
                           }
                       case 132:
                           {
                               image[count] = Properties.Resources.h13;
                               break;
                           }
                       case 13:
                           {
                               image[count] = Properties.Resources.d01;
                               break;
                           }
                       case 23:
                           {
                               image[count] = Properties.Resources.d02;
                               break;
                           }
                       case 33:
                           {
                               image[count] = Properties.Resources.d03;
                               break;
                           }
                       case 43:
                           {
                               image[count] = Properties.Resources.d04;
                               break;
                           }
                       case 53:
                           {
                               image[count] = Properties.Resources.d05;
                               break;
                           }
                       case 63:
                           {
                               image[count] = Properties.Resources.d06;
                               break;
                           }
                       case 73:
                           {
                               image[count] = Properties.Resources.d07;
                               break;
                           }
                       case 83:
                           {
                               image[count] = Properties.Resources.d08;
                               break;
                           }
                       case 93:
                           {
                               image[count] = Properties.Resources.d09;
                               break;
                           }
                       case 103:
                           {
                               image[count] = Properties.Resources.d10;
                               break;
                           }
                       case 113:
                           {
                               image[count] = Properties.Resources.d11;
                               break;
                           }
                       case 123:
                           {
                               image[count] = Properties.Resources.d12;
                               break;
                           }
                       case 133:
                           {
                               image[count] = Properties.Resources.d13;
                               break;
                           }
                       case 14:
                           {
                               image[count] = Properties.Resources.c01;
                               break;
                           }
                       case 24:
                           {
                               image[count] = Properties.Resources.c02;
                               break;
                           }
                       case 34:
                           {
                               image[count] = Properties.Resources.c03;
                               break;
                           }
                       case 44:
                           {
                               image[count] = Properties.Resources.c04;
                               break;
                           }
                       case 54:
                           {
                               image[count] = Properties.Resources.c05;
                               break;
                           }
                       case 64:
                           {
                               image[count] = Properties.Resources.c06;
                               break;
                           }
                       case 74:
                           {
                               image[count] = Properties.Resources.c07;
                               break;
                           }
                       case 84:
                           {
                               image[count] = Properties.Resources.c08;
                               break;
                           }
                       case 94:
                           {
                               image[count] = Properties.Resources.c09;
                               break;
                           }
                       case 104:
                           {
                               image[count] = Properties.Resources.c10;
                               break;
                           }
                       case 114:
                           {
                               image[count] = Properties.Resources.c11;
                               break;
                           }
                       case 124:
                           {
                               image[count] = Properties.Resources.c12;
                               break;
                           }
                       case 134:
                           {
                               image[count] = Properties.Resources.c13;
                               break;
                           }
                   }
                   count++;
               }
           }
       }

       public class HandCounter
       {
           //役をカウントします。handpro[]には役が出た確率を格納します
           public static void HandCount(int hand)
           {
               switch (hand)
               {
                   case 1:
                       {
                           handcount[0]++;
                           break;
                       }
                   case 2:
                       {
                           handcount[1]++;
                           break;
                       }
                   case 3:
                       {
                           handcount[2]++;
                           break;
                       }
                   case 4:
                       {
                           handcount[3]++;
                           break;
                       }
                   case 5:
                       {
                           handcount[4]++;
                           break;
                       }
                   case 6:
                       {
                           handcount[5]++;
                           break;
                       }
                   case 7:
                       {
                           handcount[6]++;
                           break;
                       }
                   case 8:
                       {
                           handcount[7]++;
                           break;
                       }
                   case 9:
                       {
                           handcount[8]++;
                           break;
                       }
                   case 10:
                       {
                           handcount[9]++;
                           break;
                       }
               }
               for (int i = 0; i < 10; i++)
               {
                   handpro[i] = Math.Round(handcount[i] / playcount * 100, 2, MidpointRounding.AwayFromZero);
               }
           }
       }

       public class RankCounter//手札の種類をカウントします。rankpro[]には確率を格納します
       {
           public static void RankCount(int rank)
           {
               switch (rank)
               {
                   case 1:
                       {
                           rankcount[0]++;
                           break;
                       }
                   case 2:
                       {
                           rankcount[1]++;
                           break;
                       }
                   case 3:
                       {
                           rankcount[2]++;
                           break;
                       }
                   case 4:
                       {
                           rankcount[3]++;
                           break;
                       }
                   case 5:
                       {
                           rankcount[4]++;
                           break;
                       }
                   case 6:
                       {
                           rankcount[5]++;
                           break;
                       }
                   case 7:
                       {
                           rankcount[6]++;
                           break;
                       }
                   case 8:
                       {
                           rankcount[7]++;
                           break;
                       }
                   case 9:
                       {
                           rankcount[8]++;
                           break;
                       }
                   case 10:
                       {
                           rankcount[9]++;
                           break;
                       }
                   case 11:
                       {
                           rankcount[10]++;
                           break;
                       }
                   case 12:
                       {
                           rankcount[11]++;
                           break;
                       }
                   case 13:
                       {
                           rankcount[12]++;
                           break;
                       }
                   case 20:
                       {
                           rankcount[13]++;
                           break;
                       }
                   case 30:
                       {
                           rankcount[14]++;
                           break;
                       }
                   case 40:
                       {
                           rankcount[15]++;
                           break;
                       }
                   case 50:
                       {
                           rankcount[16]++;
                           break;
                       }
               }
               for (int i = 0; i < 17; i++)
               {
                   rankpro[i] = 0;
                   rankpro[i] = Math.Round(rankcount[i] / playcount * 100, 2, MidpointRounding.AwayFromZero);
               }
           }
       }

       public class Judge
       {
           static int paircount = 0;
           static int suitcount = 0;//スートを数えます。5以上でフラッシュ。フラッシュ判定用。
           readonly static int[] hand = new int[6] { 0, 0, 0, 0, 0, 0 };//役とベストハンド。戻り値として扱う。hand[5]は役。
           //役判定メソッド。役を判定します。
           public static int[] JudgeHand(int[] judgehand)
           {
               for (int i = 0; i < 6; i++)//役、ベストハンド配列初期化
               {
                   hand[i] = 0;
               }
               suitcount = 0;
               paircount = 0;
               if (count >= 5)//グローバル変数 count 配った枚数が5枚以上であればフラッシュ・ストレート判定開始
               {
                   FlushJudge(judgehand);
                   if (hand[5] == 0)
                   {
                       StraightJudge(judgehand);
                   }
               }
               if (hand[5] == 0)
                   PairJudge(judgehand);
               if (hand[5] == 0)
               {
                   hand[5] = 10;//ここまで役が該当しなければハイカード確定
                   Array.Sort(judgehand);
                   Array.Reverse(judgehand);
                   int cnt = 0;
                   if (judgehand[6] / 10 == 1)
                   {
                       hand[0] = judgehand[6];
                       cnt++;
                   }

                   for (int i = cnt; i < 5; i++)
                   {
                       hand[i] = judgehand[i];
                   }
               }
               return hand;//戻り値はhand[0-4]がベストハンドhand[5]が役
           }

           //フラッシュ役判定。各スートをシーケンシャルで判定
           public static int[] FlushJudge(int[] judgehand)
           {
               int tmp = 0;//ソート用一時的な変数
               int bestcount = 0;
               int[] flushhand = new int[7] { 999, 999, 999, 999, 999, 999, 999 }; //フラッシュ判定格納用

               for (int i = 1; i <= 4; i++)//スペード・ハート・ダイア・クラブを順にiに代入
               {
                   suitcount = 0;
                   for (int j = 0; j < count; j++)//配られた枚数分スートを確認
                   {
                       if (judgehand[j] % 10 == i)//判定用配列よりスートを抽出し、現在参照しているスートと同じか判定
                       {
                           flushhand[suitcount] = judgehand[j];//フラッシュ判定用配列に数値を格納
                           suitcount++;//同スートカウントをインクリメント
                       }
                   }
                   if (suitcount >= 5)//同スートが5枚以上でフラッシュフラグを立てる。スートに対応する数字をフラグに格納
                   {
                       hand[5] = 5;//役をフラッシュにセット。
                       Array.Sort(flushhand);//フラッシュのスートを昇順に並び替え
                       //ロイヤルフラッシュ判定
                       if (flushhand[0] / 10 == 1)
                           for (int cnt = 0; cnt <= 2; cnt++)
                           {
                               if (flushhand[1 + cnt] / 10 == 10)
                                   if (flushhand[2 + cnt] / 10 == 11)
                                       if (flushhand[3 + cnt] / 10 == 12)
                                           if (flushhand[4 + cnt] / 10 == 13)
                                           {
                                               tmp = flushhand[0];
                                               for (int m = 0; m < 4; m++)
                                               {
                                                   hand[m] = flushhand[cnt + m + 1];
                                               }
                                               hand[4] = tmp;//Aを末尾に格納
                                               hand[5] = 1;//役はロイヤルフラッシュ
                                           }
                           }

                       //ストレートフラッシュ判定
                       if (hand[5] != 1)//ロイヤルフラッシュじゃなければ判定開始
                       {
                           for (int cnt = 0; cnt < suitcount - 4; cnt++)//昇順ソートしたフラッシュ配列を始点から+4枚目までを確認し、5連番であればストレートフラッシュ。
                           {
                               if (flushhand[cnt] / 10 == (flushhand[cnt + 1] / 10) - 1)
                                   if (flushhand[cnt] / 10 == flushhand[cnt + 2] / 10 - 2)
                                       if (flushhand[cnt] / 10 == flushhand[cnt + 3] / 10 - 3)
                                           if (flushhand[cnt] / 10 == flushhand[cnt + 4] / 10 - 4)
                                           {
                                               for (int m = cnt; m < 5 + cnt; m++)
                                               {
                                                   hand[m] = flushhand[m + cnt];
                                               }
                                               hand[5] = 2;
                                           }
                           }
                       }

                       if (hand[5] == 5)//フラッシュ
                       {
                           Array.Sort(flushhand);
                           Array.Reverse(flushhand);//配列をひっくり返して降順に
                           if (flushhand[6] / 10 == 1)//Aハイフラッシュかどうかを判定
                           {
                               hand[0] = flushhand[6];
                               bestcount++;
                           }
                           for (int cnt = 0; cnt < 7; cnt++)
                           {
                               if (flushhand[cnt] != 999)
                               {
                                   hand[bestcount] = flushhand[cnt];
                                   bestcount++;
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                       if (hand[5] != 0)
                           break;//フラッシュフラグが立ったらループを抜ける。他のスートは見ない。
                   }
               }
               return hand;
           }

           //ストレート判定
           public static int[] StraightJudge(int[] judgehand)
           {
               int[] numcount = new int[13] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
               int bestcount = 0;
               for (int cnt = 0; cnt < 7; cnt++)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (judgehand[cnt] / 10 == i + 1) //数字毎に枚数をカウント
                       {
                           numcount[i]++;
                       }
                   }
               }
               if (numcount[0] > 0)//Aハイストレート判定
               {
                   if (numcount[12] > 0)
                       if (numcount[11] > 0)
                           if (numcount[10] > 0)
                               if (numcount[9] > 0)
                               {
                                   hand[5] = 6;
                                   for (int i = 9; i < 13; i++)
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                               break;
                                           }
                                       }
                                       if (bestcount == 5)
                                           break;
                                   }
                                   Array.Sort(judgehand);//昇順ソートでjudgehand[0]にAを格納
                                   hand[bestcount] = judgehand[0];//Aをhand[0]に格納
                                   bestcount++;
                               }
               }
               if (hand[5] == 0)
               {
                   for (int i = 12; i >= 4; i--)
                   {
                       bestcount = 0;
                       if (numcount[i] > 0)
                           if (numcount[i - 1] > 0)
                               if (numcount[i - 2] > 0)
                                   if (numcount[i - 3] > 0)
                                       if (numcount[i - 4] > 0)
                                       {
                                           hand[5] = 6;
                                           for (int end = i; end >= i - 4; end--)
                                           {
                                               for (int j = 0; j < count; j++)
                                               {
                                                   if (judgehand[j] / 10 == end + 1)
                                                   {
                                                       hand[bestcount] = judgehand[j];
                                                       bestcount++;
                                                       break;
                                                   }
                                               }
                                               if (bestcount == 5)
                                                   break;
                                           }
                                       }
                   }
               }
               return hand;
           }

           //1ペア・2ペア・3カード・4カード・フルハウス判定
           public static int[] PairJudge(int[] judgehand)
           {
               int[] numcount = new int[13] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
               int bestcount = 0;
               for (int cnt = 0; cnt < 7; cnt++)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (judgehand[cnt] / 10 == i + 1) //数字毎に枚数をカウント
                       {
                           numcount[i]++;
                       }
                   }
               }
               if (numcount[0] == 4)//Aの4カードが含まれるなら
               {
                   hand[5] = 3;//4カード確定
                   for (int j = 0; j < count; j++)
                   {
                       if (judgehand[j] / 10 == 1)
                       {
                           hand[bestcount] = judgehand[j];
                           bestcount++;
                       }
                   }
               }
               if (hand[5] == 0)
               {
                   for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                   {
                       if (numcount[i] == 4)//同じ札が4枚あるか
                       {
                           hand[5] = 3;//フォーカード確定
                           for (int j = 0; j < count; j++)
                           {
                               if (judgehand[j] / 10 == i + 1)
                               {
                                   hand[bestcount] = judgehand[j];//ベストハンド配列に4カードの札を格納
                                   bestcount++;
                               }
                           }
                           break;
                       }
                   }
               }
               if (hand[5] != 0)
               {
                   if (numcount[0] != 4)//Aの4カードじゃなければ
                   {
                       if (numcount[0] > 0)
                       {
                           for (int j = 0; j < count; j++)
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];//ベストハンド配列にAを格納
                                   bestcount++;
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                   }
                   if (bestcount < 5)//上の処理をしていなければ
                   {
                       for (int m = 12; m >= 0; m--)//キッカー判定。一番大きい数字かつ4カード以外の数字をnumcount1以上の数字から探索
                       {
                           if (numcount[m] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの5枚目に格納
                           {
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != m + 1)//最大の数字が4カードの数字と同じじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == m + 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                           break;
                                       }
                                   }
                               }
                               if (bestcount == 5)
                                   break;
                           }
                       }
                   }
               }
               //フルハウス・3カード判定
               if (hand[5] == 0)
               {
                   if (numcount[0] == 3)//Aの3カードなら
                   {
                       hand[5] = 7;//3カードフラグ
                       for (int j = 0; j < count; j++)
                       {
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];
                                   bestcount++;
                               }
                           }
                       }
                   }
                   if (hand[5] == 0)
                   {
                       for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                       {
                           if (numcount[i] == 3)
                           {
                               hand[5] = 7;//3カードフラグ
                               for (int j = 0; j < count; j++)
                               {
                                   if (judgehand[j] / 10 == i + 1)
                                   {
                                       hand[bestcount] = judgehand[j];//ベストハンド配列に3カードの札を格納
                                       bestcount++;
                                   }
                               }
                               if (bestcount == 3)
                                   break;
                           }
                       }
                   }
                   if (hand[5] == 7)//3カードフラグは立っているか
                   {
                       if (numcount[0] == 2)//Aのペアが含まれるなら
                       {
                           hand[5] = 4;//3カードからフルハウスにランクアップ
                           for (int j = 0; j < count; j++)
                           {
                               if (hand[0] / 10 != 1)//3カードの数字がAじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                               {
                                   if (judgehand[j] / 10 == 1)
                                   {
                                       hand[bestcount] = judgehand[j];
                                       bestcount++;
                                   }
                               }
                           }
                       }

                       if (bestcount != 5)
                       {
                           for (int i = 12; i >= 0; i--)//高い数字からシーケンシャル探索
                           {
                               if (bestcount == 5)
                                   break;
                               if (hand[0] / 10 != i + 1)//最大の数字が3カードの数字と同じじゃなければペアの札を見る(便宜上配列の一番最初[0]を参照)
                                   if (numcount[i] >= 2)
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           {
                                               if (judgehand[j] / 10 == i + 1)
                                               {
                                                   hand[bestcount] = judgehand[j];//ベストハンド配列にペアの札を格納
                                                   bestcount++;
                                               }
                                           }
                                       }
                                       hand[5] = 4;//3カードからフルハウスにランクアップ
                                       break;
                                   }
                           }
                       }
                       if (hand[5] == 7)//3カードキッカー判定
                       {
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//3カードの数字がAじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }

                           for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつ3カード以外の数字をnumcount1以上の数字から探索
                           {
                               if (bestcount == 5)
                                   break;

                               if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの4,5枚目に格納
                               {
                                   for (int j = 0; j < count; j++)
                                   {
                                       if (hand[0] / 10 != i + 1)//最大の数字が3カードの数字と同じじゃなければ4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                           }
                                           if (bestcount == 5)
                                               break;
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
               if (hand[5] == 0)//2ペア・1ペア判定
               {
                   if (numcount[0] == 2)//Aのペアなら
                   {
                       paircount++;
                       for (int j = 0; j < count; j++)
                       {
                           {
                               if (judgehand[j] / 10 == 1)
                               {
                                   hand[bestcount] = judgehand[j];
                                   bestcount++;
                               }
                           }
                       }
                   }
                   for (int i = 12; i >= 1; i--)//高い数字からシーケンシャル探索
                   {
                       if (numcount[i] == 2)
                       {
                           paircount++;
                           {
                               for (int j = 0; j < count; j++)
                               {
                                   if (judgehand[j] / 10 == i + 1)
                                   {
                                       hand[bestcount] = judgehand[j];//ベストハンド配列にペアの札を格納
                                       bestcount++;
                                   }
                               }
                               if (paircount == 2)
                                   break;
                           }
                       }
                   }
                   switch (paircount)
                   {
                       case 1:
                           hand[5] = 9;//1ペア確定
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//ペアの数字がAじゃなければ3,4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }
                           for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつペア以外の数字をnumcount1以上の数字から探索
                           {
                               if (bestcount == 5)
                                   break;

                               if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの3,4,5枚目に格納
                               {
                                   for (int j = 0; j < count; j++)
                                   {
                                       if (hand[0] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ3,4,5枚目に格納(便宜上配列の一番最初[0]を参照)
                                       {
                                           if (judgehand[j] / 10 == i + 1)
                                           {
                                               hand[bestcount] = judgehand[j];
                                               bestcount++;
                                           }
                                           if (bestcount == 5)
                                               break;
                                       }
                                   }
                               }
                           }
                           break;

                       case 2:
                           hand[5] = 8;//2ペア確定
                           if (numcount[0] > 0)//Aが1枚でも含まれていればAキッカー判定
                               for (int j = 0; j < count; j++)
                               {
                                   if (hand[0] / 10 != 1)//ペアの数字がAじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                   {
                                       if (judgehand[j] / 10 == 1)
                                       {
                                           hand[bestcount] = judgehand[j];
                                           bestcount++;
                                       }
                                   }
                               }
                           if (bestcount != 5)//5枚格納されていなければ以下処理を行う
                               for (int i = 12; i >= 0; i--)//キッカー判定。一番大きい数字かつペア以外の数字をnumcount1以上の数字から探索
                               {
                                   if (bestcount == 5)
                                       break;

                                   if (numcount[i] > 0)//大きい数字から探索し1枚でも引っかかったらベストハンドの5枚目に格納
                                   {
                                       for (int j = 0; j < count; j++)
                                       {
                                           if (hand[0] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ5枚目に格納(便宜上配列の一番最初[0]を参照)
                                           {
                                               if (hand[2] / 10 != i + 1)//最大の数字がペアの数字と同じじゃなければ5枚目に格納(便宜上2ペアの数字(配列の3番目)を参照)
                                               {
                                                   if (judgehand[j] / 10 == i + 1)
                                                   {
                                                       hand[bestcount] = judgehand[j];
                                                       bestcount++;
                                                   }
                                                   if (bestcount == 5)
                                                       break;
                                               }
                                           }
                                       }
                                   }
                               }
                           break;
                   }
               }

               return hand;
           }
       }

       public class Rank
       {
           public static int RankHand(int[] judgehand)
           {
               int rank = 0;
               //手札判定(Rank)
               //1~13:ポケット
               //20:スーテッドコネクタ
               //30:スーテッド
               //40:コネクタ
               //50:その他
               if (judgehand[0] / 10 == judgehand[1] / 10)
               {
                   rank = judgehand[0] / 10;//ポケットの数字を格納
               }
               else
               {
                   if (judgehand[0] / 10 == 1)//手札1枚目がAなら2枚目Kでコネクタ。スートが同じならスーテッドコネクタ。
                   {
                       if (judgehand[1] / 10 == 13)
                       {
                           if (judgehand[0] % 10 == judgehand[1] % 10)
                           {
                               rank = 20;
                           }
                           else
                           {
                               rank = 40;
                           }
                       }
                       else
                       {
                           if (judgehand[0] % 10 == judgehand[1] % 10)
                           {
                               rank = 30;
                           }
                           else
                           {
                               rank = 50;
                           }
                       }
                   }
                   if (rank == 0)
                   {
                       if (judgehand[1] / 10 == 1)//手札2枚目がAなら1枚目Kでコネクタ。スートが同じならスーテッドコネクタ。
                       {
                           if (judgehand[0] / 10 == 13)
                           {
                               if (judgehand[0] % 10 == judgehand[1] % 10)
                               {
                                   rank = 20;
                               }
                               else
                               {
                                   rank = 40;
                               }
                           }
                           else
                           {
                               if (judgehand[0] % 10 == judgehand[1] % 10)
                               {
                                   rank = 30;
                               }
                               else
                               {
                                   rank = 50;
                               }
                           }
                       }
                   }
                   if (rank == 0) //ポケットではない・Aが含まれない場合、手札の数字が1差であればコネクタ
                   {
                       if (judgehand[0] / 10 + 1 == judgehand[1] / 10)
                       {
                           if (judgehand[0] % 10 == judgehand[1] % 10)
                           {
                               rank = 20;
                           }
                           else
                           {
                               rank = 40;
                           }
                       }
                       if (rank == 0)
                       {
                           if (judgehand[0] / 10 == judgehand[1] / 10 + 1)
                           {
                               if (judgehand[0] % 10 == judgehand[1] % 10)
                               {
                                   rank = 20;
                               }
                               else
                               {
                                   rank = 40;
                               }
                           }
                       }
                   }
                   if (rank == 0)
                   {
                       if (judgehand[0] % 10 == judgehand[1] % 10)
                       {
                           rank = 30;
                       }
                       else
                       {
                           rank = 50;
                       }
                   }
               }
               return rank;
           }
       }

       public class Display
       {
           //表示するべきカードをimageへ格納
           public static void CardDisplay(int Card,int cnt)
           {
               switch (Card)
               {
                   case 11:
                       {
                           resultimage[cnt] = Properties.Resources.s01;
                           break;
                       }
                   case 21:
                       {
                           resultimage[cnt] = Properties.Resources.s02;
                           break;
                       }
                   case 31:
                       {
                           resultimage[cnt] = Properties.Resources.s03;
                           break;
                       }
                   case 41:
                       {
                           resultimage[cnt] = Properties.Resources.s04;
                           break;
                       }
                   case 51:
                       {
                           resultimage[cnt] = Properties.Resources.s05;
                           break;
                       }
                   case 61:
                       {
                           resultimage[cnt] = Properties.Resources.s06;
                           break;
                       }
                   case 71:
                       {
                           resultimage[cnt] = Properties.Resources.s07;
                           break;
                       }
                   case 81:
                       {
                           resultimage[cnt] = Properties.Resources.s08;
                           break;
                       }
                   case 91:
                       {
                           resultimage[cnt] = Properties.Resources.s09;
                           break;
                       }
                   case 101:
                       {
                           resultimage[cnt] = Properties.Resources.s10;
                           break;
                       }
                   case 111:
                       {
                           resultimage[cnt] = Properties.Resources.s11;
                           break;
                       }
                   case 121:
                       {
                           resultimage[cnt] = Properties.Resources.s12;
                           break;
                       }
                   case 131:
                       {
                           resultimage[cnt] = Properties.Resources.s13;
                           break;
                       }
                   case 12:
                       {
                           resultimage[cnt] = Properties.Resources.h01;
                           break;
                       }
                   case 22:
                       {
                           resultimage[cnt] = Properties.Resources.h02;
                           break;
                       }
                   case 32:
                       {
                           resultimage[cnt] = Properties.Resources.h03;
                           break;
                       }
                   case 42:
                       {
                           resultimage[cnt] = Properties.Resources.h04;
                           break;
                       }
                   case 52:
                       {
                           resultimage[cnt] = Properties.Resources.h05;
                           break;
                       }
                   case 62:
                       {
                           resultimage[cnt] = Properties.Resources.h06;
                           break;
                       }
                   case 72:
                       {
                           resultimage[cnt] = Properties.Resources.h07;
                           break;
                       }
                   case 82:
                       {
                           resultimage[cnt] = Properties.Resources.h08;
                           break;
                       }
                   case 92:
                       {
                           resultimage[cnt] = Properties.Resources.h09;
                           break;
                       }
                   case 102:
                       {
                           resultimage[cnt] = Properties.Resources.h10;
                           break;
                       }
                   case 112:
                       {
                           resultimage[cnt] = Properties.Resources.h11;
                           break;
                       }
                   case 122:
                       {
                           resultimage[cnt] = Properties.Resources.h12;
                           break;
                       }
                   case 132:
                       {
                           resultimage[cnt] = Properties.Resources.h13;
                           break;
                       }
                   case 13:
                       {
                           resultimage[cnt] = Properties.Resources.d01;
                           break;
                       }
                   case 23:
                       {
                           resultimage[cnt] = Properties.Resources.d02;
                           break;
                       }
                   case 33:
                       {
                           resultimage[cnt] = Properties.Resources.d03;
                           break;
                       }
                   case 43:
                       {
                           resultimage[cnt] = Properties.Resources.d04;
                           break;
                       }
                   case 53:
                       {
                           resultimage[cnt] = Properties.Resources.d05;
                           break;
                       }
                   case 63:
                       {
                           resultimage[cnt] = Properties.Resources.d06;
                           break;
                       }
                   case 73:
                       {
                           resultimage[cnt] = Properties.Resources.d07;
                           break;
                       }
                   case 83:
                       {
                           resultimage[cnt] = Properties.Resources.d08;
                           break;
                       }
                   case 93:
                       {
                           resultimage[cnt] = Properties.Resources.d09;
                           break;
                       }
                   case 103:
                       {
                           resultimage[cnt] = Properties.Resources.d10;
                           break;
                       }
                   case 113:
                       {
                           resultimage[cnt] = Properties.Resources.d11;
                           break;
                       }
                   case 123:
                       {
                           resultimage[cnt] = Properties.Resources.d12;
                           break;
                       }
                   case 133:
                       {
                           resultimage[cnt] = Properties.Resources.d13;
                           break;
                       }
                   case 14:
                       {
                           resultimage[cnt] = Properties.Resources.c01;
                           break;
                       }
                   case 24:
                       {
                           resultimage[cnt] = Properties.Resources.c02;
                           break;
                       }
                   case 34:
                       {
                           resultimage[cnt] = Properties.Resources.c03;
                           break;
                       }
                   case 44:
                       {
                           resultimage[cnt] = Properties.Resources.c04;
                           break;
                       }
                   case 54:
                       {
                           resultimage[cnt] = Properties.Resources.c05;
                           break;
                       }
                   case 64:
                       {
                           resultimage[cnt] = Properties.Resources.c06;
                           break;
                       }
                   case 74:
                       {
                           resultimage[cnt] = Properties.Resources.c07;
                           break;
                       }
                   case 84:
                       {
                           resultimage[cnt] = Properties.Resources.c08;
                           break;
                       }
                   case 94:
                       {
                           resultimage[cnt] = Properties.Resources.c09;
                           break;
                       }
                   case 104:
                       {
                           resultimage[cnt] = Properties.Resources.c10;
                           break;
                       }
                   case 114:
                       {
                           resultimage[cnt] = Properties.Resources.c11;
                           break;
                       }
                   case 124:
                       {
                           resultimage[cnt] = Properties.Resources.c12;
                           break;
                       }
                   case 134:
                       {
                           resultimage[cnt] = Properties.Resources.c13;
                           break;
                       }
                   default:
                       {
                           break;
                       }
               }
           }
           //表示するべき役を格納(1ロイヤルフラッシュ~10ハイカード)
           public static string HandDisplay(int handresult)
           {
               string handstr = "";
               switch (handresult)
               {
                   case 1:
                       {
                           handstr = "ロイヤルフラッシュ";
                           break;
                       }
                   case 2:
                       {
                           handstr = "ストレートフラッシュ";
                           break;
                       }
                   case 3:
                       {
                           handstr = "フォーカード";
                           break;
                       }
                   case 4:
                       {
                           handstr = "フルハウス";
                           break;
                       }
                   case 5:
                       {
                           handstr = "フラッシュ";
                           break;
                       }
                   case 6:
                       {
                           handstr = "ストレート";
                           break;
                       }
                   case 7:
                       {
                           handstr = "スリーカード";
                           break;
                       }
                   case 8:
                       {
                           handstr = "ツーペア";
                           break;
                       }
                   case 9:
                       {
                           handstr = "ワンペア";
                           break;
                       }
                   case 10:
                       {
                           handstr = "ハイカード";
                           break;
                       }
               }
               return handstr;
           }
       }
   }
}



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