• ベストアンサー

ポーカーの手の判断

C++でポーカーの手を判断するプログラムを作ろうと思っています。ワンペアーを判断するプログラムすら分からないのですが、教えて下さい。 できることなら他の手(ツーペアー、スリーカード、フォーカード、フラッシュ、ストレート、フルハウス、ストレートフラッシュ、ロイヤルストレートフラッシュ)も教えて下さい。m(_ _)m *ワンペアー ・・・ 同じ数字のカードが2枚  ツーペアー ・・・ ワンペアーが2組  スリーペアー・・・ 同じ数字のカードが3枚  フォーペアー・・・ 同じ数字のカードが4枚  フラッシュ ・・・ 5枚とも同じマーク  ストレート ・・・ 5枚とも同じ数字  フルハウス ・・・ ワンペアかつスリーカード  ストレートフラッシュ・ストレートかつフラッシュ  ロイヤルストレートフラッシュ・ストレートフラッシュで5枚のカードが10,J,Q,K,A

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

いろいろやり方はあると思いますが、 やる前にまずソートするのがいいでしょう。 たとえば「7 3 1 7 Q」などのカードがあれば、 (数字順で)ソートしたら「1 3 7 7 Q」となります。 同じ数字があればかならず隣り合っています。 そこを for(j=0; j<5-1; j++){ if(cards[j] == cards[j+1])onepair(); } のようにループで調べることができます。 スリーカードも同様に調べられますが、 「ワンペア」→「スリーカード」の順で調べると 重複して数えてしまうので、 「フォーカード」→「スリーカード」→「ワンペア」 の順で調べるようにして、役該当カードは取り除く、 などの工夫が必要になるでしょう。 「ペア系判別ルーチン」「フラッシュ判別ルーチン」 「ストレート判別ルーチン」などを別個に作って、 一つ一つ通して、最後にストレートフラッシュなどの複合役を判別する、と言う流れになるかと思います。 ワイルドカードが入ると急に難しくなりますね。 入っている場合、 ・既に成り立っている役を変換する。(「ワンペア」→「スリーカード」に昇格する、など) ・ワイルドカードに52枚ぜんぶ入れてみて、もっとも強い役を選択する。 などの方法があると思います。 なお、私も詳しくはないのですが、 書かれているポーカーの役はちょっと違うのではという気がします。 「スリーペア」「フォーペア」は、 普通は「スリーカード」「フォーカード」で、 「ストレート」は「5枚の数字が順に並んでいる」だと思います。

0000ai
質問者

お礼

分かりやすいご指導ありがとうございます。 どんな流れでプログラムを組んだら良いかだいたい分かりました。しかし、お恥ずかしながらプログラミングの勉強不足なため、数字を順に並べる方法が思いつきません。数字を順に並べるプログラムを教えて下さい。

0000ai
質問者

補足

おっしゃる通り「ストレートは5枚のカードの数字が連続する」でした。 出てきた数字を順に並べる事は思いつきませんでした。ありがとうございます。

その他の回答 (3)

noname#30727
noname#30727
回答No.4

フラッシュは省略するとして、 判定するのに、どういう中間データを作成すると簡単になるのかという事が全てなのですが、私からも1つ。 条件: J、Q、K をそれぞれ 11、12、13 として、A を 1 と 14 の両方とする。 int work[15] を作成して、全て0で初期化する。 カード5枚の、マークを無視した数字部分を使って、work[数字]++ を5回実行する。 (Aのときだけ、work[1] と work[14] の両方に1を足す) フォーカードであれば、work[1]~work[13]のどこかに4があり、フルハウスであれば、同様に3と2があるはずです。work[1]~work[13]をループで見ていき、4と3と2の数をカウントするだけでストレート以外は判定できます。 ストレートは、配列の連続した5箇所が全て1になっているはずなので、work[1]~work[14]をループで見ていけばすぐに判定できるでしょう。 ロイヤルストレートかどうかは、ストレートが満たされて、work[14]が1かどうかで判定できます。

回答No.3

#1です。 コメントが無いところをみると、動かなかったですか。 試してもいないと見ましたが、ソースを読む勉強をしないと今後「C言語出来ます」とは言えませんから、頑張ってくださいね。

0000ai
質問者

お礼

はい、すみません。 私は教育学部の学生です。しかし学校の先生になるつもりは全くありません。強くプログラマーになろうという希望はありません。 将来プログラミングを専門にするという学科ではないので、学校のプログラミングの授業もこれでいいのかどうか不安に思っています。だから習ったこと以外のライブラリを使って良いものかどうか迷ってしまいます。tamanegiさんのプログラムはお恥ずかしながら読めませんでした。liar_adanさんの流れでプログラミングを組ませて貰っています。 (質問) const char * CardChecker(PCARDINFO ptrgCard) のconst char までは分かるのですが、その後ろはどういう意味なんですか。 int nLoop1, nLoop2, nCardCount, nPeir[5] この後のプログラムを見てもnLoop1などが何の役割をしているのか分かりません。 お暇があったら教えて下さい。

回答No.1

排他が面倒くさいので、フォーカードチェックだけ。 サンプルデータ付き(笑)。 -------------------------------------- #include <stdio.h> typedef struct tag_CardInfo { char nNum; char nMrk; } CARDINFO, *PCARDINFO; enum tag_CardMark { SPE = 0, HRT, DIA, CLB }; const char Yaku[10][30] = { "役なし", "ワンペア", "ツーペア", "スリーカード", "フルハウス", "フォーカード", "フラッシュ", "ストレート", "ストレートフラッシュ", "ロイヤルストレートフラッシュ" }; const char * CardChecker(PCARDINFO ptrgCard); int main(void) { CARDINFO card[5]; //適当にデータを放り込む card[0].nMrk = SPE; card[0].nNum = 1; card[1].nMrk = SPE; card[1].nNum = 6; card[2].nMrk = HRT; card[2].nNum = 6; card[3].nMrk = DIA; card[3].nNum = 6; card[4].nMrk = CLB; card[4].nNum = 6; printf("%s",CardChecker(card)); return 0; } const char * CardChecker(PCARDINFO ptrgCard) { int nLoop1, nLoop2, nCardCount, nPeir[5] ; //ワンペアチェック for ( nLoop1 = 0 ; nLoop1 <= 4 ; nLoop1++ ) { nCardCount = 1; for ( nLoop2 = (nLoop1 + 1) ; nLoop2 <= 4 ; nLoop2++ ) { if ( (ptrgCard + nLoop1)->nNum == (ptrgCard + nLoop2)->nNum ) nCardCount++; } nPeir[nLoop1] = nCardCount; } for ( nLoop1 = 0 ; nLoop1 <= 4 ; nLoop1++ ) { if ( nPeir[nLoop1] == 4 ) return &Yaku[5][0]; } return &Yaku[0][0]; }

関連するQ&A

  • 7ポーカーの確率

    ちょっと難問かもしれません。 5枚めくって勝負する5ポーカーを4人でしたとします。 すると役のでる確率は、 ワンペア・・・・・・・・・・・・  42.26% ツーペア・・・・・・・・・・・・  4.75% スリーカード・・・・・・・・・・  2.1% ストレート・・・・・・・・・・・  0.39% フラッシュ・・・・・・・・・・・  0.20% フルハウス・・・・・・・・・・・  0.14% フォーカード・・・・・・・・・・  0.024% ストレートフラッシュ・・・・・・ 0.0014% ロイヤルストレートフラッシュ・・ 0.00015%              となるらしいです。(ある本によると)   では、7枚めくって勝負する7ポーカーの場合、5人でしたとすると各確率はどのようになるのでしょうか?                            7ポーカーがどうしても勝てなくて。。。

  • ポーカーの役の強さ

    ポーカーの役の強さを教えてください。 もらえる金額は違いますがツーペア(フォーカード)とフルハウスが勝つ時があります。 役の強さを調べるとツーペア<フルハウス フォーカード>フルハウス と出てきます。 強い役でもカードの種類によって弱くなってしまうのですか。 また、それはどのような組み合わせの時ですか。

  • ポーカー

    ポーカーでファイブカードは ありますか? あればロイヤルストレートフラッシュより強いですか?

  • ポーカーでワンペア状態から最も勝率の高い役を作る

    2人で行うポーカーをします。 山札から1人に5枚ずつ配り、互いに3回ずつ捨てる→山札から取るの方法で役を完成させます。 役はノーペア<ワンペア<ツーペア<スリーペア<ストレート<フラッシュ<フルハウス<フォーカード<ストレートフラッシュ<ロイヤルストレートフラッシュの計10種。 同役の時は2<3<4<・・・Q<Aで評価。 ジョーカーはワイルドカードとして使用可能(最高役を作るように適用される)。 以上の条件で、例えば手札に、 「スペード2、スペード2、スペードJ、スペードQ、ハートK」 というワンペアが完成している場合、 出来るだけ数字を高くし、高い役を狙いつつも、役の完成率も考慮し、 1.Jを変える 2.Qを変える 3.Kを変える 4.J、Qを変える 5.Q、Kを変える 6.J、Kを変える 7.J、Q、Kを全て変える という戦法をとるとします。 以上を勝率の高い順に並べるとどのような順になるでしょうか。

  • ポーカーについて

    ポーカーのロイヤルストレートフラッシュってどれぐらいの確率で出ますか? どうしても知りたいです。

  • ポーカーで

    ポーカーのゲームで少し気になっている点があるので教えてください。 (1)スートというのは数字のことですか、それともマークのことですか? (2)フルハウスとフォーカードはどちらが強いんですか? (3)2人で対戦して、どちらも役無しの時、スペードのAを持っていても負けることってあるのですか? (3)について、なぜこのような質問をしたのかといえば、iアプリのゲームで負けになったことがあるからなんですが、以前の質問の回答からすれば負けるはずがないという先入観があるからです。 とすれば、(1),(2)は書いてあるよ、というご指摘を受けるかも知れませんね。

  • 最近、あるアンメで、ポーカーをしているシーンがありました。

    最近、あるアンメで、ポーカーをしているシーンがありました。 そこで、ロイヤルストレートフラッシュとかいうので、 勝負を決める姿が印象に残り、僕もやってみてえ~。 と思い、質問させていただきました。 できるだけ、わかりやすく教えていただければ幸いです(^_^) 暇なときに答えていただければOKですので^^

  • ポーカーハンドの最上位は?

    ポーカーのハンド(役)って Royal Straight Flush 同一スートで、10・J・Q・K・Aが揃っていること。 Five of a kind (Five cards) 同位札が4枚と、JOKERが揃っていること。 Straight Flush 同一スートで、連番になっていること。 Four of a kind(Four cards) 同位札4枚が揃っていること。残り1枚はなんでも良い。 Full House 同位札が3枚と、それとは別の同位札が2枚揃っていること。 Flush 数字に関係なく、同一スートであること。 Straight スートに関係なく、連番であること。 Three of the kind(Three cards) 同位札が3枚揃っていること。残り2枚はなんでも良い。 Two Pairs 同位札が2枚と、それとは別の同位札が2枚揃っていること。残り1枚はなんでも良い。 One Pair 同位札が2枚揃っていること。残り3枚は何でも良い。 No Pair(X High) 上記以外。X=手札内の最高カード の11種類ですよね。そのうちの「Royal Straight Flush」と「Five of a kind (Five cards)」ってどっちが最上位なんですか?本などを見ていると、ロイヤルが最上位だったり、ファイブが最上位だったりしてるんで。友達とポーカーをやるのにどっちが最上位かって議論になりました。ご存じの方がいらっしゃいましたら、回答お願いします。

  • トランプのポーカーのルールについて

    ポーカーのルールで 質問です。 ワンペアで 引き分けになったとき、 残りの カードに 強いカードが あるほうが 勝ちでいいですか? たとえば。 2.2.A.3.4.   と。 2.2.K.Q.J のばあい。  Aが あるから、2.2.A.3.4. が 勝ちでいいでしょうか?

  • フルハウスof 3's to 10のtoって?

    ポーカーのフルハウスの組み合わせを英語で言うと、 「3のスリーカードと10のペアのフルハウス」は、full house of 3's to 10 「Aが3枚と、6が2枚のフルハウス」は、full house of A's to 6. 何故「と」が「and」じゃなくて、「to」になっているのでしょうか? ちなみに、ツーペアの場合は、 「キングのペアと9のペアのツーペアで、クイーンのキッカー」は、two pairs K's and 9's with Q kicker. と、普通に「と」が「and」になっています。 何故でしょうか??? 教えてくださいよろしくお願いします。

専門家に質問してみよう