/* 一人で遊ぶポーカーのプログラム(ジョーカー入り・バナー風・滑り込み表示) ジョーカーを一枚使う。最初にコインを何枚か賭ける。五枚のカードが手札と して配られ、そのうちの零枚から五枚を選んで、一度だけ交換すると、交換後 の手札の役に応じた枚数のコインがもらえる。これのくり返し。 トランプカードは、0 から 51 の数で表す。0 から 12 がスペードの A から K を、13 から 25 がハートの A から K を、26 から 38 がクラブの A から K を、39 から 51 がダイヤモンドの A から K を意味する。(こう決めると、数 を 13 で割った商がスートを、余りがランクを表すことになる。これは、昔 ながらの決まったやり方の一つらしい。) 内部では、ジョーカーは 52 で表している。また、ジョーカーはその時点での 手札に含まれないどんなカードの代わりにもなる、というルールを採用した。 役の判定に当っては、ジョーカーを 52 枚のカードすべてで順に置き換えて、 できた役のうち最高の役になったものを役としている。だから、ジョーカー を手札に含まれているカードで置き換えてできる役も含めている。(これでも 同じ結果になるはずである。) ここまでで習ったことだけを使って書いてある。C言語の全貌を学べばもっと うまく書ける部分を含んでいる。 poker.c からの、その他の改変箇所は以下の通り。 最初にカードが配られたときにも役を表示するようにした。 乱数の種に、現在時刻だけでなく持っているコインの枚数も関係するように した。(前のままでは、二人で同時に動かして一人が全カードを交換し、それ を見てもう一人が交換するカードを選ぶという裏技ができたので。) 当ったコインの枚数が、行頭でない位置に表示されるようにした。次に行頭 から出力される、持っているコインの枚数と間違える場合があったため。 交換するカードを入力し、Enter を押した時点で、再度、乱数が初期化される ようにした。そのほうが、自分で運を切りひらいた感じが強まると思うので。 コイン枚数がオーバーフローして負になった場合も破産メッセージが出るよう にした。 poker2.c からの改変箇所は、カードの表示である。バナーのように大きな 文字で表示されるようにした。また、画面制御エスケープシーケンスを 用いて、カードは常に画面の一定の位置に、色を使って、表示されるように した。メッセージはカードの上と下に分かれて出るが、これは、昔の 98 の 25×80 の画面でもプレイできるようにするための苦肉の策である。(その ときは、下の定数 WIDTH を 16 に変更する必要がある。) また、それに伴って、いくつかの小さな変更を加えた。 バナーの字体は急いで作ったので、気に入らなければ修正していただきたい。 poker3.c からの改変は、カードが上から滑り込んでくるように表示されるよう にしたことである。ただし、そのため、破産したときに一番上の行の一部が 消えるというバグが発生するようになった。滑り込むスピードは、WAIT の値を 変えれば変えられる。(小さいほど速く、大きいほど遅くなる。) poker4.c からの改変は、関数 printhands() と printrank(), printsuit() と の間での役割分担を自然なものに変えたことである。上述のバグは解消した。 poker4b.c からの改変は、ジョーカー用に絵を3枚用意したこと。それらは ランダムに現れる。(ジョーカーの登場確率は 1/53 で変わらない。) 絵は、いずれも、顔を白く、唇を赤く、鼻の先をマゼンタに塗り、派手な服を 着て、帽子をかぶった人物を描いた(つもりである)が、端末によっては、 作者の意図とは違う色で表示されるかもしれない。 それと、前は乱数の種は現在時刻にコインの枚数を加えたものとしていたが、 コインを一枚ずつ賭けては失い、一秒に一度ずつ動かしていると、同じ種が 続くようなので、コインの枚数を引くようにした。 poker4c.c からの改変は、「八回続けて役がないと、次からは毎回、配られた 手札にジョーカーがはいる」という裏技を導入したことである。ただし、手札 が配られたあと、0 を入力して「交換せず」を選ぶと、回数は 0 に戻って しまう。手札にジョーカーがはいればワンペアは保証される。あとは毎回 コインを全部賭け、いかに速く桁あふれで破産するかを竸ってみてほしい。 (ジョーカーを交換し、役なしになってしまうと、この特典は終了する。) */ #include #include /* rand() */ #include /* time() */ #define YES 1 #define NO 0 #define EMPTY (-1) /* カッコでくくるのは、もしも a = 1 + EMPTY * b などの式 */ /* を書いてもエラーにならないため。念のため。 */ #define JOKER 52 #define COINS 100 /* 最初に持っているコインの枚数。変えてよい */ #define WIDTH 20 /* カードの横幅。画面の横幅が 80 のときは 16 に変更せよ */ #define WAIT 2000000 /* 空ループを回る回数。これで表示スピードを調整する */ int card[53]; /* ジョーカーを使うので 53 枚 */ int hand[6]; /* 手札。hand[0] は使わない */ int a[6]; /* hand[i] を新たにひくなら a[i] には YES を、そうでなければ */ /* NO を入れる。a[0] は使わない */ int change; /* 手札の交換時に 0 以外が入力されたかどうか */ int times; /* 役なしの続いた回数 */ int bonus; /* ボーナス(毎回ジョーカーが手札にはいる)がありかどうか */ void initrand(int coins); void initcard(void); void draw(void); void printhands(void); int analyse0(void); int analyse(void); void clearscreen(void); void clear2end(void); void gotoxy(int x, int y); void gotoxy2(int x, int y); void printresult(int get); void printrank(int rank, int x, int y); void printsuit(int suit, int x, int y); main() { int i, x, y; int coins, bet, get; clearscreen(); /* 画面のクリア */ times = 0; /* 役なしの続いた回数は 0 に */ bonus = NO; /* ボーナスはなしに */ for (coins = COINS; coins > 0; ) { if (times >= 8) { /* 役なしが 8 回以上続いていたら */ bonus = YES; /* ボーナスをありに変え */ times = 0; /* 役なしの回数カウンターは 0 に戻す */ } for (bet = -1; bet < 0; ) { gotoxy(1, 1); printf("%d 枚のコインを持っています. ", coins); printf("何枚賭けますか? (0 を入力すれば終了)>"); clear2end(); scanf("%d", &bet); if (bet < 0) { gotoxy(25, 1); printf("負の枚数は賭けられません."); clear2end(); } if (bet > coins) { gotoxy(25, 1); printf("そんなに持っていませんよ."); clear2end(); bet = -1; /* これでやり直すことになる */ } } if (bet == 0) { coins = 0; /* これでプログラムの終了へ */ gotoxy(25,1); printf("\n"); } else { clearscreen(); /* 画面のクリア */ initrand(coins); /* 乱数の初期化 */ initcard(); /* カードの初期化 */ for (i = 1; i <= 5; i++) { /* 最初は五枚ひくので全部 YES */ a[i] = YES; } draw(); /* カードをひく */ /* 次の五行はデバッグの跡。復活させればインチキも可能! */ /* hand[1] = 0; hand[2] = 13; hand[3] = 26; hand[4] = 39; hand[5] = JOKER; */ printhands(); /* 手札を画面表示 */ gotoxy(25, 1); printresult(analyse0()); /* 役を画面表示 */ clear2end(); /* 行末まで削除 */ gotoxy(1, 1); printf("どれを交換しますか? "); printf("(1, 2, 5 枚目なら 125、一枚も変えないなら 0 と入力)>"); clear2end(); scanf("%d", &x); if (x == 0) { change = NO; /* 0 が入力され、交換がなかったの意味 */ } else { change = YES; /* 0 以外が入力されたの意味 */ } initrand(coins); /* ここで再度、乱数を初期化 */ /* ユーザが x に入力した値を分析し、i 枚目を交換するなら a[i] に */ /* YES が、交換しないなら NO がはいるようにする。次とその次の */ /* ループでそうなるんだけど、どうしてかは自分で考えて。 */ for (i = 1; i <= 5; i++) { a[i] = NO; } for ( ; x != 0; x = x / 10) { y = x % 10; if (y >= 1 && y <= 5) { a[y] = YES; } } draw(); /* カードを交換する(実際はひく)*/ printhands(); /* 手札を画面表示 */ get = analyse0(); /* 手札を分析。倍率が返ってくる */ gotoxy(25, 1); printresult(get); /* 結果を出力 */ if (change == YES && get == 0) { /* 交換ありで役なしの場合 */ times++; /* 役なしの回数を 1 だけ増やす */ } else { times = 0; /* 役なしの回数を 0 に戻す */ } if (bonus == YES && get == 0) { /* ボーナスありで役なしの場合 */ bonus = NO; /* ボーナスはなしに戻る */ } if (get > 0) { printf("%d 枚のコインが当たりました. ", get * bet); } else { printf("残念でした. "); } clear2end(); coins = coins + (get - 1) * bet; if (coins <= 0) { printf("あなたは破産しました....\n"); } } } } /* 乱数を初期化する。(この関数はわからなくてもよい。)*/ void initrand(int coins) { unsigned seed = (unsigned)time(NULL); /* 現在時刻を取得して */ seed = seed - coins; /* それからコインの枚数を引く */ /* printf("乱数の種は %u です.\n", seed); */ srand(seed); /* それを乱数の種に */ } /* card[ ](カード)を初期化する */ void initcard(void) { int i; for (i = 0; i <= 52; i++) { /* YES はまだそのカードが引かれていない */ card[i] = YES; /* ことを示す印 */ } } /* カードをひく。a[i](i は 1 から 5)が YES であるような i に対し、hand[i] */ /* を選ぶ。カードはスペードの A からダイヤモンドの K まで順番に並んでおり、 */ /* そのあとにジョーカーが置かれている。乱数を使ってその中から一枚を選ぶ。 */ /* すでにひかれたカードを再度選ぶことを防ぐため、ひいたカードに対する */ /* card[n] は YES から NO に変える。NO のカードを選んでしまったら、再度 */ /* ひく。このゲームでは最大で 10 枚のカードしか使わないので、このやり方で */ /* まず大丈夫であろう。 */ /* 後半に、ボーナスありでジョーカーが出ていない場合の処理を追加した。この */ /* 変更法が最適であるとは思われないが、変更箇所を少なくするため、こうした。 */ void draw(void) { int i, n; for (i = 1; i <= 5; i++) { if (a[i] == YES) { for (hand[i] = EMPTY; hand[i] == EMPTY; ) { n = rand() % 53; /* これが選ばれたカード。 */ if (card[n] == YES) { /* 「残っている」だったら */ hand[i] = n; /* そのカードを hand[i] に代入、*/ card[n] = NO; /* 「残っていない」に変える */ } } } } /* 以下、ボーナスありでジョーカーが出ていない場合の、追加の処理。 */ /* プレーヤーがジョーカーを交換しようとしてここにきた場合も、if の */ /* 小カッコの中の条件は偽であるから、問題はないことに注意。 */ if (bonus == YES && card[52] == YES) { i = rand() % 5 + 1; /* 何枚目をジョーカーに変えるか */ card[hand[i]] = YES; /* そこにあった札は「残っている」に戻す */ hand[i] = 52; /* i 枚目はジョーカーに */ card[52] = NO; /* ジョーカーは「残っていない」にする */ } } /* 手札の出力。printrank(), printsuit() を呼んで、ランクとスートをバナー風 */ /* に、上から滑り込むように出力する。hand[i] の値は i 番目のカードを意味 */ /* する。値とカードの関係は冒頭のコメントを参照。JOKER の場合、ランクと */ /* スートはランダムに -4 から -1 の値をとり、それによって図柄が変わる。 */ void printhands(void) { int i, j, n, r, rank, suit; for (i = 1; i <= 5; i++) { if (a[i] == YES) { r = rand() % 4; if (hand[i] == JOKER) { suit = r - 4; } else { suit = hand[i] / 13; /* これがカードのスート(マーク) */ } if (suit == 0) { printf("\033[32m"); /* スペードは緑 */ } else if (suit == 1) { printf("\033[31m"); /* ハートは赤 */ } else if (suit == 2) { printf("\033[36m"); /* クラブはシアン */ } else if (suit == 3) { printf("\033[35m"); /* ダイヤはマゼンタ */ } if (hand[i] == JOKER) { rank = r - 4; } else { rank = hand[i] % 13; /* これがカードのランク(数)を示す */ } for (n = -22; n <= 0; n++) { gotoxy2(1+n, WIDTH*(i-1)+1); printf(" "); /* 一つ前のを消す */ printrank(rank, 2+n, WIDTH*(i-1)+1); /* ランクの表示 */ printsuit(suit, 13+n, WIDTH*(i-1)+1); /* スートの表示 */ for (j = 0; j < WAIT; j++) { /* しばらく待つ */ ; } } printf("\033[m"); /* 普通の色に戻す */ } } } /* 手札を解析し、倍率を返す。具体的には、ジョーカーがあれば、それを 52 枚の */ /* 普通のカードで順に置き換えつつ analyse() を呼んで、返ってきた倍率のうちで */ /* 最高のものを返す。ジョーカーがなければ、analyse() を呼んで、その返して */ /* きた値(倍率)を返すだけ。 */ int analyse0(void) { int i, j, x, get, joker; joker = NO; for (i = 1; i <= 5; i++) { if (hand[i] == JOKER) { joker = YES; get = 0; for (j = 0; j < 52; j++) { hand[i] = j; x = analyse(); if (x > get) { get = x; } } hand[i] = JOKER; /* 置き換えたのをジョーカーに戻しておく */ } } if (joker == YES) { return get; } else { return analyse(); } } /* 手札の役の解析を行ない、役に応じた倍率を返す。ジョーカーは手札に含まれて */ /* いないと仮定しているが、ジョーカーを普通のカードで置き換えた場合も扱うの */ /* で、同じカードが二枚ある場合にも対応している! */ int analyse(void) { int i, j, x, y; int samerank, sequence, sequence2, flush, get; /* 数(ランク)が一致する組(ペア)の数を数える。この数でワンペア、 */ /* ツーペア、スリーカード、フルハウスなどが判定できるのは有名な事実 */ samerank = 0; for (i = 1; i <= 5; i++) { for (j = i+1; j <= 5; j++) { if (hand[i] % 13 == hand[j] % 13) { samerank++; } } } /* ランクが一致するペアがない場合に限り、隣り合ったランクのペアの数を */ /* 数える。これはストレートかどうかを判定するためなので、ランクが一致 */ /* するペアがある場合は 0 とする。 */ sequence = 0; sequence2 = 0; if (samerank == 0) { for (i = 1; i <= 5; i++) { for (j = i+1; j <= 5; j++) { x = hand[i] % 13 - hand[j] % 13; if (x == 1 || x == -1) { sequence++; } } } /* ここで sequence が 4 ならストレート(10-J-Q-K-A 以外)*/ for (i = 1; i <= 5; i++) { for (j = i+1; j <= 5; j++) { if (hand[i] % 13 == 0) { /* A は 13 と置き換えてから */ x = 13; } else { x = hand[i] % 13; } if (hand[j] % 13 == 0) { y = 13; } else { y = hand[j] % 13; } if (x == y + 1 || x + 1 == y) { /* 上と同じことを行なう */ sequence2++; /* (細部は違うけど) */ } } } /* ここで sequence2 が 4 ならストレート(A-2-3-4-5 以外) */ } /* 次に、マーク(スート)がすべて同じかどうかの判定を行なう */ /* (素直に && で四つの条件をつなげたほうがよかったかも) */ flush = YES; for (i = 1; i <= 4; i++) { if (hand[i] / 13 != hand[i+1] / 13) { flush = NO; } } /* 以上で、解析の材料はそろった。あとは判定するのみ。get は倍率。*/ if (samerank == 1) { get = 1; /* ワンペア */ } else if (samerank == 2) { get = 2; /* ツーペア */ } else if (samerank == 3) { get = 3; /* スリーカード */ } else if ((sequence == 4 || sequence2 == 4) && flush == NO) { get = 4; /* ストレート */ } else if (sequence != 4 && sequence2 != 4 && flush == YES) { get = 5; /* フラッシュ */ } else if (samerank == 4) { get = 10; /* フルハウスです */ } else if (samerank == 6) { get = 20; /* フォーカード */ } else if (sequence == 4 && flush == YES) { get = 50; /* ストレートフラッシュ */ } else if (samerank == 10) { get = 100; /* ファイブカード */ } else if (sequence != 4 && sequence2 == 4 && flush == YES) { get = 500; /* ロイヤルストレートフラッシュ */ } else { get = 0; } return get; } /* 結果の出力。ここと analyse() の終わり近くとで、数値が合っていないと */ /* いけないのが、めんどうな、というか、うまく書けていないところ。 */ void printresult(int get) { if (get == 1) { printf("ワンペアです. "); } else if (get == 2) { printf("ツーペアです. "); } else if (get == 3) { printf("スリーカードです. "); } else if (get == 4) { printf("ストレートです! "); } else if (get == 5) { printf("フラッシュです! "); } else if (get == 10) { printf("フルハウスです! "); } else if (get == 20) { printf("フォーカードです!! "); } else if (get == 50) { printf("ストレートフラッシュです!!! "); } else if (get == 100) { printf("ファイブカードです!!!! "); } else if (get == 500) { printf("ロイヤルストレートフラッシュです!!!!! "); } } void clearscreen(void) { printf("\033[2J"); /* 画面全体のクリア */ } void clear2end(void) { printf("\033[0K"); /* 行末まで削除 */ } void gotoxy(int x, int y) { printf("\033[%d;%dH", x, y); /* カーソルの移動 */ } void gotoxy2(int x, int y) { if (x <= 1) { /* 1行め(メッセージが出る行)には */ x = 2; /* カーソルを移動させないように */ } printf("\033[%d;%dH", x, y); /* カーソルの移動 */ } /* ランクの印字。(x, y) が左上の隅の位置。ジョーカーは -4 から -1 で、 */ /* それぞれ図柄が異なる。 */ void printrank(int rank, int x, int y) { if (rank == -4) { gotoxy2(x, y); printf("####### ####"); gotoxy2(x+1, y); printf("######## #####"); gotoxy2(x+2, y); printf("######## #####"); gotoxy2(x+3, y); printf("# ##### #####"); gotoxy2(x+4, y); printf("### #######"); gotoxy2(x+5, y); printf("######### ###"); gotoxy2(x+6, y); printf("####### ### #"); gotoxy2(x+7, y); printf("####### ### #"); gotoxy2(x+8, y); printf("# #### ### #"); gotoxy2(x+9, y); printf("# ###### ###"); gotoxy2(x+10, y); printf("# ## ########"); } else if (rank == -3) { gotoxy2(x, y); printf("\033[40m \033[42m \033[40m \033[m"); gotoxy2(x+1, y); printf("\033[40m \033[42m \033[40m \033[m"); gotoxy2(x+2, y); printf("\033[40m \033[42m \033[107m \033[42m \033[40m \033[m"); gotoxy2(x+3, y); printf("\033[42m \033[107m \033[40m \033[107m \033[40m \033[107m \033[42m \033[m"); gotoxy2(x+4, y); printf("\033[40m \033[107m \033[40m \033[107m \033[40m \033[107m \033[40m \033[m"); gotoxy2(x+5, y); printf("\033[107m \033[40m \033[107m \033[40m \033[107m \033[m"); gotoxy2(x+6, y); printf("\033[40m \033[107m \033[40m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[107m \033[41m \033[107m \033[41m \033[107m \033[40m \033[m"); gotoxy2(x+8, y); printf("\033[40m \033[107m \033[41m \033[107m \033[40m \033[42m \033[40m \033[m"); gotoxy2(x+9, y); printf("\033[40m \033[107m \033[40m \033[42m \033[m"); gotoxy2(x+10, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[42m \033[40m \033[m"); } else if (rank == -2) { gotoxy2(x, y); printf("\033[40m \033[42m \033[40m \033[m"); gotoxy2(x+1, y); printf("\033[40m \033[42m \033[40m \033[m"); gotoxy2(x+2, y); printf("\033[40m \033[42m \033[40m \033[42m \033[40m \033[m"); gotoxy2(x+3, y); printf("\033[40m \033[42m \033[40m \033[42m \033[40m \033[m"); gotoxy2(x+4, y); printf("\033[42m \033[40m \033[42m \033[107m \033[40m \033[m"); gotoxy2(x+5, y); printf("\033[40m \033[42m \033[40m \033[42m \033[107m \033[40m \033[107m \033[40m \033[m"); gotoxy2(x+6, y); printf("\033[40m \033[42m \033[107m \033[40m \033[107m \033[40m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[42m \033[107m \033[40m \033[107m \033[45m \033[m"); gotoxy2(x+8, y); printf("\033[40m \033[42m \033[107m \033[41m \033[107m \033[40m \033[m"); gotoxy2(x+9, y); printf("\033[40m \033[42m \033[107m \033[41m \033[40m \033[m"); gotoxy2(x+10, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[107m \033[40m \033[m"); } else if (rank == -1) { gotoxy2(x,y); printf("\033[40m \033[42m \033[44m \033[42m \033[m"); gotoxy2(x+1, y); printf("\033[40m \033[44m \033[42m \033[44m \033[m"); gotoxy2(x+2, y); printf("\033[40m \033[42m \033[44m \033[42m \033[m"); gotoxy2(x+3, y); printf("\033[40m \033[44m \033[42m \033[m"); gotoxy2(x+4, y); printf("\033[40m \033[42m \033[107m \033[42m \033[m"); gotoxy2(x+5, y); printf("\033[40m \033[42m \033[107m \033[m"); gotoxy2(x+6, y); printf("\033[40m \033[42m \033[107m \033[40m \033[107m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[107m \033[40m \033[107m \033[m"); gotoxy2(x+8, y); printf("\033[107m \033[40m \033[107m \033[40m \033[107m \033[m"); gotoxy2(x+9, y); printf("\033[107m \033[45m \033[m"); gotoxy2(x+10, y); printf("\033[107m \033[45m \033[m"); } else if (rank == 0) { gotoxy2(x, y); printf(" ### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## ## "); gotoxy2(x+5, y); printf(" ## ## "); gotoxy2(x+6, y); printf(" ## ## "); gotoxy2(x+7, y); printf(" ########### "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf("#### ####"); } else if (rank == 1) { gotoxy2(x, y); printf(" ##### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## "); gotoxy2(x+5, y); printf(" ## "); gotoxy2(x+6, y); printf(" ## "); gotoxy2(x+7, y); printf(" ## "); gotoxy2(x+8, y); printf(" ## "); gotoxy2(x+9, y); printf(" ## "); gotoxy2(x+10, y); printf(" ############# "); } else if (rank == 2) { gotoxy2(x, y); printf(" ##### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## "); gotoxy2(x+5, y); printf(" ### "); gotoxy2(x+6, y); printf(" ## "); gotoxy2(x+7, y); printf(" ## ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf(" ###### "); } else if (rank == 3) { gotoxy2(x, y); printf(" ## "); gotoxy2(x+1, y); printf(" ### "); gotoxy2(x+2, y); printf(" #### "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## ## "); gotoxy2(x+5, y); printf(" ## ## "); gotoxy2(x+6, y); printf(" ## ## "); gotoxy2(x+7, y); printf("###############"); gotoxy2(x+8, y); printf(" ## "); gotoxy2(x+9, y); printf(" ## "); gotoxy2(x+10, y); printf(" #### "); } else if (rank == 4) { gotoxy2(x, y); printf(" ############ "); gotoxy2(x+1, y); printf(" ## "); gotoxy2(x+2, y); printf(" ## "); gotoxy2(x+3, y); printf(" ## "); gotoxy2(x+4, y); printf(" ## ####### "); gotoxy2(x+5, y); printf(" ### ## "); gotoxy2(x+6, y); printf(" ## "); gotoxy2(x+7, y); printf(" ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf(" ##### "); } else if (rank == 5) { gotoxy2(x, y); printf(" ## "); gotoxy2(x+1, y); printf(" ## "); gotoxy2(x+2, y); printf(" ## "); gotoxy2(x+3, y); printf(" ## "); gotoxy2(x+4, y); printf(" ## "); gotoxy2(x+5, y); printf(" ## ####### "); gotoxy2(x+6, y); printf(" ### ## "); gotoxy2(x+7, y); printf(" ## ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf(" ####### "); } else if (rank == 6) { gotoxy2(x, y); printf(" ############# "); gotoxy2(x+1, y); printf(" ## "); gotoxy2(x+2, y); printf(" ## "); gotoxy2(x+3, y); printf(" ## "); gotoxy2(x+4, y); printf(" ## "); gotoxy2(x+5, y); printf(" ## "); gotoxy2(x+6, y); printf(" ## "); gotoxy2(x+7, y); printf(" ## "); gotoxy2(x+8, y); printf(" ## "); gotoxy2(x+9, y); printf(" ## "); gotoxy2(x+10, y); printf(" ## "); } else if (rank == 7) { gotoxy2(x, y); printf(" ##### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## ## "); gotoxy2(x+5, y); printf(" ####### "); gotoxy2(x+6, y); printf(" ## ## "); gotoxy2(x+7, y); printf(" ## ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf(" ####### "); } else if (rank == 8) { gotoxy2(x, y); printf(" ####### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## ### "); gotoxy2(x+5, y); printf(" ####### ## "); gotoxy2(x+6, y); printf(" ## "); gotoxy2(x+7, y); printf(" ## "); gotoxy2(x+8, y); printf(" ## "); gotoxy2(x+9, y); printf(" ## "); gotoxy2(x+10, y); printf(" ## "); } else if (rank == 9) { gotoxy2(x, y); printf(" ## #### "); gotoxy2(x+1, y); printf("### ## ## "); gotoxy2(x+2, y); printf(" ## ## ##"); gotoxy2(x+3, y); printf(" ## ## ##"); gotoxy2(x+4, y); printf(" ## ## ##"); gotoxy2(x+5, y); printf(" ## ## ##"); gotoxy2(x+6, y); printf(" ## ## ##"); gotoxy2(x+7, y); printf(" ## ## ##"); gotoxy2(x+8, y); printf(" ## ## ##"); gotoxy2(x+9, y); printf(" ## ## ## "); gotoxy2(x+10, y); printf("#### #### "); } else if (rank == 10) { gotoxy2(x, y); printf(" ####"); gotoxy2(x+1, y); printf(" ## "); gotoxy2(x+2, y); printf(" ## "); gotoxy2(x+3, y); printf(" ## "); gotoxy2(x+4, y); printf(" ## "); gotoxy2(x+5, y); printf(" ## "); gotoxy2(x+6, y); printf("## ## "); gotoxy2(x+7, y); printf("## ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf(" ###### "); } else if (rank == 11) { gotoxy2(x, y); printf(" ####### "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf("## ##"); gotoxy2(x+4, y); printf("## ##"); gotoxy2(x+5, y); printf("## ##"); gotoxy2(x+6, y); printf("## #### ##"); gotoxy2(x+7, y); printf("## ## ## ##"); gotoxy2(x+8, y); printf(" ## ## ## ## "); gotoxy2(x+9, y); printf(" ######### "); gotoxy2(x+10, y); printf(" ####"); } else { gotoxy2(x, y); printf("#### ####"); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ## ## "); gotoxy2(x+3, y); printf(" ## ## "); gotoxy2(x+4, y); printf(" ## ## "); gotoxy2(x+5, y); printf(" #### "); gotoxy2(x+6, y); printf(" ## ## "); gotoxy2(x+7, y); printf(" ## ## "); gotoxy2(x+8, y); printf(" ## ## "); gotoxy2(x+9, y); printf(" ## ## "); gotoxy2(x+10, y); printf("#### ####"); } } /* スートの印字。(x, y) が左上の隅の位置。ジョーカーは -4 から -1 で、 */ /* それぞれ図柄が異なる。 */ void printsuit(int suit, int x, int y) { if (suit == -4) { gotoxy2(x, y); printf("# ##########"); gotoxy2(x+1, y); printf("# ## ########"); gotoxy2(x+2, y); printf("######### ###"); gotoxy2(x+3, y); printf("####### ### #"); gotoxy2(x+4, y); printf("####### #"); gotoxy2(x+5, y); printf("####### ######"); gotoxy2(x+6, y); printf("######### ##"); gotoxy2(x+7, y); printf("# ### #######"); gotoxy2(x+8, y); printf("# # #########"); gotoxy2(x+9, y); printf("# ##########"); gotoxy2(x+10, y); printf("# #####IWASE##"); gotoxy2(x+11, y); printf("# ############"); } else if (suit == -3) { gotoxy2(x, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[40m \033[m"); gotoxy2(x+1, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); gotoxy2(x+2, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); gotoxy2(x+3, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[40m \033[m"); gotoxy2(x+4, y); printf("\033[40m \033[44m \033[103m \033[44m \033[40m \033[m"); gotoxy2(x+5, y); printf("\033[40m \033[44m \033[40m \033[44m \033[40m \033[m"); gotoxy2(x+6, y); printf("\033[40m \033[44m \033[40m \033[44m \033[40m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[44m \033[40m \033[44m \033[40m \033[m"); gotoxy2(x+8, y); printf("\033[40m \033[44m \033[40m \033[44m \033[40m \033[m"); gotoxy2(x+9, y); printf("\033[40m \033[44m \033[40m \033[44m \033[40m \033[m"); gotoxy2(x+10, y); printf("\033[103m \033[40m \033[44m \033[40m \033[44m \033[40m \033[103m \033[m"); gotoxy2(x+11, y); printf("\033[40m \033[103m \033[40m \033[103m \033[40m \033[m"); } else if (suit == -2) { gotoxy2(x, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+1, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+2, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+3, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[m"); gotoxy2(x+4, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[m"); gotoxy2(x+5, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+6, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+8, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[m"); gotoxy2(x+9, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[103m \033[m"); gotoxy2(x+10, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[40m \033[103m \033[m"); gotoxy2(x+11, y); printf("\033[40m \033[103m \033[40m \033[m"); } else if (suit == -1) { gotoxy2(x, y); printf("\033[107m \033[40m \033[107m \033[45m \033[m"); gotoxy2(x+1, y); printf("\033[40m \033[107m \033[41m \033[107m \033[m"); gotoxy2(x+2, y); printf("\033[40m \033[107m \033[41m \033[107m \033[m"); gotoxy2(x+3, y); printf("\033[40m \033[107m \033[41m \033[107m \033[m"); gotoxy2(x+4, y); printf("\033[40m \033[107m \033[41m \033[m"); gotoxy2(x+5, y); printf("\033[40m \033[107m \033[m"); gotoxy2(x+6, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[103m \033[40m \033[m"); gotoxy2(x+7, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[103m \033[m"); gotoxy2(x+8, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); gotoxy2(x+9, y); printf("\033[40m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); gotoxy2(x+10, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); gotoxy2(x+11, y); printf("\033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[46m \033[45m \033[m"); } else if (suit == 0) { gotoxy2(x, y); printf(" "); gotoxy2(x+1, y); printf(" # "); gotoxy2(x+2, y); printf(" # "); gotoxy2(x+3, y); printf(" ### "); gotoxy2(x+4, y); printf(" ##### "); gotoxy2(x+5, y); printf(" ######### "); gotoxy2(x+6, y); printf(" ############# "); gotoxy2(x+7, y); printf("###############"); gotoxy2(x+8, y); printf(" ############# "); gotoxy2(x+9, y); printf(" ## ### ## "); gotoxy2(x+10, y); printf(" ### "); gotoxy2(x+11, y); printf(" ######### "); } else if (suit == 1) { gotoxy2(x, y); printf(" "); gotoxy2(x+1, y); printf(" ## ## "); gotoxy2(x+2, y); printf(" ##### ##### "); gotoxy2(x+3, y); printf("####### #######"); gotoxy2(x+4, y); printf("###############"); gotoxy2(x+5, y); printf("###############"); gotoxy2(x+6, y); printf(" ############# "); gotoxy2(x+7, y); printf(" ########### "); gotoxy2(x+8, y); printf(" ######### "); gotoxy2(x+9, y); printf(" ##### "); gotoxy2(x+10, y); printf(" ### "); gotoxy2(x+11, y); printf(" # "); } else if (suit == 2) { gotoxy2(x, y); printf(" "); gotoxy2(x+1, y); printf(" ### "); gotoxy2(x+2, y); printf(" ######### "); gotoxy2(x+3, y); printf(" ######### "); gotoxy2(x+4, y); printf(" ##### "); gotoxy2(x+5, y); printf(" ### # ### "); gotoxy2(x+6, y); printf("###############"); gotoxy2(x+7, y); printf("###############"); gotoxy2(x+8, y); printf("##### ### #####"); gotoxy2(x+9, y); printf(" ## ### ## "); gotoxy2(x+10, y); printf(" ### "); gotoxy2(x+11, y); printf(" ######### "); } else { gotoxy2(x, y); printf(" "); gotoxy2(x+1, y); printf(" # "); gotoxy2(x+2, y); printf(" ### "); gotoxy2(x+3, y); printf(" ##### "); gotoxy2(x+4, y); printf(" ######### "); gotoxy2(x+5, y); printf(" ########### "); gotoxy2(x+6, y); printf("###############"); gotoxy2(x+7, y); printf(" ########### "); gotoxy2(x+8, y); printf(" ######### "); gotoxy2(x+9, y); printf(" ##### "); gotoxy2(x+10, y); printf(" ### "); gotoxy2(x+11, y); printf(" # "); } }