Added logic for supporting Ace

This commit is contained in:
David Volovskiy 2025-09-03 07:07:51 -04:00
parent b66e10406e
commit 1d40c384cb

View File

@ -32,12 +32,13 @@
#include "blackjack_face.h" #include "blackjack_face.h"
#include "watch_common_display.h" #include "watch_common_display.h"
#define ACE 13
#define KING 12 #define KING 12
#define QUEEN 11 #define QUEEN 11
#define JACK 10 #define JACK 10
#define MIN_CARD_VALUE 1 #define MIN_CARD_VALUE 2
#define MAX_CARD_VALUE KING #define MAX_CARD_VALUE ACE
#define CARD_RANK_COUNT (MAX_CARD_VALUE - MIN_CARD_VALUE + 1) #define CARD_RANK_COUNT (MAX_CARD_VALUE - MIN_CARD_VALUE + 1)
#define CARD_SUIT_COUNT 4 #define CARD_SUIT_COUNT 4
#define DECK_SIZE (CARD_SUIT_COUNT * CARD_RANK_COUNT) #define DECK_SIZE (CARD_SUIT_COUNT * CARD_RANK_COUNT)
@ -49,6 +50,7 @@
typedef struct { typedef struct {
uint8_t score; uint8_t score;
uint8_t idx_hand; uint8_t idx_hand;
int8_t high_aces_in_hand;
uint8_t hand[BLACKJACK_MAX_HAND_SIZE]; uint8_t hand[BLACKJACK_MAX_HAND_SIZE];
} hand_info_t; } hand_info_t;
@ -101,30 +103,45 @@ static void reset_deck(void) {
shuffle_deck(); shuffle_deck();
} }
static uint8_t get_next_card(void) { static uint8_t get_next_card(hand_info_t *hand_info) {
if (current_card >= DECK_SIZE) if (current_card >= DECK_SIZE)
reset_deck(); reset_deck();
uint8_t card = deck[current_card++]; uint8_t card = deck[current_card++];
if (card > 10) return 10; switch (card)
{
case ACE:
card = 11;
hand_info->high_aces_in_hand++;
break;
case KING:
case QUEEN:
case JACK:
card = 10;
default:
break;
}
return card; return card;
} }
static void modify_score_from_aces(hand_info_t *hand_info) {
while (hand_info->score > 21 && hand_info->high_aces_in_hand > 0) {
hand_info->score -= 10;
hand_info->high_aces_in_hand--;
}
}
static void reset_hands(void) { static void reset_hands(void) {
memset(&player, 0, sizeof(player)); memset(&player, 0, sizeof(player));
memset(&dealer, 0, sizeof(dealer)); memset(&dealer, 0, sizeof(dealer));
reset_deck(); reset_deck();
} }
static void give_player_card(void) { static void give_card(hand_info_t *hand_info) {
uint8_t card = get_next_card(); uint8_t card = get_next_card(hand_info);
player.hand[player.idx_hand++] = card; hand_info->hand[hand_info->idx_hand++] = card;
player.score += card; hand_info->score += card;
} modify_score_from_aces(hand_info);
static void give_dealer_card(void) {
uint8_t card = get_next_card();
dealer.hand[dealer.idx_hand++] = card;
dealer.score += card;
} }
static void display_player_hand(void) { static void display_player_hand(void) {
@ -193,11 +210,11 @@ static void begin_playing(void) {
game_state = BJ_PLAYING; game_state = BJ_PLAYING;
reset_hands(); reset_hands();
// Give player their first 2 cards // Give player their first 2 cards
give_player_card(); give_card(&player);
give_player_card(); give_card(&player);
display_player_hand(); display_player_hand();
display_player_score(); display_player_score();
give_dealer_card(); give_card(&dealer);
display_dealer_hand(); display_dealer_hand();
display_dealer_score(); display_dealer_score();
} }
@ -206,7 +223,7 @@ static void perform_hit(void) {
if (player.score == 21) { if (player.score == 21) {
return; // Assume hitting on 21 is a mistake and ignore return; // Assume hitting on 21 is a mistake and ignore
} }
give_player_card(); give_card(&player);
if (player.score > 21) { if (player.score > 21) {
display_bust(); display_bust();
} else { } else {
@ -222,7 +239,7 @@ static void perform_stand(void) {
} }
static void dealer_performs_hits(void) { static void dealer_performs_hits(void) {
give_dealer_card(); give_card(&dealer);
display_dealer_hand(); display_dealer_hand();
if (dealer.score > 21) { if (dealer.score > 21) {
display_win(); display_win();