fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define DECK_SIZE 52
  6. #define MAX_HAND 12
  7.  
  8. typedef struct {
  9. int suit; // 0-3
  10. int value; // 1-13 (A=1, JQK=11-13)
  11. } Card;
  12.  
  13. /* 関数宣言 */
  14. void init_deck(Card deck[]);
  15. void shuffle(Card deck[]);
  16. Card draw(Card deck[], int *pos);
  17. int hand_value(Card hand[], int count);
  18. void print_hand(const char *name, Card hand[], int count);
  19.  
  20. /* メイン */
  21. int main(void) {
  22. Card deck[DECK_SIZE];
  23. Card player[MAX_HAND], dealer[MAX_HAND];
  24. int deck_pos = 0;
  25. int p_count = 0, d_count = 0;
  26. char choice;
  27.  
  28. srand((unsigned)time(NULL));
  29.  
  30. init_deck(deck);
  31. shuffle(deck);
  32.  
  33. /* 最初に2枚ずつ配る */
  34. player[p_count++] = draw(deck, &deck_pos);
  35. player[p_count++] = draw(deck, &deck_pos);
  36. dealer[d_count++] = draw(deck, &deck_pos);
  37. dealer[d_count++] = draw(deck, &deck_pos);
  38.  
  39. /* プレイヤーのターン */
  40. while (1) {
  41. print_hand("Player", player, p_count);
  42. printf("Player total: %d\n", hand_value(player, p_count));
  43.  
  44. if (hand_value(player, p_count) > 21) {
  45. printf("Player bust! You lose.\n");
  46. return 0;
  47. }
  48.  
  49. printf("Hit? (y/n): ");
  50. scanf(" %c", &choice);
  51.  
  52. if (choice == 'y') {
  53. player[p_count++] = draw(deck, &deck_pos);
  54. } else {
  55. break;
  56. }
  57. }
  58.  
  59. /* ディーラーのターン */
  60. while (hand_value(dealer, d_count) < 17) {
  61. dealer[d_count++] = draw(deck, &deck_pos);
  62. }
  63.  
  64. /* 結果表示 */
  65. print_hand("Dealer", dealer, d_count);
  66. printf("Dealer total: %d\n", hand_value(dealer, d_count));
  67.  
  68. int p = hand_value(player, p_count);
  69. int d = hand_value(dealer, d_count);
  70.  
  71. if (d > 21 || p > d) {
  72. printf("You win!\n");
  73. } else if (p < d) {
  74. printf("You lose.\n");
  75. } else {
  76. printf("Draw.\n");
  77. }
  78.  
  79. return 0;
  80. }
  81.  
  82. /* 山札作成 */
  83. void init_deck(Card deck[]) {
  84. int i = 0;
  85. for (int s = 0; s < 4; s++) {
  86. for (int v = 1; v <= 13; v++) {
  87. deck[i].suit = s;
  88. deck[i].value = v;
  89. i++;
  90. }
  91. }
  92. }
  93.  
  94. /* シャッフル */
  95. void shuffle(Card deck[]) {
  96. for (int i = 0; i < DECK_SIZE; i++) {
  97. int j = rand() % DECK_SIZE;
  98. Card tmp = deck[i];
  99. deck[i] = deck[j];
  100. deck[j] = tmp;
  101. }
  102. }
  103.  
  104. /* 1枚引く */
  105. Card draw(Card deck[], int *pos) {
  106. return deck[(*pos)++];
  107. }
  108.  
  109. /* 手札の合計(Aを1 or 11で調整) */
  110. int hand_value(Card hand[], int count) {
  111. int sum = 0;
  112. int ace = 0;
  113.  
  114. for (int i = 0; i < count; i++) {
  115. int v = hand[i].value;
  116. if (v >= 10) sum += 10;
  117. else if (v == 1) {
  118. sum += 11;
  119. ace++;
  120. } else sum += v;
  121. }
  122.  
  123. while (sum > 21 && ace > 0) {
  124. sum -= 10;
  125. ace--;
  126. }
  127.  
  128. return sum;
  129. }
  130.  
  131. /* 手札表示 */
  132. void print_hand(const char *name, Card hand[], int count) {
  133. printf("%s hand: ", name);
  134. for (int i = 0; i < count; i++) {
  135. int v = hand[i].value;
  136. if (v == 1) printf("A ");
  137. else if (v == 11) printf("J ");
  138. else if (v == 12) printf("Q ");
  139. else if (v == 13) printf("K ");
  140. else printf("%d ", v);
  141. }
  142. printf("\n");
  143. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Player hand: 5 10 
Player total: 15
Hit? (y/n): Dealer hand: 2 8 8 
Dealer total: 18
You lose.