ヒント

  ,---, ,---,         A
 (     V     )       A A
  (         )       A   A
   (       )       AAAAAAA
     (   )        A       A
       V        _A_       _A_

という表示にするには、ハートマークや、エースの巨大文字を1行毎に 保存した文字列の配列を用意して、それをカード1枚の構造体のメンバに 入れておくと良い。

文字のデザイン

最初に、大きさを決めて各文字をデザインする。

マークも、数字も同じ大きさでデザインしよう。ASCII文字の大きさで数えて 14桁×6行にしよう。まず、マークをデザインする。

char *heart[] = {
  "  ,---, ,---, ",
  " (     V     )",
  "  (         ) ",
  "   (       )  ",
  "     (   )    ",
  "       V      "};
char *spade[] = {
  "      .^.     ",
  "    (     )   ",
  "  (         ) ",
  " (__,-  - ,__)",
  "      /\\      ",
  "     //\\\\     "};

バックスラッシュ(\)は、\\と2つ続けて入力する必要がある。

同様に、char *dia[] と char *club[] と char *joker[] もデザインする。 heart[] は、要素が0〜5の配列となる。1行ずつ

for (i=0; i<6; i++) {
  printf("%s\n", heart[i]);
}

のように出力すれば、ハートの絵柄があらわれる。したがって、これらを 要素に持つ配列を作り、

static char **suits[] = {heart, spade, dia, club, joker};

と宣言しておいて、あとで利用する。

数字の方についても同様に設計する。

char *ace[] = {
  "       A      ",
  "      A A     ",
  "     A   A    ",
  "    AAAAAAA   ",
  "   A       A  ",
  " _A_       _A_"};

のように char *two[], *three[], ...., *king[], *joker[] までデザインする。 これらをまとめた配列を

char **numbers[] = {
  ace, two, three, four, five, six, seven, eight, nine, ten,
  jack, queen, king, joker
};

と宣言する。

構造体とカードの初期化を以下のように変更する。

typedef struct card {
  char **suit;
  int  number;
  char **name;
} Card;
void initialize(Card c[])
{
  int s, n, i;
  for (i=0; i<CARDS-1; i++) {
    s = i/13;          /* 13で割ると切捨て */
    n = i%13;          /* 13で割った余り */
    c[i].suit=suits[s];
    c[i].number = n;
    c[i].name = numbers[n];
  }
  c[i].suit = suits[4];
  c[i].number = 0;              /* ジョーカーのnumberは0にしておく */
  c[i].name = numbers[13];
}

これを出力する部分は以下のようにすると良い(iを 配列要素番号とする)。

  for (j=0; j<ROWS; j++) {
    printf("%s%s\n", deck[i].suit[j], deck[i].name[j]);
  }

目次