ECE 2035 Homework

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

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?

UserRevisionLine numberNew 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 }