#define GAME_BOARD_SIZE 6\r
#define MAX_BOARDS 40\r
#define GUESSES_PER_SCREEN 5\r
-#define WIN_SCORE MAX_BOARDS * GUESSES_PER_SCREEN\r
+#define WIN_SCORE (MAX_BOARDS * GUESSES_PER_SCREEN)\r
#define STATUS_DISPLAY_START 0\r
#define BOARD_SCORE_DISPLAY_START 2\r
#define BOARD_DISPLAY_START 4\r
#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 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
#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
+static uint8_t deck[DECK_SIZE] = {0};\r
+static uint8_t current_card = 0;\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
+static void stack_deck(void) {\r
+ for (size_t i = 0; i < CARD_RANK_COUNT; i++) {\r
+ for (size_t j = 0; j < CARD_SUIT_COUNT; j++)\r
+ deck[(i * CARD_SUIT_COUNT) + j] = MIN_CARD_VALUE + i;\r
}\r
}\r
\r
-static void shuffle_deck(uint8_t *array, uint8_t n) {\r
+static void shuffle_deck(void) {\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
+ size_t i;\r
+ size_t j;\r
+ uint8_t tmp;\r
+\r
+ for (i = DECK_SIZE - 1; i > 0; i--) {\r
+ j = generate_random_number(0xFF) % (i + 1);\r
+ tmp = deck[j];\r
+ deck[j] = deck[i];\r
+ deck[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
+ current_card = 0;\r
+ stack_deck();\r
+ shuffle_deck();\r
}\r
\r
static uint8_t get_next_card(void) {\r
- if (_curr_card >= DECK_COUNT) reset_deck();\r
- return _deck[_curr_card++];\r
+ if (current_card >= DECK_SIZE)\r
+ reset_deck();\r
+ return deck[current_card++];\r
}\r
\r
static void reset_board(bool first_round) {\r
\r
static void render_board_position(size_t board_position) {\r
const size_t display_position = FLIP_BOARD_DIRECTION\r
- ? BOARD_DISPLAY_START + board_position\r
- : BOARD_DISPLAY_END - board_position;\r
+ ? BOARD_DISPLAY_START + board_position\r
+ : BOARD_DISPLAY_END - board_position;\r
const bool revealed = game_board[board_position].revealed;\r
\r
//// Current position indicator spot\r
}\r
}\r
\r
-static void render_board() {\r
+static void render_board(void) {\r
for (size_t i = 0; i < GAME_BOARD_SIZE; ++i) {\r
render_board_position(i);\r
}\r
watch_display_string(buf, BOARD_DISPLAY_START);\r
}\r
\r
-static guess_t get_answer() {\r
+static guess_t get_answer(void) {\r
if (guess_position < 1 || guess_position > GAME_BOARD_SIZE)\r
return HL_GUESS_EQUAL; // Maybe add an error state, shouldn't ever hit this.\r
\r