合計点数を計算する

calc は、手札の合計点数を計算する関数です。

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

/* 合計点数を計算する */
int calc(int nHands, char Hands[NMAX][CMAX]) {
  int  n;
  int  point;        /* 合計点数 */
  int  na;           /* A の枚数 */
  int  numbers[NMAX];/* カードの数字 */
  char tmp[3];

  /* 数字を取出す */
  for (n = 0; n < nHands; n++) {
    int i;

    /* 「アルファベットと数字」の数字部分を取出す */
    for (i = 0; i < 3; i++) tmp[i] = Hands[n][i + 1];
    numbers[n] = atoi(tmp);
  }

  point = na = 0;
  for (n = 0; n < nHands; n++) {
    if (numbers[n] <= 10) {
      point += numbers[n];

      if (numbers[n] == 1) na++;/* A の枚数を数える */
    } else {/* 絵札は 10 点 */
      point += 10;
    }
  }

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

  return(point);
}