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 void sokoban_clear(sokoban_screen
*screen
)
55 sokoban_screen
*r
, *tmp
= NULL
;
56 HASH_ITER(hh
, screen
, r
, tmp
) {
62 sokoban_screen
*parse_screen(FILE *stream
)
67 sokoban_screen
*screen
= NULL
;
68 while((buffer
= fgetc(stream
)) != EOF
){
75 case ' ': screen
= add_coord(x
, y
, FREE
, screen
); break;
76 case '@': screen
= add_coord(x
, y
, AGENT
, screen
); break;
77 case '.': screen
= add_coord(x
, y
, TARGET
, screen
); break;
78 case '#': screen
= add_coord(x
, y
, WALL
, screen
); break;
79 case '$': screen
= add_coord(x
, y
, BOX
, screen
); break;
80 case '*': screen
= add_coord(x
, y
, TARGBOX
, screen
); break;
81 case '+': screen
= add_coord(x
, y
, TARGAGENT
, screen
); break;
87 sokoban_screen
*test
= NULL
;
88 test
= get_coord(0,0,screen
);
89 if(test
->tile
== TARGAGENT
) printf("Yuppi\n");