dポイントプレゼントキャンペーン実施中!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define CARDS 52
#define FACES 13
#define HANDS 5

// card structure definition
struct card {
const char *face; // define pointer face
const char *suit; // define pointer suit
int face_num;
int suit_num;

}; // end struct card

typedef struct card Card; // new type name for struct card

// prototypes
void fillDeck( Card * const wDeck, const char * wFace[],
const char * wSuit[] );
void shuffle( Card * const wDeck );
void deal( const Card * const wDeck ,Card * const hand);

void onePair( const Card * const hand , const char * wFace[]); //對子
void twoPair( const Card * const hand , const char * wFace[]); //雙對子
void threeOfKind( const Card * const hand ); //三條
void fourOfKind( const Card * const hand ); //四梅
void straightHand( const Card * const hand ); //順子
void flushHand( const Card * const hand );//同花

int main( void )
{
Card deck[ CARDS ]; // define array of Cards
Card hand[ HANDS ];

// initialize array of pointers
const char *face[] = { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};

// initialize array of pointers
const char *suit[] = { "Hearts", "Diamonds", "Clubs", "Spades"};

srand( time( NULL ) ); // randomize

fillDeck( deck, face, suit ); // load the deck with Cards
shuffle( deck ); // put Cards in random order
deal( deck,hand ); // deal all 52 Cards
onePair(hand,face);
} // end main

// place strings into Card structures
void fillDeck( Card * const wDeck, const char * wFace[],
const char * wSuit[] )
{
size_t i; // counter

// loop through wDeck
for ( i = 0; i < CARDS; ++i ) {
wDeck[ i ].face = wFace[ i % FACES ];
wDeck[ i ].suit = wSuit[ i / FACES ];
wDeck[ i ].face_num = i % FACES;
wDeck[ i ].suit_num = i / FACES;

} // end for
} // end function fillDeck

// shuffle cards
void shuffle( Card * const wDeck )
{
size_t i; // counter
size_t j; // variable to hold random value between 0 - 51
Card temp; // define temporary structure for swapping Cards

// loop through wDeck randomly swapping Cards
for ( i = 0; i < CARDS; ++i ) {
j = rand() % CARDS;
temp = wDeck[ i ];
wDeck[ i ] = wDeck[ j ];
wDeck[ j ] = temp;
} // end for
} // end function shuffle

// deal cards
void deal( const Card * const wDeck , Card * const hand )
{
size_t i; // counter

// loop through wDeck
for ( i = 0; i < HANDS; ++i ) {
printf( "%5s of %-8s%s", wDeck[ i ].face, wDeck[ i ].suit,
( i + 1 ) % 5 ? " " : "\n" );
hand[i]=wDeck[i];
} // end for
} // end function deal

// determines if there are any pairs in the hand
void onePair( const Card * const hand, const char * wFace[] )
{
// counter that records how many cards of each rank are in the hand
unsigned int counter[ FACES ] = { 0 };

size_t r, p; // loop counters

// record how many cards of each rank are in the hand
for ( r = 0; r < HANDS ; ++r ){
++counter[ hand[r].face_num ];
}

// print result if there is a pair
for ( p = 0; p < FACES; ++p )
if ( )////ここの部分です。❗️❗️❗️
printf( "The hand contains a pair of %ss.\n", wFace[ p ] );
}

質問者からの補足コメント

  • つらい・・・

    すみません、このコードを見る限り関数が用意されているので自分で書けっていうことですね。
    では、その判断方法を教えてほしいです

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/03/07 00:26

A 回答 (5件)

例えばですが。


SPADE = 1;
HEART = 2;
DIA = 3;
CLUB = 4;
SUM=0;
などとし、
a[5][14]にHANDを入れます。
a[0][0]には、合計を入れます。
a[0][x]には数字xの合計を入れます。
a[y][0]には絵柄yの合計を入れます。
あるa[0][x]が2ならワンペア、3ならスリーカード、4ならフォーカードです。
あるa[0][x]が2で、別のa[0][x]が3ならフルハウス。
あるa[y][0]が5なら、フラッシュです。
ストレートは少し面倒です。
あるa[0][x]が1でそこから連続した[x+1][x+2][x+3][x+4]が1の場合です。
ストレートフラッシュなどもその応用で。
    • good
    • 0

> 全ての役を判断するには、下のif文に続けてelse ifをかいていいのでしょうか?それともまた別に書くべきでしょうか?またその判断の仕方を教えてください。



これ、貴方が自作してるプログラムじゃないでしょ?
いや、自作しないのが悪い、って言ってるわけじゃあなくって(多分中国人が書いたプログラムなのか?)。
判断の仕方、と言うかこのプログラムを見る限り、最初に関数のプロトタイプ宣言が行われてますよね?
ここです。

void onePair( const Card * const hand , const char * wFace[]); //對子
void twoPair( const Card * const hand , const char * wFace[]); //雙對子
void threeOfKind( const Card * const hand ); //三條
void fourOfKind( const Card * const hand ); //四梅
void straightHand( const Card * const hand ); //順子
void flushHand( const Card * const hand );//同花

これを見ると、結局6つ関数を書け、って言ってるんですよ。
で、貴方が投げた問題はこの内の1番目、onePairの本体を書け、って事になる。
要するに残りの5つは自分で自作せなアカン、って事です。

だから、

> それともまた別に書くべきでしょうか?

別に書け、って事なんですよ。プロトタイプ宣言で宣言された関数を書け、っちゅう事です。

ただし、twoPair〜fourOfKindの中身は殆どOnePairと変わんないでしょ。やるこたぁ殆ど一緒で。twoPair以外はチェックすべき数値が3なのか、4なのか、って程度の違いしかない。
twoPairだって2になってるのが2つあるのかどうか、って配列から調べるだけ。
onePairのコードをコピペして改造すれば済む話です。
フラッシュ(flushHand)もonePairのコードをコピペして改造していく。
#2氏も示唆してんだけど、この場合、用意する配列が数字に対応してんじゃなくってsuit(ジョーカーを含んだトランプのマーク)に対応するようにする事。結果、

unsigned int counter[HANDS] = {0};

に改造して、配列counterのどれかが5つカウントされるかどうか調べるだけ。やってるこたぁonePairと事実上全く同じなわけです。

で、#2氏も言ってるけど、ストレート(straightHand)はちとメンドイ。
ただ、基本的に、数字を格納する配列(counter)の連続した領域が1で塗りつぶされてるかどうかチェックするだけ、です。

そんなにムズいプログラムでもないですよ。
基本onePair関数を5回コピペして条件変えたりするだけ、ですからね。
    • good
    • 0
この回答へのお礼

すでに解決しています^_^

お礼日時:2022/03/10 08:55

/* determines if there are any pairs in the hand */


void onePair(const Card* const hand, const char* wFace[]) {
 /* #1で書いてるように、ここで13要素がある配列を定義してる。
  初期値として配列要素は全部0にしてる。 */
 unsigned int counter[FACES] = {0};

 /* record how many cards of each rank are in the hand */
 /* ここも #1 で書いてるように、手のカードを一枚づつ調べて、
  対応するcounter配列の要素に++してる */
 for (size_t r = 0; r < HANDS; r++) {
  ++counter[hand[r].face_num];
 }

 /* print result if there is a pair */
 for (size_t p = 0; p < FACES; p++) {
  /* 結果、配列counterの要素が2になってるカードはペアが成立してる。 */
  if (counter[p] == 2) {
   printf("The hand contains a pair of %ss.\n", wFace[p]);
  }
 }
}
この回答への補足あり
    • good
    • 0
この回答へのお礼

全ての役を判断するには、下のif文に続けてelse ifをかいていいのでしょうか?それともまた別に書くべきでしょうか?またその判断の仕方を教えてください。

お礼日時:2022/03/07 00:18

カードの種類が何かわからないと

    • good
    • 0

ああそうね、Pythonなんかだとgroupbyとか使ってガーッと処理出来る辺りだけどCだとちとメンドくさそうに見える。



これはね。発想を変えればいいの。
suitを無視すれば結局トランプって「13種類しか」ないわけよ。
だから13個要素がある配列(全要素の中身は0)を設計しておくの。
で、forで手のうちのカードを回してる間にその数値を見て、対応する要素番号に++(カウント)していけばいい。
二個になったらそれはペアだし、三個だったらスリーカード・・・とか分かるでしょ?
    • good
    • 0

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