#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.2ベストアンサー
- 回答日時:
例えばですが。
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の場合です。
ストレートフラッシュなどもその応用で。
No.5
- 回答日時:
> 全ての役を判断するには、下の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回コピペして条件変えたりするだけ、ですからね。
No.4
- 回答日時:
/* 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]);
}
}
}
全ての役を判断するには、下のif文に続けてelse ifをかいていいのでしょうか?それともまた別に書くべきでしょうか?またその判断の仕方を教えてください。
No.1
- 回答日時:
ああそうね、Pythonなんかだとgroupbyとか使ってガーッと処理出来る辺りだけどCだとちとメンドくさそうに見える。
これはね。発想を変えればいいの。
suitを無視すれば結局トランプって「13種類しか」ないわけよ。
だから13個要素がある配列(全要素の中身は0)を設計しておくの。
で、forで手のうちのカードを回してる間にその数値を見て、対応する要素番号に++(カウント)していけばいい。
二個になったらそれはペアだし、三個だったらスリーカード・・・とか分かるでしょ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 音声データを出力するCプログラミング 1 2021/11/23 20:25
- 英語 The modern history of credit cards goes back to th 3 2022/07/16 00:11
- JavaScript JavascriptでDOM-based XSSの発生源となるinnerHTMLを変更したい 2 2023/08/29 22:11
- TOEFL・TOEIC・英語検定 日本語に翻訳おねがいします! 1 2021/12/03 10:21
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 関数へのポインタ 3 2022/02/04 17:20
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
ウインドウの移動禁止
-
静的でないメンバ関数の呼び出...
-
bccでエラー:メンバー関数は呼...
-
C++にてtemplateで受け取った任...
-
クラス間でのクラスの共有?
-
(void)0 はどんな意味ですか
-
構造体を宣言と共に初期化する方法
-
関数ポインタについて
-
const_castのつかいどころを教...
-
【gcc・cygwin】multiple defin...
-
コンパイルエラー: LNK2001
-
pictureboxの画像を削除するには?
-
typedef unsigned int UINT;が...
-
C#を勉強中でC#で壁紙を変更す...
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
ifstreamについて
-
戻り値を返す関数の前に(void)...
-
C# KeyDownイベントでショート...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
ArduinoでMouse関数を使用して...
-
(void)0 はどんな意味ですか
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報
すみません、このコードを見る限り関数が用意されているので自分で書けっていうことですね。
では、その判断方法を教えてほしいです