#define MAX_PLAYER_CARDS_DISPLAY 4\r
#define BOARD_DISPLAY_START 4\r
\r
-uint8_t score_player = 0;\r
-uint8_t score_dealer = 0;\r
-uint8_t hand_player[BLACKJACK_MAX_HAND_SIZE] = {0xFF};\r
-uint8_t hand_dealer[BLACKJACK_MAX_HAND_SIZE] = {0xFF};\r
-uint8_t idx_player = 0;\r
-uint8_t idx_dealer = 0;\r
+typedef struct {\r
+ uint8_t score;\r
+ uint8_t idx_hand;\r
+ uint8_t hand[BLACKJACK_MAX_HAND_SIZE];\r
+} hand_info_t;\r
\r
typedef enum {\r
BJ_TITLE_SCREEN,\r
static game_state_t game_state;\r
static uint8_t deck[DECK_SIZE] = {0};\r
static uint8_t current_card = 0;\r
+hand_info_t player;\r
+hand_info_t dealer;\r
\r
static uint8_t generate_random_number(uint8_t num_values) {\r
// Emulator: use rand. Hardware: use arc4random.\r
}\r
\r
static void reset_hands(void) {\r
- score_player = 0;\r
- score_dealer = 0;\r
- idx_player = 0;\r
- idx_dealer = 0;\r
- memset(hand_player, 0xFF, sizeof(hand_player));\r
- memset(hand_dealer, 0xFF, sizeof(hand_dealer));\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
- hand_player[idx_player++] = card;\r
- score_player += 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
- hand_dealer[idx_dealer++] = card;\r
- score_dealer += card;\r
+ dealer.hand[dealer.idx_hand++] = card;\r
+ dealer.score += card;\r
}\r
\r
static void display_player_hand(void) { \r
- uint8_t cards_to_display = idx_player > MAX_PLAYER_CARDS_DISPLAY ? MAX_PLAYER_CARDS_DISPLAY : idx_player;\r
+ uint8_t cards_to_display = player.idx_hand > MAX_PLAYER_CARDS_DISPLAY ? MAX_PLAYER_CARDS_DISPLAY : player.idx_hand;\r
for (uint8_t i=cards_to_display; i>0; i--) {\r
- uint8_t card = hand_player[idx_player-i];\r
+ uint8_t card = player.hand[player.idx_hand-i];\r
if (card == 10) card = 0;\r
const char display_char = card + '0';\r
watch_display_character(display_char, BOARD_DISPLAY_START + cards_to_display - i);\r
}\r
\r
static void display_dealer_hand(void) {\r
- uint8_t card = hand_dealer[idx_dealer - 1];\r
+ uint8_t card = dealer.hand[dealer.idx_hand - 1];\r
if (card == 10) card = 0;\r
const char display_char = card + '0';\r
watch_display_character(display_char, 0);\r
\r
static void display_player_score(void) {\r
char buf[4];\r
- sprintf(buf, "%2d", score_player);\r
+ sprintf(buf, "%2d", player.score);\r
watch_display_text(WATCH_POSITION_SECONDS, buf);\r
}\r
\r
static void display_dealer_score(void) {\r
char buf[4];\r
- sprintf(buf, "%2d", score_dealer);\r
+ sprintf(buf, "%2d", dealer.score);\r
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);\r
}\r
\r
}\r
\r
static void perform_hit(void) {\r
- if (score_player == 21) {\r
+ if (player.score == 21) {\r
return; // Assume hitting on 21 is a mistake and ignore\r
}\r
give_player_card();\r
- if (score_player > 21) {\r
+ if (player.score > 21) {\r
display_bust();\r
} else {\r
display_player_hand();\r
static void dealer_performs_hits(void) {\r
give_dealer_card();\r
display_dealer_hand();\r
- if (score_dealer > 21) {\r
+ if (dealer.score > 21) {\r
display_win();\r
- } else if (score_dealer > score_player) {\r
+ } else if (dealer.score > player.score) {\r
display_lose();\r
} else {\r
display_dealer_hand();\r
}\r
\r
static void see_if_dealer_hits(void) {\r
- if (score_dealer > 16) {\r
- if (score_dealer > score_player) {\r
+ if (dealer.score > 16) {\r
+ if (dealer.score > player.score) {\r
display_lose();\r
- } else if (score_dealer < score_player) {\r
+ } else if (dealer.score < player.score) {\r
display_win();\r
} else {\r
display_tie();\r