プロが教える店舗&オフィスのセキュリティ対策術

C++でポーカーの手を判断するプログラムを作ろうと思っています。ワンペアーを判断するプログラムすら分からないのですが、教えて下さい。
できることなら他の手(ツーペアー、スリーカード、フォーカード、フラッシュ、ストレート、フルハウス、ストレートフラッシュ、ロイヤルストレートフラッシュ)も教えて下さい。m(_ _)m

*ワンペアー ・・・ 同じ数字のカードが2枚
 ツーペアー ・・・ ワンペアーが2組
 スリーペアー・・・ 同じ数字のカードが3枚
 フォーペアー・・・ 同じ数字のカードが4枚
 フラッシュ ・・・ 5枚とも同じマーク
 ストレート ・・・ 5枚とも同じ数字
 フルハウス ・・・ ワンペアかつスリーカード
 ストレートフラッシュ・ストレートかつフラッシュ
 ロイヤルストレートフラッシュ・ストレートフラッシュで5枚のカードが10,J,Q,K,A

A 回答 (4件)

いろいろやり方はあると思いますが、



やる前にまずソートするのがいいでしょう。
たとえば「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枚の数字が順に並んでいる」だと思います。

この回答への補足

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

補足日時:2003/08/05 20:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/08/05 21:05

フラッシュは省略するとして、


判定するのに、どういう中間データを作成すると簡単になるのかという事が全てなのですが、私からも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かどうかで判定できます。
    • good
    • 0

#1です。



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

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

int nLoop1, nLoop2, nCardCount, nPeir[5]
この後のプログラムを見てもnLoop1などが何の役割をしているのか分かりません。

お暇があったら教えて下さい。

お礼日時:2003/08/06 23:38

排他が面倒くさいので、フォーカードチェックだけ。


サンプルデータ付き(笑)。

--------------------------------------


#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];
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!