From 3e2e69f1c394e3c499408540794558471dd30dfa Mon Sep 17 00:00:00 2001 From: Rory Healy Date: Fri, 22 Oct 2021 15:30:16 +1100 Subject: [PATCH] Optimisation, formatting changes --- README.md | 3 - report.md | 140 +++++++++++++++++++++++ sokoban | Bin 172552 -> 181800 bytes solution.txt | 1 - src/ai/ai.c | 59 +++++----- src/ai/ai.o | Bin 54416 -> 54944 bytes src/ai/utils.c | 281 ++++++++++++++++++++++++++++++++++++---------- src/ai/utils.h | 4 + src/ai/utils.o | Bin 37488 -> 47432 bytes src/loose_check.c | 8 +- src/loose_check.o | Bin 7240 -> 7240 bytes src/map_reading.c | 4 +- src/map_reading.o | Bin 21696 -> 21696 bytes 13 files changed, 403 insertions(+), 97 deletions(-) delete mode 100644 README.md create mode 100644 report.md delete mode 100644 solution.txt diff --git a/README.md b/README.md deleted file mode 100644 index a23b0c5..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deadlock and Optimizations - -Explain your optimizations if applicable \ No newline at end of file diff --git a/report.md b/report.md new file mode 100644 index 0000000..0f6dd9f --- /dev/null +++ b/report.md @@ -0,0 +1,140 @@ +# Deadlock and Optimizations + +## Deadlock detections +### Simple corner deadlock detection +The simple corner deadlock that was already implemented aims to prevent a box +from being pushed into a corner. If it is pushed into a corner, it is +inaccessible and immovable, thus rendering that state unsolvable. + +### Freeze deadlock detection +Described +[here](http://sokobano.de/wiki/index.php?title=Deadlocks#Freeze_deadlocks), +freeze detection is about preventing two boxes from being adjacent against a +wall when there is no goal in that location. This deadlock detection was chosen +as there are many scenarios (such as in test_maps/test_map2 and +test_maps/test_map3) where there are multiple boxes and a complex map layout. +This deadlock detection saves a small amount time and reduces the number of +nodes that are expanded. + +The code for this detection is contained in `utils.c`, from lines 321 - 480. +The function `freeze_deadlock()` is used to check if there is a box adjacent to +the player, and if there is, then the function `adjacent_box_check()` is called +to check for the freeze deadlock scenario. + +## Optimisation results +These results show the impact of implementing the freeze deadlock detection. + +Hardware used: +- CPU: AMD Ryzen 4800U +- GPU: AMD Radeon RX Vega 8 +- Memory: 16GB + +### Summary of optimisation +The following table summarises some of the key statistics prior to implementing +freeze deadlock detection, and after implementing freeze deadlock detection. + +Test: test_map1 + +| Statistic | Before implementation | After implementation | % improvement | +|----------------|-----------------------|----------------------|---------------| +| Expanded nodes | 13 | 13 | 0.00 | +| Time (s) | 0.050106 | 0.047723 | 4.76 | + + +Test: test_map2 + +| Statistic | Before implementation | After implementation | % improvement | +|----------------|-----------------------|----------------------|---------------| +| Expanded nodes | 978745 | 944140 | 3.54 | +| Time | 3.456764 | 3.227685 | 6.63 | + +Test: test_map3 + +| Statistic | Before implementation | After implementation | % improvement | +|----------------|-----------------------|----------------------|---------------| +| Expanded nodes | 230041 | 215253 | 6.43 | +| Time | 1.828733 | 1.680901 | 8.08 | + +### Full output (before optimisation) +``` +$ ./sokoban -s test_maps/test_map1 + +SOLUTION: +rrRRRR + +STATS: + Expanded nodes: 13 + Generated nodes: 48 + Duplicated nodes: 8 + Solution Length: 6 + Expanded/seconds: 259 + Time (seconds): 0.050106 + +$ ./sokoban -s test_maps/test_map2 + +SOLUTION: +rrrrrrdrdLLLLLLLLullluRRRRRRRururRRRRRRRRRR + +STATS: + Expanded nodes: 978745 + Generated nodes: 3914976 + Duplicated nodes: 2288345 + Solution Length: 43 + Expanded/seconds: 283139 + Time (seconds): 3.456764 + +$ ./sokoban -s test_maps/test_map3 + +SOLUTION: +drdrdrdrrruuuuuulllllddrdrdrDulululldRdRdrdRRllululuurdrdrDululldRuuluurrrrrdddddrddlUUUUUUruLLLLLulDDdrdddrdRRlluluurdrDulldruluulldRuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdddRRlluurDldRuulululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdrddRluulululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDD + +STATS: + Expanded nodes: 230041 + Generated nodes: 920160 + Duplicated nodes: 331571 + Solution Length: 292 + Expanded/seconds: 125792 + Time (seconds): 1.828733 +``` + +### Full output (after optimisation) +``` +$ ./sokoban -s test_maps/test_map1 + +SOLUTION: +rrRRRR + +STATS: + Expanded nodes: 13 + Generated nodes: 48 + Duplicated nodes: 8 + Solution Length: 6 + Expanded/seconds: 272 + Time (seconds): 0.047723 + +$ ./sokoban -s test_maps/test_map2 + +SOLUTION: +rrrrrrdrdLLLLLLLLullluRRRRRRRurruRRRRRRRRRR + +STATS: + Expanded nodes: 944140 + Generated nodes: 3776556 + Duplicated nodes: 2199712 + Solution Length: 43 + Expanded/seconds: 292513 + Time (seconds): 3.227685 + +$ ./sokoban -s test_maps/test_map3 + +SOLUTION: +drdrdrdrrruuuuuulllllddrdrdrDulululldRdRdrdRRllululuurdrdrDululldRuuluurrrrrdddddrddlUUUUUUruLLLLLulDDdrdddrdRRlluluurdrDulldruululldRuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdddRRlluurDldRluuululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdrddRluulululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDD + +STATS: + Expanded nodes: 215253 + Generated nodes: 861008 + Duplicated nodes: 309654 + Solution Length: 292 + Expanded/seconds: 128058 + Time (seconds): 1.680901 +``` diff --git a/sokoban b/sokoban index 74045adb81cb58285e9173c6de885c2a94d062f4..a128b8ad1662a765f9a478e5f7ffa766dd388abf 100755 GIT binary patch delta 46899 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�WJSq6{eI5*uxf(aZ_?vjLq{R`QHKE3gk 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˖jmK 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 + char *solution_string = malloc(sizeof(char) * solution_node->depth + 1); solution_string[n->depth] = '\0'; while (n->parent != NULL) { switch (n->move) { case up: if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'U'; + solution_string[n->depth - 1] = 'U'; else - solution_string[n->depth-1] = 'u'; + solution_string[n->depth - 1] = 'u'; break; case down: if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'D'; + solution_string[n->depth - 1] = 'D'; else - solution_string[n->depth-1] = 'd'; + solution_string[n->depth - 1] = 'd'; break; case left: if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'L'; + solution_string[n->depth - 1] = 'L'; else - solution_string[n->depth-1] = 'l'; + solution_string[n->depth - 1] = 'l'; break; case right: if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'R'; + solution_string[n->depth - 1] = 'R'; else - solution_string[n->depth-1] = 'r'; + solution_string[n->depth - 1] = 'r'; break; } @@ -73,7 +73,7 @@ void copy_state(sokoban_t *init_data, state_t *dst, state_t *src) { * Create the initial node */ node_t *create_init_node(sokoban_t *init_data) { - node_t *new_n = (node_t *) malloc(sizeof(node_t)); + node_t *new_n = malloc(sizeof(node_t)); new_n->parent = NULL; new_n->priority = 0; @@ -98,7 +98,7 @@ node_t *create_init_node(sokoban_t *init_data) { * Create the a node from a parent node */ node_t *create_node(sokoban_t *init_data, node_t *parent) { - node_t *new_n = (node_t *) malloc(sizeof(node_t)); + node_t *new_n = malloc(sizeof(*new_n)); new_n->parent = parent; new_n->depth = parent->depth + 1; copy_state(init_data, &(new_n->state), &(parent->state)); @@ -138,7 +138,7 @@ void update_explore_table(node_t *n, unsigned expanded_nodes) { sizeof(node_t*) * expanded_nodes_table_size); } - expanded_nodes_table[ expanded_nodes ] = n; + expanded_nodes_table[expanded_nodes] = n; } void free_memory(unsigned expanded_nodes, int lines) { @@ -189,7 +189,8 @@ void find_solution(sokoban_t *init_data, bool show_solution) { // Choose initial capacity of PRIME NUMBER // Specify the size of the keys and values you want to store once // The Hash Table only accept a 1D key and value. - ht_setup(&hashTable, sizeof(int8_t) * init_data->num_chars_map, sizeof(int8_t) * init_data->num_chars_map, 16769023); + ht_setup(&hashTable, sizeof(int8_t) * init_data->num_chars_map, \ + sizeof(int8_t) * init_data->num_chars_map, 16769023); // Data structure to create a 1D representation of the map // Needed to interact with the hash table @@ -200,8 +201,8 @@ void find_solution(sokoban_t *init_data, bool show_solution) { // Initialize expanded nodes table. // This table will be used to free your memory once a solution is found - expanded_nodes_table = (node_t **) malloc(sizeof(node_t *) * expanded_nodes_table_size); - + expanded_nodes_table = malloc(sizeof(*expanded_nodes_table) * \ + expanded_nodes_table_size); // Add the initial node node_t *n = create_init_node(init_data); @@ -221,13 +222,17 @@ void find_solution(sokoban_t *init_data, bool show_solution) { } for (move_t action = left; action <= down; action++) { - node_t *new = malloc(sizeof(*new)); + node_t *new; bool player_moved = applyAction(init_data, n, &new, action); generated_nodes += 1; - if (!player_moved || simple_corner_deadlock(init_data, &(new->state))) { + + if (!player_moved || freeze_deadlock(init_data, &(new->state)) || \ + simple_corner_deadlock(init_data, &(new->state))) { + for (int i = 0; i < init_data->lines; i++) { free(new->state.map[i]); } + free(new->state.map); free(new); continue; @@ -256,17 +261,8 @@ void find_solution(sokoban_t *init_data, bool show_solution) { free_memory(expanded_nodes, init_data->lines); free(flat_map); - // Free initial data - for (int i = 0; i < init_data->lines; i++) { - free((init_data->map)[i]); - free((init_data->map_save)[i]); - } - free(init_data->map); - free(init_data->map_save); - free(init_data->buffer); - // Free priority queue - for (int i = pq.count; i > 0; i--) { + for (int i = 0; i < pq.count; i++) { for (int j = 0; j < init_data->lines; j++) { if (pq.heaparr[i]->state.map[j]) { free(pq.heaparr[i]->state.map[j]); @@ -326,4 +322,13 @@ void solve(char const *path, bool show_solution) { sokoban = find_player(sokoban); find_solution(&sokoban, show_solution); + + // Free initial data + for (int i = 0; i < sokoban.lines; i++) { + free((sokoban.map)[i]); + free((sokoban.map_save)[i]); + } + free(sokoban.map); + free(sokoban.map_save); + free(sokoban.buffer); } diff --git a/src/ai/ai.o b/src/ai/ai.o index fda4a3f8d0b56b796e2068bb1d871bc696e0b811..4cb0547a3e659e042a276e3b03660e0eb865a8f8 100644 GIT binary patch literal 54944 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[state->player_y][state->player_x-2] == '$' || \ - state->map[state->player_y][state->player_x-2] == '*') { + if (state->map[state->player_y][state->player_x - 2] == '$' || \ + state->map[state->player_y][state->player_x - 2] == '*') { return false; - } else if (state->map[state->player_y][state->player_x-2] == '#') { + } else if (state->map[state->player_y][state->player_x - 2] == '#') { return false; } else { - state->map[state->player_y][state->player_x-1] = '@'; + state->map[state->player_y][state->player_x - 1] = '@'; - if (state->map[state->player_y][state->player_x-2] == '.') { - state->map[state->player_y][state->player_x-2] = '*'; + if (state->map[state->player_y][state->player_x - 2] == '.') { + state->map[state->player_y][state->player_x - 2] = '*'; } else { - state->map[state->player_y][state->player_x-2] = '$'; + state->map[state->player_y][state->player_x - 2] = '$'; } state->map[state->player_y][state->player_x] = ' '; @@ -51,19 +51,19 @@ bool push_box_left(sokoban_t *init_data, state_t *state) { } bool push_box_right(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y][state->player_x+2] == '$' || \ - state->map[state->player_y][state->player_x+2] == '*') { + if (state->map[state->player_y][state->player_x + 2] == '$' || \ + state->map[state->player_y][state->player_x + 2] == '*') { return false; - } else if (state->map[state->player_y][state->player_x+2] == '#') { + } else if (state->map[state->player_y][state->player_x + 2] == '#') { return false; } else { - state->map[state->player_y][state->player_x+1] = '@'; + state->map[state->player_y][state->player_x + 1] = '@'; - if (state->map[state->player_y][state->player_x+2] == '.') { - state->map[state->player_y][state->player_x+2] = '*'; + if (state->map[state->player_y][state->player_x + 2] == '.') { + state->map[state->player_y][state->player_x + 2] = '*'; } else { - state->map[state->player_y][state->player_x+2] = '$'; + state->map[state->player_y][state->player_x + 2] = '$'; } state->map[state->player_y][state->player_x] = ' '; @@ -81,19 +81,19 @@ bool push_box_right(sokoban_t *init_data, state_t *state) { } bool push_box_up(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y-2][state->player_x] == '$' || \ - state->map[state->player_y-2][state->player_x] == '*') { + if (state->map[state->player_y - 2][state->player_x] == '$' || \ + state->map[state->player_y - 2][state->player_x] == '*') { return false; - } else if (state->map[state->player_y-2][state->player_x] == '#') { + } else if (state->map[state->player_y - 2][state->player_x] == '#') { return false; } else { - state->map[state->player_y-1][state->player_x] = '@'; + state->map[state->player_y - 1][state->player_x] = '@'; - if (state->map[state->player_y-2][state->player_x] == '.') { - state->map[state->player_y-2][state->player_x] = '*'; + if (state->map[state->player_y - 2][state->player_x] == '.') { + state->map[state->player_y - 2][state->player_x] = '*'; } else { - state->map[state->player_y-2][state->player_x] = '$'; + state->map[state->player_y - 2][state->player_x] = '$'; } state->map[state->player_y][state->player_x] = ' '; @@ -111,19 +111,19 @@ bool push_box_up(sokoban_t *init_data, state_t *state) { } bool push_box_down(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y+2][state->player_x] == '$' || \ - state->map[state->player_y+2][state->player_x] == '*') { + if (state->map[state->player_y + 2][state->player_x] == '$' || \ + state->map[state->player_y + 2][state->player_x] == '*') { return false; - } else if (state->map[state->player_y+2][state->player_x] == '#') { + } else if (state->map[state->player_y + 2][state->player_x] == '#') { return false; } else { - state->map[state->player_y+1][state->player_x] = '@'; + state->map[state->player_y + 1][state->player_x] = '@'; - if (state->map[state->player_y+2][state->player_x] == '.') { - state->map[state->player_y+2][state->player_x] = '*'; + if (state->map[state->player_y + 2][state->player_x] == '.') { + state->map[state->player_y + 2][state->player_x] = '*'; } else { - state->map[state->player_y+2][state->player_x] = '$'; + state->map[state->player_y + 2][state->player_x] = '$'; } state->map[state->player_y][state->player_x] = ' '; @@ -145,13 +145,13 @@ bool push_box_down(sokoban_t *init_data, state_t *state) { ***************************************/ bool move_left_player(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y][state->player_x-1] != '#') { - if (state->map[state->player_y][state->player_x-1] == '$' || \ - state->map[state->player_y][state->player_x-1] == '*') { + if (state->map[state->player_y][state->player_x - 1] != '#') { + if (state->map[state->player_y][state->player_x - 1] == '$' || \ + state->map[state->player_y][state->player_x - 1] == '*') { return push_box_left(init_data, state); } else { - state->map[state->player_y][state->player_x-1] = '@'; + state->map[state->player_y][state->player_x - 1] = '@'; state->map[state->player_y][state->player_x] = ' '; if (is_goal_loc(state->player_y, state->player_x, init_data) && \ @@ -170,13 +170,13 @@ bool move_left_player(sokoban_t *init_data, state_t *state) { } bool move_right_player(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y][state->player_x+1] != '#') { - if (state->map[state->player_y][state->player_x+1] == '$' || \ - state->map[state->player_y][state->player_x+1] == '*') { + if (state->map[state->player_y][state->player_x + 1] != '#') { + if (state->map[state->player_y][state->player_x + 1] == '$' || \ + state->map[state->player_y][state->player_x + 1] == '*') { return push_box_right(init_data, state); } else { - state->map[state->player_y][state->player_x+1] = '@'; + state->map[state->player_y][state->player_x + 1] = '@'; state->map[state->player_y][state->player_x] = ' '; if (is_goal_loc(state->player_y, state->player_x, init_data) && \ @@ -195,13 +195,13 @@ bool move_right_player(sokoban_t *init_data, state_t *state) { } bool move_up_player(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y-1][state->player_x] != '#') { - if (state->map[state->player_y-1][state->player_x] == '$' || \ - state->map[state->player_y-1][state->player_x] == '*') { + if (state->map[state->player_y - 1][state->player_x] != '#') { + if (state->map[state->player_y - 1][state->player_x] == '$' || \ + state->map[state->player_y - 1][state->player_x] == '*') { return push_box_up(init_data, state); } else { - state->map[state->player_y-1][state->player_x] = '@'; + state->map[state->player_y - 1][state->player_x] = '@'; state->map[state->player_y][state->player_x] = ' '; if (is_goal_loc(state->player_y, state->player_x, init_data) && \ @@ -220,13 +220,13 @@ bool move_up_player(sokoban_t *init_data, state_t *state) { } bool move_down_player(sokoban_t *init_data, state_t *state) { - if (state->map[state->player_y+1][state->player_x] != '#') { - if (state->map[state->player_y+1][state->player_x] == '$' || \ - state->map[state->player_y+1][state->player_x] == '*') { + if (state->map[state->player_y + 1][state->player_x] != '#') { + if (state->map[state->player_y + 1][state->player_x] == '$' || \ + state->map[state->player_y + 1][state->player_x] == '*') { return push_box_down(init_data, state); } else { - state->map[state->player_y+1][state->player_x] = '@'; + state->map[state->player_y + 1][state->player_x] = '@'; state->map[state->player_y][state->player_x] = ' '; if (is_goal_loc(state->player_y, state->player_x, init_data) && \ @@ -279,10 +279,10 @@ bool execute_move_t(sokoban_t *init_data, state_t *state, move_t move) { bool corner_check(int x, int y, sokoban_t *init_data, state_t *state) { // Check if corner - if (((state->map[y][x+1] == '#' && state->map[y+1][x] == '#') || - (state->map[y+1][x] == '#' && state->map[y][x-1] == '#') || - (state->map[y][x-1] == '#' && state->map[y-1][x] == '#') || - (state->map[y-1][x] == '#' && state->map[y][x+1] == '#')) && + if (((state->map[y][x + 1] == '#' && state->map[y + 1][x] == '#') || + (state->map[y + 1][x] == '#' && state->map[y][x - 1] == '#') || + (state->map[y][x - 1] == '#' && state->map[y - 1][x] == '#') || + (state->map[y - 1][x] == '#' && state->map[y][x + 1] == '#')) && !is_goal_loc(state->player_y, state->player_x, init_data)) { return true; @@ -300,17 +300,17 @@ bool simple_corner_deadlock(sokoban_t *init_data, state_t *state) { deadlock = corner_check(x, y, init_data, state); } - if (state->map[state->player_y-1][state->player_x] == '$') { + if (state->map[state->player_y - 1][state->player_x] == '$') { y = state->player_y - 1; deadlock = corner_check(x, y, init_data, state); } - if (state->map[state->player_y][state->player_x+1] == '$') { + if (state->map[state->player_y][state->player_x + 1] == '$') { x = state->player_x + 1; deadlock = corner_check(x, y, init_data, state); } - if (state->map[state->player_y][state->player_x-1] == '$') { + if (state->map[state->player_y][state->player_x - 1] == '$') { x = state->player_x - 1; deadlock = corner_check(x, y, init_data, state); } @@ -318,6 +318,167 @@ bool simple_corner_deadlock(sokoban_t *init_data, state_t *state) { return deadlock; } +bool adjacent_box_check(int x, int y, sokoban_t *init_data, state_t *state) { + /* The outside if statement for each example checks to see if the indices + * are within the map to prevent out-of-bounds errors. + * The inside if statement then checks if the current state matches the + * example. + */ + + /* Example 1: + * # # # # # + * # $ + * # $ + * # @ + * # + */ + if ((y - 2 >= 0) && (x < (int) strlen((state->map)[y - 2])) && \ + (x - 1 < (int) strlen((state->map)[y - 1]))) { + if (state->map[y - 1][x - 1] == '$' && state->map[y - 2][x] == '#' && \ + state->map[y - 2][x - 1] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 2: + * # # # # # + * # $ + * # $ + * # @ + * # + */ + if ((y - 2 >= 0) && (x + 1 < (int) strlen((state->map)[y - 2])) && \ + (x + 1 < (int) strlen((state->map)[y - 1]))) { + if (state->map[y - 1][x + 1] == '$' && state->map[y - 2][x] == '#' && \ + state->map[y - 2][x + 1] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 3: + * # # # # # + * # + * # $ + * # $ @ + * # + */ + if ((y < init_data->lines) && (x - 1 < (int) strlen(state->map[y - 1]))) { + if (state->map[y - 1][x - 1] == '$' && state->map[y][x - 2] == '#' && \ + state->map[y - 1][x - 2] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 4: + * # # # # # + * # + * # $ @ + * # $ + * # + */ + if ((y + 1 < init_data->lines) && (x - 1 < (int) strlen(state->map[y + 1]))) { + if (state->map[y + 1][x - 1] == '$' && state->map[y][x - 2] == '#' && \ + state->map[y + 1][x - 2] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 5: + * # + * # + * $ # + * @ $ # + * # + * # # # # # + */ + if ((y < init_data->lines) && (x + 2 < (int) strlen(state->map[y - 1])) && \ + (x + 2 < (int) strlen(state->map[y]))) { + if (state->map[y - 1][x + 1] == '$' && state->map[y][x + 2] == '#' && \ + state->map[y - 1][x + 2] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + /* Example 6: + * # + * @ $ # + * $ # + * # + * # # # # # + */ + if ((y - 1 < init_data->lines) && (x + 2 < (int) strlen(state->map[y - 1])) && \ + (x + 2 < (int) strlen(state->map[y]))) { + if (state->map[y - 1][x + 1] == '$' && state->map[y][x + 2] == '#' && \ + state->map[y - 1][x + 2] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 7: + * # + * @ # + * $ # + * $ # + * # # # # # + */ + if ((y + 2 < init_data->lines) && (x < (int) strlen((state->map)[y + 2])) && \ + (x - 1 < (int) strlen((state->map)[y + 1]))) { + if (state->map[y + 1][x - 1] == '$' && state->map[y + 2][x] == '#' && \ + state->map[y + 2][x - 1] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + /* Example 8: + * # + * @ # + * $ # + * $ # + * # # # # # + */ + if ((y + 2 < init_data->lines) && (x + 1 < (int) strlen((state->map)[y + 2])) && \ + (x + 1 < (int) strlen((state->map)[y + 1]))) { + if (state->map[y + 1][x + 1] == '$' && state->map[y + 2][x] == '#' && \ + state->map[y + 2][x + 1] == '#' && \ + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; + } + } + + return false; +} + +bool freeze_deadlock(sokoban_t *init_data, state_t *state) { + bool deadlock = false; + + int x = state->player_x; + int y = state->player_y; + + if (state->map[y - 1][x] == '$') { + deadlock = adjacent_box_check(x, y - 1, init_data, state); + } + + if (state->map[y + 1][x] == '$') { + deadlock = adjacent_box_check(x, y + 1, init_data, state); + } + + if (state->map[y][x - 1] == '$') { + deadlock = adjacent_box_check(x - 1, y, init_data, state); + } + + if (state->map[y][x + 1] == '$') { + deadlock = adjacent_box_check(x + 1, y, init_data, state); + } + + return deadlock; +} + /***************************************************************************** * Function: winning_condition * * Parameters: sokoban_t *init_data, state_t *state * @@ -337,13 +498,13 @@ bool winning_condition(sokoban_t *init_data, state_t *state) { return true; } -void play_solution(sokoban_t init_data, char *solution) { +void play_solution(sokoban_t init_data, char *solution ) { SCREEN *mainScreen = newterm(TERMINAL_TYPE, stdout, stdin); set_term(mainScreen); - int cols = 1; - for (int i = 0; i < init_data.lines; i++) { - if (strlen(init_data.map[i]) > (size_t) cols) { + int cols = 1; + for(int i = 0; i < init_data.lines; i++){ + if(strlen(init_data.map[i]) > (size_t) cols){ cols = strlen(init_data.map[i]); } } @@ -368,15 +529,15 @@ void play_solution(sokoban_t init_data, char *solution) { int key_pressed = 0; - if (solution[i] == 'u' || solution[i] == 'U') { + if(solution[i] == 'u' || solution[i] == 'U') { key_pressed = KEY_UP; - } else if (solution[i] == 'd' || solution[i] == 'D') { + } else if(solution[i] == 'd' || solution[i] == 'D') { key_pressed = KEY_DOWN; - } else if (solution[i] == 'l' || solution[i] == 'L') { + } else if(solution[i] == 'l' || solution[i] == 'L') { key_pressed = KEY_LEFT; - } else if (solution[i] == 'r' || solution[i] == 'R') { + } else if(solution[i] == 'r' || solution[i] == 'R') { key_pressed = KEY_RIGHT; - } + } init_data = key_check(init_data, key_pressed); init_data = check_zone_reset(init_data); diff --git a/src/ai/utils.h b/src/ai/utils.h index b769885..b094699 100644 --- a/src/ai/utils.h +++ b/src/ai/utils.h @@ -44,6 +44,10 @@ bool execute_move_t(sokoban_t *init_data, state_t *state, move_t move); bool simple_corner_deadlock(sokoban_t *init_data, state_t *state); +bool adjacent_box_check(int x, int y, sokoban_t *init_data, state_t *state); + +bool freeze_deadlock(sokoban_t *init_data, state_t *state); + bool winning_condition(sokoban_t *init_data, state_t *state); void play_solution(sokoban_t init_data, char* solution); diff --git a/src/ai/utils.o b/src/ai/utils.o index bcf4c542aa1cad26870e886d10f812814ebc3371..689eace2caab3aa865144cbc049e52a6876a0d0d 100644 GIT binary patch literal 47432 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 UzK0S?{tCL`^M=$GI+*hR3oOl4&Hw-a diff --git a/src/loose_check.c b/src/loose_check.c index 44a10c2..1508e24 100644 --- a/src/loose_check.c +++ b/src/loose_check.c @@ -33,10 +33,10 @@ void loose_check(sokoban_t sokoban) { void storage_loose_check(int y, int x, sokoban_t sokoban) { if (sokoban.map[y][x] == '$') { - if (((sokoban.map[y][x+1] == '#' && sokoban.map[y+1][x] == '#') || - (sokoban.map[y+1][x] == '#' && sokoban.map[y][x-1] == '#') || - (sokoban.map[y][x-1] == '#' && sokoban.map[y-1][x] == '#') || - (sokoban.map[y-1][x] == '#' && sokoban.map[y][x+1] == '#')) && + if (((sokoban.map[y][x + 1] == '#' && sokoban.map[y + 1][x] == '#') || + (sokoban.map[y + 1][x] == '#' && sokoban.map[y][x - 1] == '#') || + (sokoban.map[y][x - 1] == '#' && sokoban.map[y - 1][x] == '#') || + (sokoban.map[y - 1][x] == '#' && sokoban.map[y][x + 1] == '#')) && !is_goal_cell(y, x, sokoban ) ) { endwin(); diff --git a/src/loose_check.o b/src/loose_check.o index 7d04ef8f64b3b7e24563132b859bdf92892eb0f9..16266d644dccc306f9340ee34da2d76a7767e00d 100644 GIT binary patch delta 85 zcmX?Mal&E)8<&SQ8zU=Q1gmufh%{zkVqw;2bq7(Ytj_7I;y@N-8LJYAieP00QR%EM bAc{# bAc{#