]> git.earman.xyz Git - sensor-watch.git/commitdiff
Added ability to skip already guessed letters that are wrong
authorDavid Volovskiy <devolov@gmail.com>
Sun, 25 Aug 2024 13:51:08 +0000 (09:51 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Tue, 3 Sep 2024 20:11:54 +0000 (16:11 -0400)
movement/watch_faces/complication/wordle_face.c
movement/watch_faces/complication/wordle_face.h

index f44e4a66615895b44a1cd9e97dd4c57a72c0c416..77cd23d38acbaf7a1c6c39e5028db80fc68b74e5 100644 (file)
@@ -62,14 +62,18 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_
     return curr_pos;
 }
 
-static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) {
-    if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0;
-    else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters;
+static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) {
+    do {
+        if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0;
+        else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters;
+    } while (known_wrong_letters[word_elements[curr_pos]]);  
 }
 
-static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) {
-    if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1;
-    else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters;
+static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) {
+    do {
+        if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1;
+        else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters;
+    } while (known_wrong_letters[word_elements[curr_pos]]);  
 }
 
 static void display_letter(wordle_state_t *state, bool display_dash) {
@@ -130,8 +134,6 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) {
     }
     return _num_words + _num_possible_words;
 }
-
-
 #endif
 
 static bool check_word(wordle_state_t *state) {
@@ -164,6 +166,18 @@ static bool check_word(wordle_state_t *state) {
     return false;
 }
 
+static void update_known_wrong_letters(wordle_state_t *state) {
+
+    for (size_t i = 0; i < WORDLE_LENGTH; i++) {
+        if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) {
+            for (size_t j = 0; j < _num_valid_letters; j++) {
+                if (state->word_elements[i] == j)
+                    state->known_wrong_letters[j] = true;
+            }
+        }
+    }
+}
+
 static void display_attempt(uint8_t attempt) {
     char buf[3];
     sprintf(buf, "%d", attempt+1);
@@ -181,6 +195,9 @@ static void reset_all_elements(wordle_state_t *state) {
         state->word_elements[i] = _num_valid_letters;
         state->word_elements_result[i] = WORDLE_LETTER_WRONG;
     }
+    for (size_t i = 0; i < _num_valid_letters; i++){
+        state->known_wrong_letters[i] = false;
+    }
 #if !ALLOW_NON_WORD_AND_REPEAT_GUESSES
     for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) {
         state->guessed_words[i] = _num_words + _num_possible_words;
@@ -414,6 +431,7 @@ static void get_result(wordle_state_t *state) {
         state->streak = 0;
         return;
     }
+    update_known_wrong_letters(state);
     state->curr_screen = SCREEN_RESULT;
     return;
 }
@@ -496,12 +514,12 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi
             break;
         case EVENT_LIGHT_BUTTON_UP:
             if (act_on_btn(state, BTN_LIGHT)) break;
-            get_next_letter(state->position, state->word_elements);
+            get_next_letter(state->position, state->word_elements, state->known_wrong_letters);
             display_letter(state, true);
             break;
         case EVENT_LIGHT_LONG_PRESS:
             if (state->curr_screen != SCREEN_PLAYING) break;
-            get_prev_letter(state->position, state->word_elements);
+            get_prev_letter(state->position, state->word_elements, state->known_wrong_letters);
             display_letter(state, true);
             break; 
         case EVENT_ALARM_BUTTON_UP:
index 52fd71f66fa71f335f394fc5a36344dcf028b541..a7b34dc0b1e072d5e03a8acf8ef59d526c148aab 100644 (file)
@@ -114,6 +114,7 @@ typedef struct {
     bool continuing : 1;
     uint8_t streak;
     WordleScreen curr_screen;
+    bool known_wrong_letters[_num_valid_letters];
 #if USE_DAILY_STREAK
     uint32_t prev_day;
     uint32_t curr_day;