#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DECK_SIZE 52
#define MAX_HAND 12
typedef struct {
int suit; // 0-3
int value; // 1-13 (A=1, JQK=11-13)
} Card;
/* 関数宣言 */
void init_deck(Card deck[]);
void shuffle(Card deck[]);
Card draw(Card deck[], int *pos);
int hand_value(Card hand[], int count);
void print_hand(const char *name, Card hand[], int count);
/* メイン */
int main(void) {
Card deck[DECK_SIZE];
Card player[MAX_HAND], dealer[MAX_HAND];
int deck_pos = 0;
int p_count = 0, d_count = 0;
char choice;
init_deck(deck);
shuffle(deck);
/* 最初に2枚ずつ配る */
player[p_count++] = draw(deck, &deck_pos);
player[p_count++] = draw(deck, &deck_pos);
dealer[d_count++] = draw(deck, &deck_pos);
dealer[d_count++] = draw(deck, &deck_pos);
/* プレイヤーのターン */
while (1) {
print_hand("Player", player, p_count);
printf("Player total: %d\n", hand_value
(player
, p_count
));
if (hand_value(player, p_count) > 21) {
printf("Player bust! You lose.\n"); return 0;
}
if (choice == 'y') {
player[p_count++] = draw(deck, &deck_pos);
} else {
break;
}
}
/* ディーラーのターン */
while (hand_value(dealer, d_count) < 17) {
dealer[d_count++] = draw(deck, &deck_pos);
}
/* 結果表示 */
print_hand("Dealer", dealer, d_count);
printf("Dealer total: %d\n", hand_value
(dealer
, d_count
));
int p = hand_value(player, p_count);
int d = hand_value(dealer, d_count);
if (d > 21 || p > d) {
} else if (p < d) {
} else {
}
return 0;
}
/* 山札作成 */
void init_deck(Card deck[]) {
int i = 0;
for (int s = 0; s < 4; s++) {
for (int v = 1; v <= 13; v++) {
deck[i].suit = s;
deck[i].value = v;
i++;
}
}
}
/* シャッフル */
void shuffle(Card deck[]) {
for (int i = 0; i < DECK_SIZE; i++) {
int j
= rand() % DECK_SIZE
; Card tmp = deck[i];
deck[i] = deck[j];
deck[j] = tmp;
}
}
/* 1枚引く */
Card draw(Card deck[], int *pos) {
return deck[(*pos)++];
}
/* 手札の合計(Aを1 or 11で調整) */
int hand_value(Card hand[], int count) {
int sum = 0;
int ace = 0;
for (int i = 0; i < count; i++) {
int v = hand[i].value;
if (v >= 10) sum += 10;
else if (v == 1) {
sum += 11;
ace++;
} else sum += v;
}
while (sum > 21 && ace > 0) {
sum -= 10;
ace--;
}
return sum;
}
/* 手札表示 */
void print_hand(const char *name, Card hand[], int count) {
for (int i = 0; i < count; i++) {
int v = hand[i].value;
else if (v
== 11) printf("J "); else if (v
== 12) printf("Q "); else if (v
== 13) printf("K "); }
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNkZWZpbmUgREVDS19TSVpFIDUyCiNkZWZpbmUgTUFYX0hBTkQgMTIKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBzdWl0OyAgIC8vIDAtMwogICAgaW50IHZhbHVlOyAgLy8gMS0xMyAoQT0xLCBKUUs9MTEtMTMpCn0gQ2FyZDsKCi8qIOmWouaVsOWuo+iogCAqLwp2b2lkIGluaXRfZGVjayhDYXJkIGRlY2tbXSk7CnZvaWQgc2h1ZmZsZShDYXJkIGRlY2tbXSk7CkNhcmQgZHJhdyhDYXJkIGRlY2tbXSwgaW50ICpwb3MpOwppbnQgaGFuZF92YWx1ZShDYXJkIGhhbmRbXSwgaW50IGNvdW50KTsKdm9pZCBwcmludF9oYW5kKGNvbnN0IGNoYXIgKm5hbWUsIENhcmQgaGFuZFtdLCBpbnQgY291bnQpOwoKLyog44Oh44Kk44OzICovCmludCBtYWluKHZvaWQpIHsKICAgIENhcmQgZGVja1tERUNLX1NJWkVdOwogICAgQ2FyZCBwbGF5ZXJbTUFYX0hBTkRdLCBkZWFsZXJbTUFYX0hBTkRdOwogICAgaW50IGRlY2tfcG9zID0gMDsKICAgIGludCBwX2NvdW50ID0gMCwgZF9jb3VudCA9IDA7CiAgICBjaGFyIGNob2ljZTsKCiAgICBzcmFuZCgodW5zaWduZWQpdGltZShOVUxMKSk7CgogICAgaW5pdF9kZWNrKGRlY2spOwogICAgc2h1ZmZsZShkZWNrKTsKCiAgICAvKiDmnIDliJ3jgasy5p6a44Ga44Gk6YWN44KLICovCiAgICBwbGF5ZXJbcF9jb3VudCsrXSA9IGRyYXcoZGVjaywgJmRlY2tfcG9zKTsKICAgIHBsYXllcltwX2NvdW50KytdID0gZHJhdyhkZWNrLCAmZGVja19wb3MpOwogICAgZGVhbGVyW2RfY291bnQrK10gPSBkcmF3KGRlY2ssICZkZWNrX3Bvcyk7CiAgICBkZWFsZXJbZF9jb3VudCsrXSA9IGRyYXcoZGVjaywgJmRlY2tfcG9zKTsKCiAgICAvKiDjg5fjg6zjgqTjg6Tjg7zjga7jgr/jg7zjg7MgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgICAgcHJpbnRfaGFuZCgiUGxheWVyIiwgcGxheWVyLCBwX2NvdW50KTsKICAgICAgICBwcmludGYoIlBsYXllciB0b3RhbDogJWRcbiIsIGhhbmRfdmFsdWUocGxheWVyLCBwX2NvdW50KSk7CgogICAgICAgIGlmIChoYW5kX3ZhbHVlKHBsYXllciwgcF9jb3VudCkgPiAyMSkgewogICAgICAgICAgICBwcmludGYoIlBsYXllciBidXN0ISBZb3UgbG9zZS5cbiIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHByaW50ZigiSGl0PyAoeS9uKTogIik7CiAgICAgICAgc2NhbmYoIiAlYyIsICZjaG9pY2UpOwoKICAgICAgICBpZiAoY2hvaWNlID09ICd5JykgewogICAgICAgICAgICBwbGF5ZXJbcF9jb3VudCsrXSA9IGRyYXcoZGVjaywgJmRlY2tfcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLyog44OH44Kj44O844Op44O844Gu44K/44O844OzICovCiAgICB3aGlsZSAoaGFuZF92YWx1ZShkZWFsZXIsIGRfY291bnQpIDwgMTcpIHsKICAgICAgICBkZWFsZXJbZF9jb3VudCsrXSA9IGRyYXcoZGVjaywgJmRlY2tfcG9zKTsKICAgIH0KCiAgICAvKiDntZDmnpzooajnpLogKi8KICAgIHByaW50X2hhbmQoIkRlYWxlciIsIGRlYWxlciwgZF9jb3VudCk7CiAgICBwcmludGYoIkRlYWxlciB0b3RhbDogJWRcbiIsIGhhbmRfdmFsdWUoZGVhbGVyLCBkX2NvdW50KSk7CgogICAgaW50IHAgPSBoYW5kX3ZhbHVlKHBsYXllciwgcF9jb3VudCk7CiAgICBpbnQgZCA9IGhhbmRfdmFsdWUoZGVhbGVyLCBkX2NvdW50KTsKCiAgICBpZiAoZCA+IDIxIHx8IHAgPiBkKSB7CiAgICAgICAgcHJpbnRmKCJZb3Ugd2luIVxuIik7CiAgICB9IGVsc2UgaWYgKHAgPCBkKSB7CiAgICAgICAgcHJpbnRmKCJZb3UgbG9zZS5cbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIkRyYXcuXG4iKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyog5bGx5pyt5L2c5oiQICovCnZvaWQgaW5pdF9kZWNrKENhcmQgZGVja1tdKSB7CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKGludCBzID0gMDsgcyA8IDQ7IHMrKykgewogICAgICAgIGZvciAoaW50IHYgPSAxOyB2IDw9IDEzOyB2KyspIHsKICAgICAgICAgICAgZGVja1tpXS5zdWl0ID0gczsKICAgICAgICAgICAgZGVja1tpXS52YWx1ZSA9IHY7CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICB9Cn0KCi8qIOOCt+ODo+ODg+ODleODqyAqLwp2b2lkIHNodWZmbGUoQ2FyZCBkZWNrW10pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVDS19TSVpFOyBpKyspIHsKICAgICAgICBpbnQgaiA9IHJhbmQoKSAlIERFQ0tfU0laRTsKICAgICAgICBDYXJkIHRtcCA9IGRlY2tbaV07CiAgICAgICAgZGVja1tpXSA9IGRlY2tbal07CiAgICAgICAgZGVja1tqXSA9IHRtcDsKICAgIH0KfQoKLyogMeaemuW8leOBjyAqLwpDYXJkIGRyYXcoQ2FyZCBkZWNrW10sIGludCAqcG9zKSB7CiAgICByZXR1cm4gZGVja1soKnBvcykrK107Cn0KCi8qIOaJi+acreOBruWQiOioiO+8iEHjgpIxIG9yIDEx44Gn6Kq/5pW077yJICovCmludCBoYW5kX3ZhbHVlKENhcmQgaGFuZFtdLCBpbnQgY291bnQpIHsKICAgIGludCBzdW0gPSAwOwogICAgaW50IGFjZSA9IDA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgaW50IHYgPSBoYW5kW2ldLnZhbHVlOwogICAgICAgIGlmICh2ID49IDEwKSBzdW0gKz0gMTA7CiAgICAgICAgZWxzZSBpZiAodiA9PSAxKSB7CiAgICAgICAgICAgIHN1bSArPSAxMTsKICAgICAgICAgICAgYWNlKys7CiAgICAgICAgfSBlbHNlIHN1bSArPSB2OwogICAgfQoKICAgIHdoaWxlIChzdW0gPiAyMSAmJiBhY2UgPiAwKSB7CiAgICAgICAgc3VtIC09IDEwOwogICAgICAgIGFjZS0tOwogICAgfQoKICAgIHJldHVybiBzdW07Cn0KCi8qIOaJi+acreihqOekuiAqLwp2b2lkIHByaW50X2hhbmQoY29uc3QgY2hhciAqbmFtZSwgQ2FyZCBoYW5kW10sIGludCBjb3VudCkgewogICAgcHJpbnRmKCIlcyBoYW5kOiAiLCBuYW1lKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIGludCB2ID0gaGFuZFtpXS52YWx1ZTsKICAgICAgICBpZiAodiA9PSAxKSBwcmludGYoIkEgIik7CiAgICAgICAgZWxzZSBpZiAodiA9PSAxMSkgcHJpbnRmKCJKICIpOwogICAgICAgIGVsc2UgaWYgKHYgPT0gMTIpIHByaW50ZigiUSAiKTsKICAgICAgICBlbHNlIGlmICh2ID09IDEzKSBwcmludGYoIksgIik7CiAgICAgICAgZWxzZSBwcmludGYoIiVkICIsIHYpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9