役を確認する

役を確認する

check は、役を確認する関数です。

手札を配列として、種類と数字毎の枚数を数えて、以下のどの系統の役か判別します。

  1. フラッシュ系
  2. ストレート系
  3. ペア系

/* 役を確認する */
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);/* ノーペア */
}