関数作成を効率化するには

役判定関数を作り、それが本当にうまく機能しているかどうか 調べるためにプログラムを実行するときに、カードの配付を乱数に 任せていてはかなり時間がかかる。そこで、こっそりと出来合いの手を 入力できる工夫を入れてしまうと良い。

プログラム起動時に -cheat オプションをつけた場合には、 initialize() 関数ではなく cheat 関数でカードの初期化を 行なうように変えてみる。main() 関数で以下のようにする。

  if (argc > 1 && 0 == strncmp(argv[1], "-cheat", 6)) {
    cheat(&deck);
  } else {
    initialize(&deck);
  }

そして、cheat() 関数を作り、トランプ5枚を入力して 決められるようにする。

cheat.c

void cheat (Cards *d)
{
  static char *suits[] = {
    "ハート", "スペード", "ダイヤ", "クラブ", "ジョーカー"
  };
  static char *numbers[] = {
    "JOKER", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10",
    "J", "Q", "K"
  };

  int s, n, i, x;
  char buf[10];
  printf("おぬしも悪よのう\nカードの通し番号を入れてね(5個):\n");
  for (i=0; i<5; i++) {
    printf("%d枚目: ", i+1);
    fgets(buf, sizeof buf, stdin);
    x = atoi(buf);
    s = x/13;                   /* 13で割ると切捨て */
    n = x%13 + 1;               /* 13で割った余り+1 */
    /* d->card がaCard構造体の配列メンバになる。
       d->cardは配列なのでd->card[x] でアクセスする。 */
    d->card[i].suit=suits[s];
    d->card[i].number = n;
    d->card[i].name = numbers[n];
  }
  d->n = 5;		/* 5枚って事で */
}

実行。

./cheat -cheat
おぬしも悪よのう
カードの通し番号を入れてね(5個):
1枚目: 3    (→ ハートの4)
2枚目: 3    (→ ハートの4)
3枚目: 4    (→ ハートの5)
4枚目: 5    (→ ハートの6)
5枚目: 6    (→ ハートの7)
あなたの手は
ハートの7
ハートの4
ハートの4
ハートの6
ハートの5
sum=4
ワンペアです

目次