X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=modelchecker%2Fsokoban.c;h=e5dfd9c87d66cab4fc673110946feb41808cafbf;hb=HEAD;hp=465c6283978327ba97007b1a01d2481352c2ab20;hpb=59b2b66a7c7b6585ebd30e8c530b9f826bcc70e9;p=mc1516pa.git diff --git a/modelchecker/sokoban.c b/modelchecker/sokoban.c index 465c628..e5dfd9c 100644 --- a/modelchecker/sokoban.c +++ b/modelchecker/sokoban.c @@ -1,6 +1,5 @@ #include #include -#include "uthash.h" #include "sokoban.h" sokoban_screen *add_coord(int x, int y, sokoban_tile tile, sokoban_screen *screen) @@ -76,13 +75,16 @@ void sokoban_free(sokoban_screen *screen) } } -sokoban_screen *parse_screen(FILE *stream) +sokoban_screen *parse_screen(FILE *stream, bool safe) { - int buffer, x, y, agent_x, agent_y; + int buffer, x, y, agent_x, agent_y, boxes, targets, agents; x = 0; y = 0; agent_x = 0; agent_y = 0; + boxes = 0; + targets = 0; + agents = 0; sokoban_screen *screen = NULL; while((buffer = fgetc(stream)) != EOF){ if (buffer == '\n'){ @@ -96,20 +98,53 @@ sokoban_screen *parse_screen(FILE *stream) screen = add_coord(x, y, AGENT, screen); agent_x = x; agent_y = y; + agents++; + break; + case '.': + screen = add_coord(x, y, TARGET, screen); + targets++; break; - case '.': screen = add_coord(x, y, TARGET, screen); break; case '#': screen = add_coord(x, y, WALL, screen); break; - case '$': screen = add_coord(x, y, BOX, screen); break; - case '*': screen = add_coord(x, y, TARGBOX, screen); break; - case '+': screen = add_coord(x, y, TARGAGENT, screen); break; + case '$': + screen = add_coord(x, y, BOX, screen); + boxes++; + break; + case '*': + screen = add_coord(x, y, TARGBOX, screen); + boxes++; + targets++; + break; + case '+': + screen = add_coord(x, y, TARGAGENT, screen); + agent_x = x; + agent_y = y; + agents++; + targets++; + break; default: return NULL; } x++; } } + if(safe == true && boxes == 0){ + fprintf(stderr, + "Invalid screen. You need at least 1 box\n"); + exit(1); + } + if(safe == true && boxes != targets){ + fprintf(stderr, + "Invalid screen. Boxes: %d, Targets: %d\n", boxes, targets); + exit(1); + } + if(safe == true && agents != 1){ + fprintf(stderr, + "Invalid screen. There has to be exactly one agent. Found: %d\n", + agents); + exit(1); + } + sokoban_screen *newscreen = NULL; newscreen = sokoban_shrink(agent_x, agent_y, screen, newscreen); - //sokoban_print(screen); //unshrinked screen sokoban_free(screen); return newscreen; }