#include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_CARDS 52 typedef struct { int value; } Card; Card deck[NUM_CARDS]; void shuffleDeck(Card deck[], int size) { for (int i = 0; i < size; i++) { int j = rand() % size; Card temp = deck[i]; deck[i] = deck[j]; deck[j] = temp; } } int getCardValue(int cardNum) { if (cardNum >= 2 && cardNum <= 9) { return cardNum; } else if (cardNum == 10 || cardNum == 11 || cardNum == 12 || cardNum == 13) { return 10; } else if (cardNum == 14) { return 11; // Ace can be 1 or 11, here we use 11 as default } return 0; } int main() { srand(time(NULL)); int playerCards[5] = {0}; int dealerCards[5] = {0}; int playerSum = 0, dealerSum = 0; char hit; // Initialize the deck of cards for (int i = 0; i < NUM_CARDS; i++) { deck[i].value = (i % 13) + 1; } shuffleDeck(deck, NUM_CARDS); // Deal initial 2 cards to player and dealer for (int i = 0; i < 2; i++) { playerCards[i] = deck[i].value; playerSum += getCardValue(playerCards[i]); dealerCards[i] = deck[i + 2].value; dealerSum += getCardValue(dealerCards[i]); } printf("Player's hand: "); for (int i = 0; i < 2; i++) { printf("%d ", playerCards[i]); } printf(" Dealer's hand: "); for (int i = 0; i < 2; i++) { printf("%d ", dealerCards[i]); } printf(" "); // Player's turn to hit or stand do { printf("Do you want to hit? (y/n): "); scanf(" %c", &hit); if (hit == 'y' || hit == 'Y') { playerCards[2 + (playerSum / 10)] = deck[2 + (playerSum / 10)].value; playerSum += getCardValue(playerCards[2 + (playerSum / 10)]); printf("You drew a %d ", playerCards[2 + (playerSum / 10)]); } } while (hit == 'y' || hit == 'Y'); // Dealer's turn to hit or stand while (dealerSum < 17) { dealerCards[2 + (dealerSum / 10)] = deck[2 + (dealerSum / 10) + 2].value; dealerSum += getCardValue(dealerCards[2 + (dealerSum / 10)]); printf("Dealer drew a %d ", dealerCards[2 + (dealerSum / 10)]); } // Determine the winner if (playerSum > 21) { printf("Player busts! Dealer wins. "); } else if (dealerSum > 21) { printf("Dealer busts! Player wins. "); } else if (playerSum > dealerSum) { printf("Player wins with a score of %d to the dealer's %d. ", playerSum, dealerSum); } else if (playerSum < dealerSum) { printf("Dealer wins with a score of %d to the player's %d. ", dealerSum, playerSum); } else { printf("It's a tie! Both have a score of %d. ", playerSum); } return 0; }
1、初始化牌组:我们定义了一个包含52张牌的数组deck
,每张牌都有一个值,我们使用shuffleDeck
函数来随机打乱这些牌的顺序。
2、获取牌的值:getCardValue
函数用于根据牌的编号返回其对应的值,2到9的牌返回其面值,而10、J、Q、K和A分别返回10和11(这里假设A默认为11)。
3、发牌:在main
函数中,我们首先给玩家和庄家各发两张牌,并计算他们的初始点数总和,玩家有机会选择是否继续要牌(即“hit”),直到他们决定停止或爆牌(点数超过21),庄家也会根据规则继续要牌,直到其点数总和达到或超过17。
4、判断胜负:我们比较玩家和庄家的点数总和来确定胜者,如果玩家爆牌,则庄家获胜;如果庄家爆牌,则玩家获胜;如果两者都没有爆牌,则点数高者获胜;如果点数相同,则为平局。