役判定関数を作り、それが本当にうまく機能しているかどうか 調べるためにプログラムを実行するときに、カードの配付を乱数に 任せていてはかなり時間がかかる。そこで、こっそりと出来合いの手を 入力できる工夫を入れてしまうと良い。
プログラム起動時に -cheat オプションをつけた場合には、
initialize()
関数ではなく cheat 関数でカードの初期化を
行なうように変えてみる。main()
関数で以下のようにする。
if (argc > 1 && 0 == strncmp(argv[1], "-cheat", 6)) {
cheat(&deck);
} else {
initialize(&deck);
}
そして、cheat()
関数を作り、トランプ5枚を入力して
決められるようにする。
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
ワンペアです