From a4cf115bd69de8a44aa12cb1c8bb2f12cf24b708 Mon Sep 17 00:00:00 2001 From: Mitchell M Date: Sat, 28 Dec 2024 17:18:02 -0600 Subject: [PATCH] Update Wires and Tetris time --- main/drivers/sd.cpp | 2 +- main/steps/step4.cpp | 2 +- main/steps/wires_puzzle.cpp | 106 +++++++++++++++++++++++++++--------- 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/main/drivers/sd.cpp b/main/drivers/sd.cpp index 806c885..a67ac18 100644 --- a/main/drivers/sd.cpp +++ b/main/drivers/sd.cpp @@ -12,7 +12,7 @@ void init_sd() { // If format_if_mount_failed is set to true, SD card will be partitioned and // formatted in case when mounting fails. esp_vfs_fat_sdmmc_mount_config_t mount_config = { - .format_if_mount_failed = false, + .format_if_mount_failed = true, .max_files = 5, .allocation_unit_size = 16 * 1024, .disk_status_check_enable = false, diff --git a/main/steps/step4.cpp b/main/steps/step4.cpp index 42d965d..d548012 100644 --- a/main/steps/step4.cpp +++ b/main/steps/step4.cpp @@ -342,7 +342,7 @@ void step4(void) { complete(); while (!play_game(4*60*1000, 4)) fail(); complete(); - while (!play_game(6*60*1000, 8)) fail(); + while (!play_game(7*60*1000, 8)) fail(); complete(); // vTaskDelay(pdMS_TO_TICKS(3000)); diff --git a/main/steps/wires_puzzle.cpp b/main/steps/wires_puzzle.cpp index 5d6815d..ad36b73 100644 --- a/main/steps/wires_puzzle.cpp +++ b/main/steps/wires_puzzle.cpp @@ -122,6 +122,8 @@ void generate_new_wires(WireColor* wires) { } void solve_wires(WireColor* wires, bool* out_cut) { + bool debug = false; + // by default, don't cut any wires for (int i = 0; i < NUM_WIRES; i++) { out_cut[i] = false; @@ -183,7 +185,9 @@ void solve_wires(WireColor* wires, bool* out_cut) { if (list_pos_len[i] == max_len) { int idx = list_pos[i][1]; out_cut[idx] = true; - // ESP_LOGI(TAG, "1. cutting %d", idx); + if (debug) { + printf("C1. cutting %d\n", idx); + } } } } @@ -191,14 +195,18 @@ void solve_wires(WireColor* wires, bool* out_cut) { // 2. cut the first wire if it is green or white if (wires[0] == WireColor::green || wires[0] == WireColor::white) { out_cut[0] = true; - // ESP_LOGI(TAG, "2. cutting %d", 0); + if (debug) { + printf("C2. cutting %d\n", 0); + } } // 3. cut blue wires in even positions (odd indexes) for (int i = 1; i < NUM_WIRES; i += 2) { if (wires[i] == WireColor::blue) { out_cut[i] = true; - // ESP_LOGI(TAG, "3. cutting %d", i); + if (debug) { + printf("C3. cutting %d\n", i); + } } } @@ -210,7 +218,9 @@ void solve_wires(WireColor* wires, bool* out_cut) { ) { out_cut[i] = true; out_cut[i+1] = true; - // ESP_LOGI(TAG, "4. cutting %d, %d", i, i+1); + if (debug) { + printf("C4. cutting %d, %d\n", i, i+1); + } } } @@ -224,7 +234,9 @@ void solve_wires(WireColor* wires, bool* out_cut) { wires[pos+1] == WireColor::white ) { out_cut[pos] = true; - // ESP_LOGI(TAG, "5. cutting %d", pos); + if (debug) { + printf("C5. cutting %d\n", pos); + } break; } } @@ -233,14 +245,18 @@ void solve_wires(WireColor* wires, bool* out_cut) { if (wires[4] == WireColor::red) { for (int white_idx = 0; white_idx < white_pos_len; white_idx++) { out_cut[white_pos[white_idx]] = true; - // ESP_LOGI(TAG, "6. cutting %d", white_pos[white_idx]); + if (debug) { + printf("C6. cutting %d\n", white_pos[white_idx]); + } } } // 7. cut the first black wire if there are more white wires than green wires if (white_pos_len > green_pos_len && black_pos_len > 0) { out_cut[black_pos[0]] = true; - // ESP_LOGI(TAG, "7. cutting %d", black_pos[0]); + if (debug) { + printf("C7. cutting %d\n", black_pos[0]); + } } // 8. cut all wires in an alternating pattern of 2 colors at least 4 wires long @@ -254,7 +270,9 @@ void solve_wires(WireColor* wires, bool* out_cut) { out_cut[i+1] = true; out_cut[i+2] = true; out_cut[i+3] = true; - // ESP_LOGI(TAG, "8. cutting %d, %d, %d, %d", i, i+1, i+2, i+3); + if (debug) { + printf("C8. cutting %d, %d, %d, %d\n", i, i+1, i+2, i+3); + } } } @@ -262,7 +280,9 @@ void solve_wires(WireColor* wires, bool* out_cut) { for (int i = 0; i < NUM_WIRES; i++) { if (color_name_len[wires[i]] == i+1) { out_cut[i] = true; - // ESP_LOGI(TAG, "9. cutting %d", i); + if (debug) { + printf("C9. cutting %d\n", i); + } } } @@ -270,30 +290,36 @@ void solve_wires(WireColor* wires, bool* out_cut) { if (max_len <= 2) { for (int i = 0; i < red_pos_len; i++) { out_cut[red_pos[i]] = true; - // ESP_LOGI(TAG, "10. cutting %d", red_pos[i]); + if (debug) { + printf("C10. cutting %d\n", red_pos[i]); + } } } // 11. cut the last wire if it is the same color as the first wire if (wires[0] == wires[NUM_WIRES-1]) { out_cut[NUM_WIRES-1] = true; - // ESP_LOGI(TAG, "11. cutting %d", NUM_WIRES-1); + if (debug) { + printf("C11. cutting %d\n", NUM_WIRES-1); + } } // 12. cut any wire adjacent to both a yellow and blue wire for (int i = 0; i < NUM_WIRES-2; i++) { if ( (wires[i] == WireColor::yellow && wires[i+2] == WireColor::blue) || - (wires[i] == WireColor::blue && wires[i+2] == WireColor::white) + (wires[i] == WireColor::blue && wires[i+2] == WireColor::yellow) ) { out_cut[i+1] = true; - // ESP_LOGI(TAG, "12. cutting %d", i+1); + if (debug) { + printf("C12. cutting %d\n", i+1); + } } } // NEVER CUT - // never cut blue wires next to red or green wires + // 1. never cut blue wires next to red or green wires for (int i = 0; i < blue_pos_len; i++) { int pos = blue_pos[i]; if ( @@ -303,50 +329,80 @@ void solve_wires(WireColor* wires, bool* out_cut) { wires[pos+1] == WireColor::green ) { out_cut[pos] = false; + if (debug) { + printf("N1. Never cutting %d\n", pos); + } } } - // never cut white wires if there is at least one red, black and green wire + // 2. never cut white wires if there is at least one red, black and green wire if (red_pos_len > 0 && green_pos_len > 0 && black_pos_len > 0) { for (int i = 0; i < white_pos_len; i++) { out_cut[white_pos[i]] = false; + if (debug) { + printf("N2. Never cutting %d\n", white_pos[i]); + } } } - // never cut red or black wires in the 4th or 7th positions + // 3. never cut red or black wires in the 4th or 7th positions if (wires[3] == WireColor::red || wires[3] == WireColor::black) { out_cut[3] = false; + if (debug) { + printf("N3. Never cutting %d\n", 3); + } } if (wires[6] == WireColor::red || wires[6] == WireColor::black) { out_cut[6] = false; - } - - // never cut wires that have the same color on both sides of it - for (int i = 0; i < NUM_WIRES-2; i++) { - if (wires[i] == wires[i+2]) { - out_cut[i+1] = false; + if (debug) { + printf("N3. Never cutting %d\n", 6); } } - // never cut a wire in the 1st, 2nd, or 3rd position if it is the same color as the wire in the 4th position. + // 4. never cut wires that have the same color on both sides of it + for (int i = 0; i < NUM_WIRES-2; i++) { + if (wires[i] == wires[i+2]) { + out_cut[i+1] = false; + if (debug) { + printf("N4. Never cutting %d\n", i+1); + } + } + } + + // 5. never cut a wire in the 1st, 2nd, or 3rd position if it is the same color as the wire in the 4th position. if (wires[0] == wires[3]) { out_cut[0] = false; + if (debug) { + printf("N5. Never cutting %d\n", 0); + } } if (wires[1] == wires[3]) { out_cut[1] = false; + if (debug) { + printf("N5. Never cutting %d\n", 1); + } } if (wires[2] == wires[3]) { out_cut[2] = false; + if (debug) { + printf("N5. Never cutting %d\n", 2); + } } - // never cut a blue or green wire in the 8th postion + // 6. never cut a blue or green wire in the 8th postion if (wires[7] == WireColor::blue || wires[7] == WireColor::green) { out_cut[7] = false; + if (debug) { + printf("N6. Never cutting %d\n", 7); + } } - // never cut a wire in the 5th position if there are no yellow wires + // 7. never cut a wire in the 5th position if there are no yellow wires if (yellow_pos_len == 0) { out_cut[4] = false; + if (debug) { + printf("N7 Never cutting %d\n", 4); + } } }