From 955a1be96b5cb13e92e8208cd5f067bec61ef0a3 Mon Sep 17 00:00:00 2001 From: hypercube Date: Sun, 15 Mar 2026 11:02:40 +0000 Subject: [PATCH] uploaded blackjack.c --- blackjack.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 blackjack.c diff --git a/blackjack.c b/blackjack.c new file mode 100644 index 0000000..04ed52e --- /dev/null +++ b/blackjack.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include + +typedef enum { + CARD_ACE, CARD_2, CARD_3, CARD_4, CARD_5, CARD_6, CARD_7, CARD_8, CARD_9, CARD_10, CARD_J, CARD_Q, CARD_K, CARD_COUNT, +} Card_Type; + +typedef struct { + Card_Type cards[16]; + int count; +} Hand; + +typedef struct { + Card_Type cards[64]; + int count; +} Deck; + +static void swapCard(Card_Type *a, Card_Type *b) { + Card_Type tmp = *a; + *a = *b; + *b = tmp; +} + +void shuffleDeck(Deck *d) { + if (!d) return; + int n = d->count; + if (n <= 1) return; + for (int i = n - 1; i > 0; --i) { + int j = rand() % (i + 1); // uniform in [0,i] + swapCard(&d->cards[i], &d->cards[j]); + } +} + +int cardValue(Card_Type card) { + return card + 1 <= 10 ? card + 1 : 10; +} + +void takeCard(Deck *deck, Hand *hand) { + hand->cards[hand->count++] = deck->cards[--deck->count]; +}; + +int countScore(Hand hand) { + int score = 0; + bool has_ace = false; + for(int i = 0; i < hand.count; i++){ + if(hand.cards[i] == CARD_ACE) has_ace = true; + score += cardValue(hand.cards[i]); + } + return score + has_ace * 10; +} + +void printResult(int player_score, int dealer_score) { + if(player_score > 21) { + puts("player lost\n"); + return; + } else if(player_score == 21 && dealer_score != 21) { + puts("!!!BLACKJACK!!!\n"); + return; + } else if(player_score == dealer_score) { + puts("push\n"); + return; + } else if(dealer_score > 21 || player_score > dealer_score) { + puts("player won\n"); + return; + } else if(dealer_score > player_score) { + puts("player lost\n"); + return; + } +} + +int main() { + srand((unsigned)time(NULL)); + Deck deck = {0}; + for(int i = 0; i < CARD_COUNT; i++){ + deck.cards[deck.count++] = i; + deck.cards[deck.count++] = i; + deck.cards[deck.count++] = i; + deck.cards[deck.count++] = i; + } + + shuffleDeck(&deck); + shuffleDeck(&deck); + shuffleDeck(&deck); + + Hand dealer = {0}; + Hand player = {0}; + takeCard(&deck, &player); + takeCard(&deck, &player); + takeCard(&deck, &dealer); + + char cmd; + bool ask = true; + if(countScore(player) == 21) ask = false; + while(ask){ + printf("player score: %d\n", countScore(player)); + printf("dealer score: %d\n", countScore(dealer)); + puts("[H]it or [S]tand?\n"); + + do { + cmd = getchar(); + if (cmd == EOF) return 0; + if (cmd == '\n') break; + } while (cmd == ' ' || cmd == '\t'); + if (cmd == '\n') continue; + + int ch; + while ((ch = getchar()) != EOF && ch != '\n') { /* discard */ } + + switch (cmd) { + case 'h': + case 'H': + takeCard(&deck, &player); + if(countScore(player) >= 21) ask = false; + break; + case 's': + case 'S': + ask = false; + break; + case 'q': + puts("Quitting."); + return 0; + default: + printf("Unknown command: %c\n", cmd); + } + } + + if(countScore(player) >= 21) { + takeCard(&deck, &dealer); + } else { + while(countScore(dealer) < 17) takeCard(&deck, &dealer); + } + + printf("player score: %d\n", countScore(player)); + printf("dealer score: %d\n", countScore(dealer)); + printResult(countScore(player), countScore(dealer)); + return 0; +}