]> git.earman.xyz Git - sensor-watch.git/commitdiff
Added logic for supporting Ace
authorDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 11:07:51 +0000 (07:07 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 11:07:51 +0000 (07:07 -0400)
watch-faces/complication/blackjack_face.c

index c403579ac6b54d8eeba2c4eb3d837092f0744c86..beb14446aefd82bc629f3d7bf9b43dd7016651e1 100755 (executable)
 #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
@@ -49,6 +50,7 @@
 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
@@ -101,30 +103,45 @@ static void reset_deck(void) {
     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
@@ -193,11 +210,11 @@ static void begin_playing(void) {
     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
@@ -206,7 +223,7 @@ static void perform_hit(void) {
     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
@@ -222,7 +239,7 @@ static void perform_stand(void) {
 }\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