BJ_DEALER_PLAYING,\r
BJ_BUST,\r
BJ_RESULT,\r
+ BJ_WIN_RATIO,\r
} game_state_t;\r
\r
typedef enum {\r
static game_state_t game_state;\r
static uint8_t deck[DECK_SIZE] = {0};\r
static uint8_t current_card = 0;\r
+static bool add_to_games_played = false;\r
+static bool add_to_games_won = false;\r
hand_info_t player;\r
hand_info_t dealer;\r
\r
}\r
\r
static void display_player_hand(void) { \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 = player.hand[player.idx_hand-i];\r
- display_card_at_position(card, BOARD_DISPLAY_START + cards_to_display - i);\r
+ uint8_t card;\r
+ if (player.idx_hand <= MAX_PLAYER_CARDS_DISPLAY) {\r
+ card = player.hand[player.idx_hand - 1];\r
+ display_card_at_position(card, BOARD_DISPLAY_START + player.idx_hand - 1);\r
+ } else {\r
+ for (uint8_t i=0; i<MAX_PLAYER_CARDS_DISPLAY; i++) {\r
+ card = player.hand[player.idx_hand - MAX_PLAYER_CARDS_DISPLAY + i];\r
+ display_card_at_position(card, BOARD_DISPLAY_START + i);\r
+ }\r
}\r
}\r
\r
\r
static void display_win(void) {\r
game_state = BJ_RESULT;\r
+ add_to_games_played = true;\r
+ add_to_games_won = true;\r
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "WlN ", " WIN");\r
display_score(player.score, WATCH_POSITION_SECONDS);\r
display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
\r
static void display_lose(void) {\r
game_state = BJ_RESULT;\r
+ add_to_games_played = true;\r
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "LOSE", "lOSE");\r
display_score(player.score, WATCH_POSITION_SECONDS);\r
display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
\r
static void display_tie(void) {\r
game_state = BJ_RESULT;\r
+ // Don't record ties to the win ratio\r
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "TlE ", " TIE");\r
display_score(player.score, WATCH_POSITION_SECONDS);\r
}\r
\r
static void display_bust(void) {\r
game_state = BJ_RESULT;\r
+ add_to_games_played = true;\r
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "8UST ", " BUST");\r
}\r
\r
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, " JACK ", "BLaKJK");\r
}\r
\r
+static void display_win_ratio(blackjack_face_state_t *state) {\r
+ char buf[7];\r
+ game_state = BJ_WIN_RATIO;\r
+ uint8_t win_ratio = 0;\r
+ if (state->games_played > 0) { // Avoid dividing by zero\r
+ win_ratio = (uint8_t)(100 * state->games_won) / state->games_played;\r
+ }\r
+ watch_display_text_with_fallback(WATCH_POSITION_TOP, "WINS ", "WR ");\r
+ sprintf(buf, "%3dPct", win_ratio);\r
+ watch_display_text(WATCH_POSITION_BOTTOM, buf);\r
+}\r
+\r
static void begin_playing(bool tap_control_on) {\r
watch_clear_display();\r
if (tap_control_on) {\r
reset_hands();\r
// Give player their first 2 cards\r
give_card(&player);\r
+ display_player_hand();\r
give_card(&player);\r
display_player_hand();\r
display_score(player.score, WATCH_POSITION_SECONDS);\r
}\r
}\r
\r
+static void add_to_game_scores(blackjack_face_state_t *state) {\r
+ if (add_to_games_played) {\r
+ add_to_games_played = false;\r
+ state->games_played++;\r
+ if (state->games_played == 0) {\r
+ // Overflow\r
+ state->games_won = 0;\r
+ }\r
+ }\r
+ if (add_to_games_won) {\r
+ add_to_games_won = false;\r
+ state->games_won++;\r
+ if (state->games_won == 0) {\r
+ // Overflow\r
+ state->games_played = 0;\r
+ }\r
+ }\r
+}\r
+\r
static void handle_button_presses(bool tap_control_on, bool hit) {\r
switch (game_state)\r
{\r
display_bust();\r
break;\r
case BJ_RESULT:\r
+ case BJ_WIN_RATIO:\r
display_title();\r
break;\r
}\r
\r
bool blackjack_face_loop(movement_event_t event, void *context) {\r
blackjack_face_state_t *state = (blackjack_face_state_t *) context;\r
+ if (game_state == BJ_RESULT) {\r
+ add_to_game_scores(state);\r
+ }\r
switch (event.event_type) {\r
case EVENT_ACTIVATE:\r
if (state->tap_control_on) {\r
case EVENT_SINGLE_TAP:\r
handle_button_presses(state->tap_control_on, true);\r
break;\r
+ case EVENT_LIGHT_LONG_PRESS:\r
+ if (game_state == BJ_TITLE_SCREEN) {\r
+ display_win_ratio(state);\r
+ }\r
+ break;\r
case EVENT_ALARM_LONG_PRESS:\r
if (game_state == BJ_TITLE_SCREEN) {\r
toggle_tap_control(state);\r