6 sokoban_screen
*add_coord(int x
, int y
, sokoban_tile tile
, sokoban_screen
*screen
)
8 sokoban_screen
*r
= NULL
;
10 r
= (sokoban_screen
*)malloc(sizeof(sokoban_screen
));
11 memset(r
, 0, sizeof(sokoban_screen
));
15 HASH_ADD(hh
, screen
, coord
, sizeof(record_key
), r
);
19 sokoban_screen
*get_coord(int x
, int y
, sokoban_screen
*screen
)
21 sokoban_screen k
, *r
= NULL
;
22 memset(&k
, 0, sizeof(sokoban_screen
));
25 HASH_FIND(hh
, screen
, &k
.coord
, sizeof(record_key
), r
);
29 sokoban_screen
*delete_coord(int x
, int y
, sokoban_screen
*screen
)
31 sokoban_screen
*r
= NULL
;
32 r
= get_coord(x
, y
, screen
);
33 if (r
) HASH_DEL(screen
, r
);
37 void sokoban_print(sokoban_screen
*screen
)
40 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
42 case FREE
: printf("x = %d y = %d FREE\n", r
->coord
.x
, r
->coord
.y
); break;
43 case WALL
: printf("x = %d y = %d WALL\n", r
->coord
.x
, r
->coord
.y
); break;
44 case BOX
: printf("x = %d y = %d BOX\n", r
->coord
.x
, r
->coord
.y
); break;
45 case TARGET
: printf("x = %d y = %d TARGET\n", r
->coord
.x
, r
->coord
.y
); break;
46 case AGENT
: printf("x = %d y = %d AGENT\n", r
->coord
.x
, r
->coord
.y
); break;
47 case TARGAGENT
: printf("x = %d y = %d TARGAGENT\n", r
->coord
.x
, r
->coord
.y
); break;
48 case TARGBOX
: printf("x = %d y = %d TARGBOX\n", r
->coord
.x
, r
->coord
.y
); break;
53 sokoban_screen
*sokoban_shrink(int x
, int y
, sokoban_screen
*screen
, sokoban_screen
*newscreen
)
55 sokoban_screen
*c
, *nc
= NULL
;
56 c
= get_coord(x
, y
, screen
);
58 nc
= get_coord(c
->coord
.x
, c
->coord
.y
, newscreen
);
59 if (c
->tile
!= WALL
&& nc
== NULL
) {
60 newscreen
= add_coord(x
, y
, c
->tile
, newscreen
);
61 newscreen
= sokoban_shrink(x
-1, y
, screen
, newscreen
);
62 newscreen
= sokoban_shrink(x
+1, y
, screen
, newscreen
);
63 newscreen
= sokoban_shrink(x
, y
-1, screen
, newscreen
);
64 newscreen
= sokoban_shrink(x
, y
+1, screen
, newscreen
);
70 void sokoban_free(sokoban_screen
*screen
)
72 sokoban_screen
*r
, *tmp
= NULL
;
73 HASH_ITER(hh
, screen
, r
, tmp
) {
79 sokoban_screen
*parse_screen(FILE *stream
)
81 int buffer
, x
, y
, agent_x
, agent_y
;
86 sokoban_screen
*screen
= NULL
;
87 while((buffer
= fgetc(stream
)) != EOF
){
94 case ' ': screen
= add_coord(x
, y
, FREE
, screen
); break;
96 screen
= add_coord(x
, y
, AGENT
, screen
);
100 case '.': screen
= add_coord(x
, y
, TARGET
, screen
); break;
101 case '#': screen
= add_coord(x
, y
, WALL
, screen
); break;
102 case '$': screen
= add_coord(x
, y
, BOX
, screen
); break;
103 case '*': screen
= add_coord(x
, y
, TARGBOX
, screen
); break;
104 case '+': screen
= add_coord(x
, y
, TARGAGENT
, screen
); break;
105 default: return NULL
;
110 sokoban_screen
*newscreen
= NULL
;
111 newscreen
= sokoban_shrink(agent_x
, agent_y
, screen
, newscreen
);
112 //sokoban_print(screen); //unshrinked screen
113 sokoban_free(screen
);