]> git.earman.xyz Git - sensor-watch.git/commitdiff
Made cards go through a deck format.
authorDavid Volovskiy <devolov@gmail.com>
Fri, 9 Aug 2024 02:45:07 +0000 (22:45 -0400)
committerMatheus Afonso Martins Moreira <matheus@matheusmoreira.com>
Sat, 7 Sep 2024 22:59:04 +0000 (19:59 -0300)
movement/watch_faces/complication/higher_lower_game_face.c

index cf5205cdfcd8c106ea9368d62cbc730145a617f8..bbf456bf8e1df3eab9ef92bbb4badea21ddfb81e 100755 (executable)
@@ -43,6 +43,8 @@
 #define BOARD_DISPLAY_END 9\r
 #define MIN_CARD_VALUE 2\r
 #define MAX_CARD_VALUE 14\r
+#define DUPLICATES_OF_CARD 4\r
+#define DECK_COUNT (DUPLICATES_OF_CARD * (MAX_CARD_VALUE - MIN_CARD_VALUE + 1))\r
 #define FLIP_BOARD_DIRECTION false\r
 \r
 typedef struct card_t {\r
@@ -73,6 +75,8 @@ static card_t game_board[GAME_BOARD_SIZE] = {0};
 static uint8_t guess_position = 0;\r
 static uint8_t score = 0;\r
 static uint8_t completed_board_count = 0;\r
+static uint8_t _deck[DECK_COUNT];\r
+static uint8_t _curr_card;\r
 \r
 static uint8_t generate_random_number(uint8_t num_values) {\r
     // Emulator: use rand. Hardware: use arc4random.\r
@@ -83,10 +87,41 @@ static uint8_t generate_random_number(uint8_t num_values) {
 #endif\r
 }\r
 \r
+static void stack_deck(uint8_t *array) {\r
+    const uint8_t unique_cards = MAX_CARD_VALUE - MIN_CARD_VALUE + 1;\r
+    for (uint8_t i = 0; i < unique_cards; i++)\r
+    {\r
+        for (uint8_t j = 0; j < DUPLICATES_OF_CARD; j++) \r
+            array[(i * DUPLICATES_OF_CARD) + j] = MIN_CARD_VALUE + i;\r
+    }\r
+}\r
+\r
+static void shuffle_deck(uint8_t *array, uint8_t n) {\r
+    // Randomize shuffle with Fisher Yates\r
+    uint8_t i, j, tmp;\r
+     for (i = n - 1; i > 0; i--) {\r
+         j = generate_random_number(0xFF) % (i + 1);\r
+         tmp = array[j];\r
+         array[j] = array[i];\r
+         array[i] = tmp;\r
+     }\r
+}\r
+\r
+static void reset_deck(void) {\r
+    _curr_card = 0;\r
+    stack_deck(_deck);\r
+    shuffle_deck(_deck, DECK_COUNT);\r
+}\r
+\r
+static uint8_t get_next_card(void) {\r
+    if (_curr_card >= DECK_COUNT) reset_deck();\r
+    return _deck[_curr_card++];\r
+}\r
+\r
 static void reset_board(bool first_round) {\r
     // First card is random on the first board, and carried over from the last position on subsequent boards\r
     const uint8_t first_card_value = first_round\r
-                                     ? generate_random_number(MAX_CARD_VALUE - MIN_CARD_VALUE + 1) + MIN_CARD_VALUE\r
+                                     ? get_next_card()\r
                                      : game_board[GAME_BOARD_SIZE - 1].value;\r
 \r
     game_board[0].value = first_card_value;\r
@@ -95,7 +130,7 @@ static void reset_board(bool first_round) {
     // Fill remainder of board\r
     for (size_t i = 1; i < GAME_BOARD_SIZE; ++i) {\r
         game_board[i] = (card_t) {\r
-                .value = generate_random_number(MAX_CARD_VALUE - MIN_CARD_VALUE + 1) + MIN_CARD_VALUE,\r
+                .value = get_next_card(),\r
                 .revealed = false\r
         };\r
     }\r
@@ -105,6 +140,7 @@ static void init_game(void) {
     watch_clear_display();\r
     watch_display_string(TITLE_TEXT, BOARD_DISPLAY_START);\r
     watch_display_string("GA", STATUS_DISPLAY_START);\r
+    reset_deck();\r
     reset_board(true);\r
     score = 0;\r
     completed_board_count = 0;\r