ドロー・ポーカーの C 言語プログラム
以下は、C 言語によるドロー・ポーカーのプログラムの一例です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 関数プロトタイプ宣言 */
void shuffle(int stack[]);
void calc(int index, int *s, int *n);
void display(int player[5]);
void change(int player[5], int stack[52], int next);
int check(int player[5]);
/* カードを混ぜる */
void shuffle(int stack[]) {
int i, imax;
int index; /* カード番号 */
int flag[52];/* フラグ(0:未使用 1: 使用済) */
/* time 関数により擬似乱数を初期化する */
srand((unsigned)time(NULL));
imax = 52;/* 1 組 52 枚のカード */
/* フラグを初期化する */
for (i = 0; i < imax; i++) flag[i] = 0;
/* カードを混ぜる */
for (i = 0; i < imax; i++) {
/* 未使用カードを探す */
do {
index = (int)((float)imax * rand() / (RAND_MAX + 1.0));
} while (flag[index] != 0);
/* カードを設定する */
stack[i] = index;
/* フラグを使用済にする */
flag[index] = 1;
}
};
/* 0 から 51 までの番号をカードに換算する */
void calc(int index, int *s, int *n) {
*s = (int)(index / 13);
*n = index % 13;
}
/* カードを画面に表示する */
void display(int player[5]) {
int i;
int s, n; /* カードの種類と数 */
char *suits[] = {/* カードの種類 */
"spade",
"heart",
"diamond",
"club"
};
for (i = 0; i < 5; i++) {
/* 0 から 51 までの番号をカードに換算する */
calc(player[i], &s, &n);
/* カードを画面に表示する */
printf("%s-%d ", suits[s], n + 1);
}
printf("\n");
}
/* カードを交換する */
void change(int player[5], int stack[52], int next) {
int i;
int flag[5];/* カードの交換フラグ */
/* フラグを初期化する */
for (i = 0; i < 5; i++) flag[i] = 0;
/* 交換するカードを決定する */
while (1) {
printf("Please select the card(s) you want to change (1 - 5). ");
printf("To finish, input 0.\n");
scanf("%d", &i);
if ((1 <= i) && (i <= 5)) flag[i - 1] = 1;
else if (i == 0) break;
else printf("Input Error!\n");
}
/* カードを交換する */
for (i = 0; i < 5; i++) if (flag[i] == 1) player[i] = stack[next + i];;
}
/* 役を確認する */
int check(int player[5]) {
int i, j, s, n;
int flag_f; /* フラッシュの確認フラグ */
int flag_s; /* ストレートの確認フラグ */
int flag_3; /* スリーカードの確認フラグ */
int npair; /* ペアの数 */
int suits[4]; /* 種類毎の枚数 */
int numbers[13];/* 数字毎の枚数 */
/* 配列を初期化する */
for (i = 0; i < 5; i++) suits [i] = 0;
for (i = 0; i < 13; i++) numbers[i] = 0;
for (i = 0; i < 5; i++) {
/* 0 から 51 までの番号をカードに換算する */
calc(player[i], &s, &n);
/* 換算したカードの種類と数字の枚数を追加する */
suits[s]++;
numbers[n]++;
}
/* フラッシュ系 */
flag_f = 0;
for (i = 0; i < 4; i++) {
if (suits[i] == 5) {
flag_f = 1;
break;
}
}
/* ストレート系 */
for (i = 0; i < 10; i++) {/* ストレートの低位の数字は 1 から 10 まで */
flag_s = 1;
for (j = 0; j < 5; j++) {
if (numbers[(i + j) % 13] != 1) {/* 13 は 1 と連なる */
flag_s = 0;
break;
}
}
if (flag_s == 1) {
if ((i == 9) && (flag_f == 1)) {
return(9);/* ロイヤル・ストレート・フラッシュ */
} else if (flag_f == 1) {
return(8);/* ストレート・フラッシュ */
} else {
return(4);/* ストレート */
}
break;
}
}
if (flag_f == 1) return(5);/* フラッシュ */
/* ペア系 */
flag_3 = 0;
npair = 0;
for (i = 0; i < 13; i++) {
if (numbers[i] == 4) return(7);/* フォーカード */
else if (numbers[i] == 3) flag_3 = 1;
else if (numbers[i] == 2) npair++;
}
if (flag_3 == 1) {
if (npair == 1) return(6);/* フルハウス */
else return(3);/* スリーカード */
} else {
if (npair == 2) return(2);/* ツーペア */
else if (npair == 1) return(1);/* ワンペア */
}
return(0);/* ノーペア */
}
main () {
int next; /* 次に配るカード */
int stack[52]; /* 1 組 52 枚のカード */
int player[5]; /* 配られる 5 枚のカード */
char *hands[] = {/* 役の名称 */
"No Pair",
"One Pair",
"Two Pair",
"Three of a Kind",
"Straight",
"Flush",
"Full House",
"Four of a Kind",
"Straight Flush",
"Royal Straight Flush"
};
/* カードを混ぜる */
shuffle(stack);
/* カードを配る */
for (next = 0; next < 5; next++) player[next] = stack[next];
/* カードを画面に表示する */
display(player);
/* カードを交換する */
change(player, stack, next);
/* カードを画面に表示する */
display(player);
/* 役を確認する */
printf("%s\n", hands[check(player)]);
}
各関数について、以下に説明します。







