役を確認する

役を確認する

check は、役を確認するサブルーチンです。

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

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

#役を確認する
sub check {
  local($i, $j, $s, $n, $flag_f, $flag_s, $flag_3, $npair, @suits, @numbers);

  for (0 .. 4) {
    #0 から 51 までの番号をカードに換算する
    ($s, $n) = &calc($player[$_]);

    #換算したカードの種類と数字の枚数を追加する
    $suits[$s]++;
    $numbers[$n]++;
  }

  #フラッシュ系
  for (0 .. 3) {
    if ($suits[$_] == 5) {
      $flag_f = 1;
      last;
    }
  }

  #ストレート系
  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;
        last;
      }
    }

    if ($flag_s == 1) {
      if     (($i == 9) && ($flag_f == 1)) {
        return(9);#ロイヤル・ストレート・フラッシュ
      } elsif ($flag_f == 1) {
        return(8);#ストレート・フラッシュ
      } else {
        return(4);#ストレート
      }
      last;
    }
  }

  return(5) if ($flag_f == 1);#フラッシュ

  #ペア系
  for (0 .. 12) {
    if      ($numbers[$_] == 4) {
      return(7);#フォーカード
    } elsif ($numbers[$_] == 3) {
      $flag_3 = 1;
    } elsif ($numbers[$_] == 2) {
      $npair++;
    }
  }
  if ($flag_3) {
    if ($npair == 1) {
      return(6);#フルハウス
    } else {
      return(3);#スリーカード
    }
  } else {
    if      ($npair == 2) {
      return(2);#ツーペア
    } elsif ($npair == 1) {
      return(1);#ワンペア
    }
  }
  return(0);#ノーペア
}