合計点数を計算する

calc は、手札の合計点数を計算するサブルーチンです。

  • 絵札 (J, Q, K) は 10 点
  • A は 1 点としても 11 点としてもよい
  • カードの印(スペード/ハート/ダイヤモンド/クラブ)は考慮しない
  • 合計点数が 21 点を超えると 0 点

#合計点数を計算する
sub calc(@) {
  my (@hands) = @_;
  my ($point);  #合計点数
  my ($na);     #A の枚数
  my (@numbers);#カードの数字

  #数字を取出す
  foreach (@hands) {
    #「アルファベットと数字」の数字を取出す
    /^([SHDC])(\d{1,2})$/;#選択 S|H|D|C は遅い
    push(@numbers, $2);
  }

  $point = $na = 0;
  foreach (@numbers) {
    if ($_ <= 10) {
      $point += $_;

      $na++ if ($_ == 1);#A の枚数を数える
    } else {#絵札は 10 点
      $point += 10;
    }
  }

  if      ($point <= 11) {#A は 1 点としても 11 点としてもよい
    $point += 10 if ($na);
  } elsif ($point >= 22) {#合計点数が 21 点を超えていたら 0 点にする
    $point = 0;
  }
  return($point);
}