#include "labyrinth.h" #include "global.h" #include "stdio.h" #include "stdlib.h" void show_solution(Field_State** field, unsigned short len_x, unsigned short len_y){ for (int c_x = 0; c_x < len_x; c_x++){ for (int c_y = 0; c_y < len_y; c_y++){ printf("%hi", field[c_x][c_y]); } printf("\n"); } } unsigned short get_natural_number(char text[]){ unsigned short result; printf("%s", text); scanf("%hu", &result); return result; } void ask_lab_dimensions(unsigned short *len_x, unsigned short *len_y){ *len_x = get_natural_number("Bitte gib die x-Laenge des Labyrinthes an:\n"); *len_y = get_natural_number("Bitte gib die y-Laenge des Labyrinthes an:\n"); } short get_wall_input(unsigned short *x, unsigned short *y, unsigned short len_x, unsigned short len_y){ char answer; printf("Moechten Sie die Koordinaten einer weiteren Labyrinthwand angeben? (y/n)\n"); scanf(" %c", &answer); if (answer == 'n'){ return 1; } printf("Bitte geben Sie die Koordinaten von Labyrinthwaenden im Format x, y ein.\n"); scanf("%hu, %hu", x, y); if (*x >= len_x || *y >= len_y){ printf("Die eingegebenen Koordinaten sind zu gross.\n"); return -1; } return 0; } void turn_direction_right(Direction *direction){ switch (*direction) { case N: *direction = E; break; case E: *direction = S; break; case S: *direction = W; break; case W: *direction = N; break; } } void lab_move(unsigned short *x, unsigned short *y, Direction direction){ if (direction == N){ *x = *x - 1; return; } if (direction == E){ *y = *y + 1; return; } if (direction == S){ *x = *x + 1; return; } if (direction == W){ *y = *y - 1; return; } } void set_wall(Field_State** field, unsigned short x, unsigned short y) { field[x][y] = WALL; } void init_field(Field_State** field, unsigned short len_x, unsigned short len_y){ for (int c_x = 0; c_x < len_x; c_x++){ for (int c_y = 0; c_y < len_y; c_y++){ field[c_x][c_y] = WAY; } } } short lab_can_move(Field_State** field, unsigned short x, unsigned short y, Direction direction, unsigned short len_x, unsigned short len_y){ lab_move(&x, &y, direction); if (x >= len_x){ return 1; } if (y >= len_y){ return 1; } if (field[x][y] == WALL){ return 1; } if (field[x][y] == SOLUTION){ return 1; } return 0; } void ask_lab_walls(Field_State** field, unsigned short len_x, unsigned short len_y){ unsigned short x, y; short wall_input_continue; init_field(field, len_x, len_y); do { wall_input_continue = get_wall_input(&x, &y, len_x, len_y); if (wall_input_continue == 0){ set_wall(field, x, y); show_solution(field, len_x, len_y); } } while (wall_input_continue != 1); } short calculate_lab_way(Field_State** field, unsigned short len_x, unsigned short len_y, unsigned short x, unsigned short y){ Direction direction = N; unsigned short current_x; unsigned short current_y; if (x == len_x-1 && y == len_y-1){ field[x][y] = SOLUTION; return 0; } do { current_x = x; current_y = y; if (lab_can_move(field, current_x, current_y, direction, len_x, len_y) == 0){ lab_move(¤t_x, ¤t_y, direction); printf("%d - %d\n", current_x, current_y); field[current_x][current_y] = SOLUTION; if (calculate_lab_way(field, len_x, len_y, current_x, current_y) == 0){ return 0; } field[current_x][current_y] = WAY; } turn_direction_right(&direction); } while (direction != N); return 1; } void start_labyrinth_game(){ unsigned short len_x, len_y; Field_State **field; ask_lab_dimensions(&len_x, &len_y); field = malloc(len_x * sizeof *field); for (int c_index = 0; c_index < len_x; c_index++){ field[c_index] = malloc(len_y * sizeof field[c_index]); } ask_lab_walls(field, len_x, len_y); if (calculate_lab_way(field, len_x, len_y, 0, 0) == 1){ printf("Keine Loesung moeglich!\n"); } show_solution(field, len_x, len_y); for (int c_index = 0; c_index < len_x; c_index++) { free(field[c_index]); } free(field); }