Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.71 KB | None | 0 0
  1. /* A simple blackjack game in C */
  2.  
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7.  
  8. #define NUM_SUITS 4
  9. #define NUM_RANKS 13
  10. #define HEARTS 3
  11. #define DIAMONDS 4
  12. #define CLUBS 5
  13. #define SPADE 6
  14. #define H 196
  15. #define V 179
  16. #define TL 218
  17. #define BL 192
  18. #define TR 191
  19. #define BR 217
  20. #define CARD_ROWS 7
  21.  
  22. struct Card {
  23. char suit;
  24. char rank;
  25. char value;
  26. bool ace;
  27. };
  28.  
  29. void play_sound(int n) {
  30. for(;n > 0; n--) {
  31. printf("\a");
  32. }
  33. }
  34.  
  35. const char rank_code[] = {'2', '3', '4', '5', '6', '7', '8',
  36. '9', 'T', 'J', 'Q', 'K', 'A'};
  37. const char suit_code[] = {CLUBS, DIAMONDS, HEARTS, SPADE};
  38.  
  39. bool better_then(int a, int b) {
  40. return a <= 21 && (21 - a) < (21 - b);
  41. }
  42.  
  43. int get_dealer_action(int dealer_score) {
  44. // The dealer must stand on 17 or higher and hit below 17.
  45. if (dealer_score >= 17) {
  46. return 2;
  47. }
  48. return 1;
  49. }
  50.  
  51. void print_cards(struct Card *cards, size_t num_cards, bool dealer) {
  52. for (int line = 0; line < CARD_ROWS; ++line) {
  53. for (unsigned i = 0; i < num_cards; ++i) {
  54. if (i > 0 && dealer && line > 0 && line < 6) {
  55. printf("%c#####%c", V, V);
  56. continue;
  57. }
  58. switch (line) {
  59. case 0:
  60. printf("%c%c%c%c%c%c%c", TL, H, H, H, H, H, TR);
  61. break;
  62. case 1:
  63. printf("%c%c %c", V, cards[i].suit, V);
  64. break;
  65. case 3:
  66. if (cards[i].rank == 'T') {
  67. printf("%c 10 %c", V, V);
  68. } else {
  69. printf("%c %c %c", V, cards[i].rank, V);
  70. }
  71. break;
  72. case 5:
  73. printf("%c %c%c", V, cards[i].suit, V);
  74. break;
  75. case 6:
  76. printf("%c%c%c%c%c%c%c", BL, H, H, H, H, H, BR);
  77. break;
  78. default:
  79. printf("%c %c", V, V);
  80. break;
  81.  
  82. }
  83. }
  84. printf("\n");
  85. }
  86. }
  87.  
  88. void print_game_table(int player_score, int dealer_score, struct Card *player_cards, struct Card *dealer_cards, size_t num_player_cards, size_t num_dealer_cards, bool player_done, bool dealer_done) {
  89. printf("\nDealer(%2d): \n", dealer_score);
  90. print_cards(dealer_cards, num_dealer_cards,
  91. !player_done && !dealer_done);
  92. printf("\nYou(%2d):\n", player_score);
  93. print_cards(player_cards, num_player_cards, false);
  94.  
  95. }
  96.  
  97. struct Card draw(bool (*in_hand)[NUM_SUITS][NUM_RANKS]) {
  98. struct Card card;
  99. int rank, suit;
  100. for (;;) {
  101. suit = rand() % NUM_SUITS; /* picks a random suit */
  102. rank = rand() % NUM_RANKS; /* picks a random rank */
  103. if (!(*in_hand)[suit][rank]) {
  104. card.suit = suit_code[suit];
  105. card.rank = rank_code[rank];
  106. if (rank == 12) {
  107. card.value = 1;
  108. card.ace = 1;
  109. } else if (rank < 9) {
  110. card.value = rank + 2;
  111. card.ace = 0;
  112. } else {
  113. card.value = 10;
  114. card.ace = 0;
  115. }
  116.  
  117. (*in_hand)[suit][rank] = true;
  118. return card;
  119. }
  120. }
  121. }
  122.  
  123. int get_score(struct Card *cards, size_t num_cards) {
  124. int sum = 0, aces = 0;
  125. for (unsigned i = 0; i < num_cards; ++i) {
  126. sum += cards[i].value;
  127. aces += cards[i].ace;
  128. }
  129. for (; aces > 0; aces--) {
  130. if (better_then(sum + 10, sum)) {
  131. sum += 10;
  132. }
  133. }
  134. return sum;
  135. }
  136.  
  137. int deal(float *cash, float *bet) {
  138. bool in_hand[NUM_SUITS][NUM_RANKS] = {{ false }}; // control cards so that they don't repeat
  139. size_t num_cards = 21;
  140. struct Card dealer_cards[num_cards], player_cards[num_cards];
  141. size_t num_dealer_cards = 0, num_player_cards = 0;
  142. bool player_done = false, dealer_done = false;
  143. int player_score, dealer_score;
  144.  
  145. float result = 0.0f;
  146.  
  147.  
  148. srand((unsigned) time(NULL));
  149.  
  150. printf("\n*** Welcome to ClackJack - a C BlackJack! ***\n");
  151.  
  152. for (; num_player_cards < 2; ++num_player_cards) {
  153. player_cards[num_player_cards] = draw(&in_hand);
  154. }
  155. for (; num_dealer_cards < 2; ++num_dealer_cards) {
  156. dealer_cards[num_dealer_cards] = draw(&in_hand);
  157. }
  158.  
  159. int player_action, dealer_action;
  160. for (;;) {
  161. player_score = get_score(player_cards, num_player_cards);
  162. dealer_score = get_score(dealer_cards, num_dealer_cards);
  163.  
  164. print_game_table(player_score, dealer_score,
  165. player_cards, dealer_cards,
  166. num_player_cards, num_dealer_cards,
  167. player_done, dealer_done);
  168.  
  169. if ((player_score == 21) && (dealer_score == 21)) {
  170. printf("Tied hand!");
  171. break;
  172. }
  173. else if (player_score == 21) {
  174. if (num_player_cards == 2) {
  175. result = (*bet) * 1.5;
  176. printf("Blackjack!");
  177. play_sound(4);
  178. } else {
  179. result = (*bet);
  180. printf("You win!");
  181. play_sound(2);
  182. }
  183. break;
  184. } else if (dealer_score == 21) {
  185. result = -(*bet);
  186. printf("Dealer wins!");
  187. play_sound(1);
  188. break;
  189. } else if (player_done && dealer_done) {
  190. if (better_then(player_score, dealer_score)) {
  191. result = (*bet);
  192. printf("You win!");
  193. play_sound(2);
  194. break;
  195. } else {
  196. result = -(*bet);
  197. printf("Dealer wins!");
  198. play_sound(1);
  199. break;
  200. }
  201. }
  202. else if (player_score > 21) {
  203. result = -(*bet);
  204. printf("You busted!");
  205. play_sound(1);
  206. break;
  207. } else if (dealer_score > 21) {
  208. result = (*bet);
  209. printf("Dealer busted!");
  210. play_sound(2);
  211. break;
  212. }
  213.  
  214. printf("\n(1 - Hit, 2 - Stand)\n");
  215. printf("What would you like to do? ");
  216.  
  217. if (!player_done) {
  218. scanf("%1d", &player_action);
  219. switch (player_action) {
  220. case 1:
  221. if (num_player_cards < num_cards) {
  222. player_cards[num_player_cards] = draw(&in_hand);
  223. ++num_player_cards;
  224. player_score = get_score(player_cards, num_player_cards);
  225. if (player_score >= 21) {
  226. player_done = true;
  227. }
  228. }
  229. break;
  230. case 2:
  231. player_done = true;
  232. break;
  233. }
  234. }
  235.  
  236. // Once the dealer has dealt additional cards to all the players, the dealer draws cards for his/her hand.
  237. if (player_done && !dealer_done) {
  238. dealer_action = get_dealer_action(dealer_score);
  239. switch (dealer_action) {
  240. case 1:
  241. dealer_cards[num_dealer_cards] = draw(&in_hand);
  242. ++num_dealer_cards;
  243. break;
  244. case 2:
  245. dealer_done = true;
  246. break;
  247. }
  248. dealer_score = get_score(dealer_cards, num_dealer_cards);
  249. if (dealer_score >= 21) {
  250. dealer_done = true;
  251. }
  252. }
  253. }
  254. if (result > 0) {
  255. printf(" You've earned $%.2f\n", result);
  256. } else if (result < 0) {
  257. printf(" You've lost $%.2f\n", result);
  258. }
  259. return result;
  260. }
  261.  
  262. void change_bet(float *cash, float *bet) {
  263. float new_bet;
  264. for (;;) {
  265. printf("\nEnter a valid bet: ");
  266. scanf("%f", &new_bet);
  267. if (new_bet <= (*cash)) {
  268. (*bet) = new_bet;
  269. return;
  270. }
  271. }
  272. }
  273.  
  274.  
  275. int main(void) {
  276. float cash = 1000.0f, bet = 250.0f;
  277. float *cash_p = &cash;
  278. float *bet_p = &bet;
  279. int player_action;
  280. do {
  281. if (cash < bet) {
  282. bet = cash;
  283. }
  284. if (cash <= 0.01f) {
  285. printf("You are broke! Sounds like a good time to stop...");
  286. break;
  287. }
  288. printf("\n(Options: 1 - Deal (bet %.2f); 2 - Change bet; 0 - Quit)\n",
  289. bet);
  290. printf("What would you like to do? (cash %.2f)", cash);
  291. scanf("%1d", &player_action);
  292. switch (player_action) {
  293. case 1:
  294. cash += deal(cash_p, bet_p);
  295. break;
  296. case 2:
  297. change_bet(cash_p, bet_p);
  298. break;
  299. default:
  300. return 0;
  301. break;
  302. }
  303. } while (1);
  304.  
  305. printf("\n");
  306.  
  307. return 0;
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement