役を確認する
check は、役を確認する関数です。
手札を配列として、種類と数字毎の枚数を数えて、以下のどの系統の役か判別します。
- フラッシュ系
- ストレート系
- ペア系
/* 役を確認する */
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);/* ノーペア */
}







