#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
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
#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
// 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
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