,---, ,---, 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]);
}