ECE 2035 Homework
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
map.cpp@4:e3fbc74a3783, 2019-11-14 (annotated)
- Committer:
- zkang0729
- Date:
- Thu Nov 14 17:14:37 2019 +0000
- Revision:
- 4:e3fbc74a3783
- Parent:
- 0:35660d7952f7
Initial Commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rconnorlawson | 0:35660d7952f7 | 1 | #include "map.h" |
rconnorlawson | 0:35660d7952f7 | 2 | |
rconnorlawson | 0:35660d7952f7 | 3 | #include "globals.h" |
rconnorlawson | 0:35660d7952f7 | 4 | #include "graphics.h" |
rconnorlawson | 0:35660d7952f7 | 5 | |
rconnorlawson | 0:35660d7952f7 | 6 | /** |
rconnorlawson | 0:35660d7952f7 | 7 | * The Map structure. This holds a HashTable for all the MapItems, along with |
rconnorlawson | 0:35660d7952f7 | 8 | * values for the width and height of the Map. |
rconnorlawson | 0:35660d7952f7 | 9 | */ |
zkang0729 | 4:e3fbc74a3783 | 10 | struct Map |
zkang0729 | 4:e3fbc74a3783 | 11 | { |
zkang0729 | 4:e3fbc74a3783 | 12 | HashTable *items; |
zkang0729 | 4:e3fbc74a3783 | 13 | int w, h; |
rconnorlawson | 0:35660d7952f7 | 14 | }; |
rconnorlawson | 0:35660d7952f7 | 15 | |
rconnorlawson | 0:35660d7952f7 | 16 | /** |
rconnorlawson | 0:35660d7952f7 | 17 | * Storage area for the maps. |
rconnorlawson | 0:35660d7952f7 | 18 | * This is a global variable, but can only be access from this file because it |
rconnorlawson | 0:35660d7952f7 | 19 | * is static. |
rconnorlawson | 0:35660d7952f7 | 20 | */ |
rconnorlawson | 0:35660d7952f7 | 21 | static Map map; |
rconnorlawson | 0:35660d7952f7 | 22 | static int active_map; |
rconnorlawson | 0:35660d7952f7 | 23 | |
rconnorlawson | 0:35660d7952f7 | 24 | /** |
rconnorlawson | 0:35660d7952f7 | 25 | * The first step in HashTable access for the map is turning the two-dimensional |
rconnorlawson | 0:35660d7952f7 | 26 | * key information (x, y) into a one-dimensional unsigned integer. |
rconnorlawson | 0:35660d7952f7 | 27 | * This function should uniquely map (x,y) onto the space of unsigned integers. |
rconnorlawson | 0:35660d7952f7 | 28 | */ |
zkang0729 | 4:e3fbc74a3783 | 29 | static unsigned XY_KEY(int X, int Y) |
zkang0729 | 4:e3fbc74a3783 | 30 | { |
zkang0729 | 4:e3fbc74a3783 | 31 | return Y * map_width() + X; |
rconnorlawson | 0:35660d7952f7 | 32 | } |
rconnorlawson | 0:35660d7952f7 | 33 | |
rconnorlawson | 0:35660d7952f7 | 34 | /** |
rconnorlawson | 0:35660d7952f7 | 35 | * This is the hash function actually passed into createHashTable. It takes an |
rconnorlawson | 0:35660d7952f7 | 36 | * unsigned key (the output of XY_KEY) and turns it into a hash value (some |
rconnorlawson | 0:35660d7952f7 | 37 | * small non-negative integer). |
rconnorlawson | 0:35660d7952f7 | 38 | */ |
rconnorlawson | 0:35660d7952f7 | 39 | unsigned map_hash(unsigned key) |
rconnorlawson | 0:35660d7952f7 | 40 | { |
zkang0729 | 4:e3fbc74a3783 | 41 | return key % map_width(); |
rconnorlawson | 0:35660d7952f7 | 42 | } |
rconnorlawson | 0:35660d7952f7 | 43 | |
rconnorlawson | 0:35660d7952f7 | 44 | void maps_init() |
rconnorlawson | 0:35660d7952f7 | 45 | { |
zkang0729 | 4:e3fbc74a3783 | 46 | HashTable *hash_map = createHashTable(map_hash, 50); |
zkang0729 | 4:e3fbc74a3783 | 47 | map.items = hash_map; |
zkang0729 | 4:e3fbc74a3783 | 48 | map.w = 50; |
zkang0729 | 4:e3fbc74a3783 | 49 | map.h = 50; |
rconnorlawson | 0:35660d7952f7 | 50 | } |
rconnorlawson | 0:35660d7952f7 | 51 | |
zkang0729 | 4:e3fbc74a3783 | 52 | Map *get_active_map() |
rconnorlawson | 0:35660d7952f7 | 53 | { |
zkang0729 | 4:e3fbc74a3783 | 54 | // There's only one map |
zkang0729 | 4:e3fbc74a3783 | 55 | return ↦ |
rconnorlawson | 0:35660d7952f7 | 56 | } |
rconnorlawson | 0:35660d7952f7 | 57 | |
zkang0729 | 4:e3fbc74a3783 | 58 | Map *set_active_map(int m) |
rconnorlawson | 0:35660d7952f7 | 59 | { |
zkang0729 | 4:e3fbc74a3783 | 60 | active_map = m; |
zkang0729 | 4:e3fbc74a3783 | 61 | return ↦ |
rconnorlawson | 0:35660d7952f7 | 62 | } |
rconnorlawson | 0:35660d7952f7 | 63 | |
rconnorlawson | 0:35660d7952f7 | 64 | void print_map() |
rconnorlawson | 0:35660d7952f7 | 65 | { |
zkang0729 | 4:e3fbc74a3783 | 66 | // As you add more types, you'll need to add more items to this array. |
zkang0729 | 4:e3fbc74a3783 | 67 | char lookup[] = {'W', 'P'}; |
zkang0729 | 4:e3fbc74a3783 | 68 | for (int y = 0; y < map_height(); y++) |
zkang0729 | 4:e3fbc74a3783 | 69 | { |
zkang0729 | 4:e3fbc74a3783 | 70 | for (int x = 0; x < map_width(); x++) |
rconnorlawson | 0:35660d7952f7 | 71 | { |
zkang0729 | 4:e3fbc74a3783 | 72 | MapItem *item = get_here(x, y); |
zkang0729 | 4:e3fbc74a3783 | 73 | if (item) |
zkang0729 | 4:e3fbc74a3783 | 74 | pc.printf("%c", lookup[item->type]); |
zkang0729 | 4:e3fbc74a3783 | 75 | else |
zkang0729 | 4:e3fbc74a3783 | 76 | pc.printf(" "); |
rconnorlawson | 0:35660d7952f7 | 77 | } |
zkang0729 | 4:e3fbc74a3783 | 78 | pc.printf("\r\n"); |
zkang0729 | 4:e3fbc74a3783 | 79 | } |
rconnorlawson | 0:35660d7952f7 | 80 | } |
rconnorlawson | 0:35660d7952f7 | 81 | |
rconnorlawson | 0:35660d7952f7 | 82 | int map_width() |
rconnorlawson | 0:35660d7952f7 | 83 | { |
zkang0729 | 4:e3fbc74a3783 | 84 | return map.w; |
rconnorlawson | 0:35660d7952f7 | 85 | } |
rconnorlawson | 0:35660d7952f7 | 86 | |
rconnorlawson | 0:35660d7952f7 | 87 | int map_height() |
rconnorlawson | 0:35660d7952f7 | 88 | { |
zkang0729 | 4:e3fbc74a3783 | 89 | return map.h; |
rconnorlawson | 0:35660d7952f7 | 90 | } |
rconnorlawson | 0:35660d7952f7 | 91 | |
rconnorlawson | 0:35660d7952f7 | 92 | int map_area() |
rconnorlawson | 0:35660d7952f7 | 93 | { |
zkang0729 | 4:e3fbc74a3783 | 94 | return map_height() * map_width(); |
rconnorlawson | 0:35660d7952f7 | 95 | } |
rconnorlawson | 0:35660d7952f7 | 96 | |
zkang0729 | 4:e3fbc74a3783 | 97 | MapItem *get_north(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 98 | { |
zkang0729 | 4:e3fbc74a3783 | 99 | return (MapItem *)getItem(map.items, XY_KEY(x, y - 1)); |
rconnorlawson | 0:35660d7952f7 | 100 | } |
rconnorlawson | 0:35660d7952f7 | 101 | |
zkang0729 | 4:e3fbc74a3783 | 102 | MapItem *get_south(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 103 | { |
zkang0729 | 4:e3fbc74a3783 | 104 | return (MapItem *)getItem(map.items, XY_KEY(x, y + 1)); |
rconnorlawson | 0:35660d7952f7 | 105 | } |
rconnorlawson | 0:35660d7952f7 | 106 | |
zkang0729 | 4:e3fbc74a3783 | 107 | MapItem *get_east(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 108 | { |
zkang0729 | 4:e3fbc74a3783 | 109 | return (MapItem *)getItem(map.items, XY_KEY(x + 1, y)); |
rconnorlawson | 0:35660d7952f7 | 110 | } |
rconnorlawson | 0:35660d7952f7 | 111 | |
zkang0729 | 4:e3fbc74a3783 | 112 | MapItem *get_west(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 113 | { |
zkang0729 | 4:e3fbc74a3783 | 114 | return (MapItem *)getItem(map.items, XY_KEY(x - 1, y)); |
rconnorlawson | 0:35660d7952f7 | 115 | } |
rconnorlawson | 0:35660d7952f7 | 116 | |
zkang0729 | 4:e3fbc74a3783 | 117 | MapItem *get_here(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 118 | { |
zkang0729 | 4:e3fbc74a3783 | 119 | return (MapItem *)getItem(map.items, XY_KEY(x, y)); |
rconnorlawson | 0:35660d7952f7 | 120 | } |
rconnorlawson | 0:35660d7952f7 | 121 | |
rconnorlawson | 0:35660d7952f7 | 122 | void map_erase(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 123 | { |
zkang0729 | 4:e3fbc74a3783 | 124 | removeItem(map.items, XY_KEY(x, y)); |
rconnorlawson | 0:35660d7952f7 | 125 | } |
rconnorlawson | 0:35660d7952f7 | 126 | |
rconnorlawson | 0:35660d7952f7 | 127 | void add_wall(int x, int y, int dir, int len) |
rconnorlawson | 0:35660d7952f7 | 128 | { |
zkang0729 | 4:e3fbc74a3783 | 129 | for (int i = 0; i < len; i++) |
zkang0729 | 4:e3fbc74a3783 | 130 | { |
zkang0729 | 4:e3fbc74a3783 | 131 | MapItem *w1 = (MapItem *)malloc(sizeof(MapItem)); |
zkang0729 | 4:e3fbc74a3783 | 132 | w1->type = WALL; |
zkang0729 | 4:e3fbc74a3783 | 133 | w1->draw = draw_wall; |
zkang0729 | 4:e3fbc74a3783 | 134 | w1->walkable = false; |
zkang0729 | 4:e3fbc74a3783 | 135 | w1->data = NULL; |
zkang0729 | 4:e3fbc74a3783 | 136 | unsigned key = (dir == HORIZONTAL) ? XY_KEY(x + i, y) : XY_KEY(x, y + i); |
zkang0729 | 4:e3fbc74a3783 | 137 | void *val = insertItem(get_active_map()->items, key, w1); |
zkang0729 | 4:e3fbc74a3783 | 138 | if (val) |
zkang0729 | 4:e3fbc74a3783 | 139 | free(val); // If something is already there, free it |
zkang0729 | 4:e3fbc74a3783 | 140 | } |
rconnorlawson | 0:35660d7952f7 | 141 | } |
rconnorlawson | 0:35660d7952f7 | 142 | |
rconnorlawson | 0:35660d7952f7 | 143 | void add_plant(int x, int y) |
rconnorlawson | 0:35660d7952f7 | 144 | { |
zkang0729 | 4:e3fbc74a3783 | 145 | MapItem *w1 = (MapItem *)malloc(sizeof(MapItem)); |
zkang0729 | 4:e3fbc74a3783 | 146 | w1->type = PLANT; |
zkang0729 | 4:e3fbc74a3783 | 147 | w1->draw = draw_plant; |
zkang0729 | 4:e3fbc74a3783 | 148 | w1->walkable = true; |
zkang0729 | 4:e3fbc74a3783 | 149 | w1->data = NULL; |
zkang0729 | 4:e3fbc74a3783 | 150 | void *val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); |
zkang0729 | 4:e3fbc74a3783 | 151 | if (val) |
zkang0729 | 4:e3fbc74a3783 | 152 | free(val); // If something is already there, free it |
rconnorlawson | 0:35660d7952f7 | 153 | } |