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