Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MotionSensor
main.cpp@46:f09711580d4a, 2019-05-08 (annotated)
- Committer:
- el17sm
- Date:
- Wed May 08 20:47:52 2019 +0000
- Revision:
- 46:f09711580d4a
- Parent:
- 45:8725b4171646
- Child:
- 47:6e31b195ce3c
Map Generation Done
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el17sm | 0:8e92b66a0755 | 1 | /* |
| el17sm | 0:8e92b66a0755 | 2 | ELEC2645 Embedded Systems Project |
| el17sm | 0:8e92b66a0755 | 3 | School of Electronic & Electrical Engineering |
| el17sm | 0:8e92b66a0755 | 4 | University of Leeds |
| el17sm | 0:8e92b66a0755 | 5 | Name: Steven Mahasin |
| el17sm | 0:8e92b66a0755 | 6 | Username: el17sm |
| el17sm | 0:8e92b66a0755 | 7 | Student ID Number: 201192939 |
| el17sm | 0:8e92b66a0755 | 8 | Date: 11/04/2019 |
| el17sm | 1:1fa7ecca8dfb | 9 | */ |
| el17sm | 46:f09711580d4a | 10 | #include "main.h" |
| el17sm | 10:1a3499f6b583 | 11 | |
| el17sm | 1:1fa7ecca8dfb | 12 | int main() |
| el17sm | 1:1fa7ecca8dfb | 13 | { |
| el17sm | 29:6b8411bb040a | 14 | // Initialize |
| el17sm | 46:f09711580d4a | 15 | init(); |
| el17sm | 28:98848e6a77a2 | 16 | |
| el17sm | 29:6b8411bb040a | 17 | while(1) { // Gameloop |
| el17sm | 46:f09711580d4a | 18 | |
| el17sm | 46:f09711580d4a | 19 | boss_room_exist = false; |
| el17sm | 32:fe6359ef9916 | 20 | title.main(lcd, gamepad, global_contrast); |
| el17sm | 31:ab24d028ddfd | 21 | |
| el17sm | 32:fe6359ef9916 | 22 | srand(title.get_seed()); |
| el17sm | 31:ab24d028ddfd | 23 | player = new Player(39, 27); |
| el17sm | 41:0697508a28ba | 24 | room_engine = new RoomEngine(global_contrast); |
| el17sm | 31:ab24d028ddfd | 25 | |
| el17sm | 31:ab24d028ddfd | 26 | game_loop(); |
| el17sm | 31:ab24d028ddfd | 27 | game_over(); |
| el17sm | 46:f09711580d4a | 28 | for (int i = 0; i < MAX_ROOMS_MAP_X; i++) { |
| el17sm | 46:f09711580d4a | 29 | for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) { |
| el17sm | 46:f09711580d4a | 30 | if (valid_rooms[j][j]){ |
| el17sm | 40:cbcbf6fc1421 | 31 | delete rooms[j][i]; |
| el17sm | 46:f09711580d4a | 32 | valid_rooms[i][j] = false; |
| el17sm | 40:cbcbf6fc1421 | 33 | } |
| el17sm | 40:cbcbf6fc1421 | 34 | } |
| el17sm | 46:f09711580d4a | 35 | } |
| el17sm | 31:ab24d028ddfd | 36 | delete room_engine; |
| el17sm | 31:ab24d028ddfd | 37 | delete player; |
| el17sm | 31:ab24d028ddfd | 38 | } |
| el17sm | 31:ab24d028ddfd | 39 | } |
| el17sm | 31:ab24d028ddfd | 40 | |
| el17sm | 46:f09711580d4a | 41 | void init() |
| el17sm | 46:f09711580d4a | 42 | { |
| el17sm | 46:f09711580d4a | 43 | lcd.init(); |
| el17sm | 46:f09711580d4a | 44 | lcd.setContrast(global_contrast); |
| el17sm | 46:f09711580d4a | 45 | gamepad.init(); |
| el17sm | 46:f09711580d4a | 46 | for (int j = 0; j < MAX_ROOMS_MAP_Y; j++){ |
| el17sm | 46:f09711580d4a | 47 | for (int i = 0; i < MAX_ROOMS_MAP_X; i++){ |
| el17sm | 46:f09711580d4a | 48 | valid_rooms[j][i] = false; |
| el17sm | 46:f09711580d4a | 49 | } |
| el17sm | 46:f09711580d4a | 50 | } |
| el17sm | 46:f09711580d4a | 51 | } |
| el17sm | 46:f09711580d4a | 52 | |
| el17sm | 31:ab24d028ddfd | 53 | void game_loop() |
| el17sm | 31:ab24d028ddfd | 54 | { |
| el17sm | 31:ab24d028ddfd | 55 | while(1) { // Floor Loop |
| el17sm | 46:f09711580d4a | 56 | boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms |
| el17sm | 46:f09711580d4a | 57 | boss_room_counter = 0; |
| el17sm | 46:f09711580d4a | 58 | while(1) { // Room Loop |
| el17sm | 46:f09711580d4a | 59 | update_room_coords(); |
| el17sm | 46:f09711580d4a | 60 | if (!valid_rooms[room_y][room_x]){ |
| el17sm | 46:f09711580d4a | 61 | generate_room(); |
| el17sm | 30:ec915d24d3e9 | 62 | } |
| el17sm | 46:f09711580d4a | 63 | room_engine->load(player, rooms[room_y][room_x]); |
| el17sm | 31:ab24d028ddfd | 64 | room_engine->entrance_scene(lcd, gamepad); |
| el17sm | 31:ab24d028ddfd | 65 | while(room_engine->check_player_room_position() == INSIDE) { // Room actions |
| el17sm | 31:ab24d028ddfd | 66 | room_engine->read_input(gamepad); |
| el17sm | 31:ab24d028ddfd | 67 | room_engine->update(); |
| el17sm | 31:ab24d028ddfd | 68 | room_engine->render(lcd, gamepad); |
| el17sm | 46:f09711580d4a | 69 | minimap_detection(); |
| el17sm | 31:ab24d028ddfd | 70 | if (player->get_hp() <= 0) { |
| el17sm | 31:ab24d028ddfd | 71 | goto gameover; |
| el17sm | 29:6b8411bb040a | 72 | } |
| el17sm | 29:6b8411bb040a | 73 | } |
| el17sm | 31:ab24d028ddfd | 74 | room_engine->exit_scene(lcd, gamepad); |
| el17sm | 46:f09711580d4a | 75 | rooms[room_y][room_x]->unload(); |
| el17sm | 31:ab24d028ddfd | 76 | player->delete_bullets(); |
| el17sm | 31:ab24d028ddfd | 77 | room_engine->update_current_room(); |
| el17sm | 31:ab24d028ddfd | 78 | } |
| el17sm | 31:ab24d028ddfd | 79 | } |
| el17sm | 31:ab24d028ddfd | 80 | gameover : { |
| el17sm | 31:ab24d028ddfd | 81 | game_over(); |
| el17sm | 31:ab24d028ddfd | 82 | } |
| el17sm | 31:ab24d028ddfd | 83 | } |
| el17sm | 29:6b8411bb040a | 84 | |
| el17sm | 46:f09711580d4a | 85 | void generate_room() |
| el17sm | 46:f09711580d4a | 86 | { |
| el17sm | 46:f09711580d4a | 87 | valid_rooms[room_y][room_x] = true; |
| el17sm | 46:f09711580d4a | 88 | if (boss_room_counter == 0) { |
| el17sm | 46:f09711580d4a | 89 | rooms[room_y][room_x] = new Room(0, 0); |
| el17sm | 46:f09711580d4a | 90 | rooms[room_y][room_x]->set_doorway(0, true); |
| el17sm | 46:f09711580d4a | 91 | } else { |
| el17sm | 46:f09711580d4a | 92 | rooms[room_y][room_x] = new Room(rand() % 4, 0); |
| el17sm | 46:f09711580d4a | 93 | if (boss_room_counter < boss_room_number) {no_of_doorways = 2 + (rand() % 100 < 10) + (rand() % 100 < 10);} // 20% chance of adding doorways |
| el17sm | 46:f09711580d4a | 94 | else {no_of_doorways = 1;} |
| el17sm | 46:f09711580d4a | 95 | while (count_doorways() < no_of_doorways) { |
| el17sm | 46:f09711580d4a | 96 | rooms[room_y][room_x]->set_doorway(rand() % 4, true); // Setting random doorways until number of desired doorways |
| el17sm | 46:f09711580d4a | 97 | } |
| el17sm | 46:f09711580d4a | 98 | update_definite_doorways(); |
| el17sm | 46:f09711580d4a | 99 | for (int i = 0; i < 4; i++) { |
| el17sm | 46:f09711580d4a | 100 | if (cannot[i]){rooms[room_y][room_x]->set_doorway(i, false);} |
| el17sm | 46:f09711580d4a | 101 | if (have_to[i]){rooms[room_y][room_x]->set_doorway(i, true);} |
| el17sm | 46:f09711580d4a | 102 | } |
| el17sm | 46:f09711580d4a | 103 | if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) { |
| el17sm | 46:f09711580d4a | 104 | rooms[room_y][room_x]->set_boss_doorway(available_boss_room()); |
| el17sm | 46:f09711580d4a | 105 | boss_room_exist = true; |
| el17sm | 46:f09711580d4a | 106 | } |
| el17sm | 46:f09711580d4a | 107 | } |
| el17sm | 46:f09711580d4a | 108 | boss_room_counter++; |
| el17sm | 46:f09711580d4a | 109 | } |
| el17sm | 46:f09711580d4a | 110 | |
| el17sm | 31:ab24d028ddfd | 111 | void game_over() |
| el17sm | 31:ab24d028ddfd | 112 | { |
| el17sm | 31:ab24d028ddfd | 113 | while(1){ // Game Over Screen Loop |
| el17sm | 30:ec915d24d3e9 | 114 | lcd.clear(); |
| el17sm | 30:ec915d24d3e9 | 115 | lcd.setContrast(global_contrast); |
| el17sm | 30:ec915d24d3e9 | 116 | lcd.printString("Game Over", 0, 0); |
| el17sm | 30:ec915d24d3e9 | 117 | lcd.printString("Retry?", 0, 1); |
| el17sm | 30:ec915d24d3e9 | 118 | lcd.refresh(); |
| el17sm | 30:ec915d24d3e9 | 119 | while(!gamepad.check_event(Gamepad::A_PRESSED)) { |
| el17sm | 30:ec915d24d3e9 | 120 | } |
| el17sm | 30:ec915d24d3e9 | 121 | wait(0.05); |
| el17sm | 30:ec915d24d3e9 | 122 | while(gamepad.check_event(Gamepad::A_PRESSED)) { |
| el17sm | 30:ec915d24d3e9 | 123 | } |
| el17sm | 30:ec915d24d3e9 | 124 | break; |
| el17sm | 30:ec915d24d3e9 | 125 | } |
| el17sm | 46:f09711580d4a | 126 | } |
| el17sm | 46:f09711580d4a | 127 | |
| el17sm | 46:f09711580d4a | 128 | void update_room_coords() |
| el17sm | 46:f09711580d4a | 129 | { |
| el17sm | 46:f09711580d4a | 130 | prev_room_x = room_x; |
| el17sm | 46:f09711580d4a | 131 | prev_room_y = room_y; |
| el17sm | 46:f09711580d4a | 132 | room_y = room_engine->get_room_y(); |
| el17sm | 46:f09711580d4a | 133 | room_x = room_engine->get_room_x(); |
| el17sm | 46:f09711580d4a | 134 | } |
| el17sm | 46:f09711580d4a | 135 | |
| el17sm | 46:f09711580d4a | 136 | int opposite(int value) |
| el17sm | 46:f09711580d4a | 137 | { |
| el17sm | 46:f09711580d4a | 138 | if (value <= 1) { |
| el17sm | 46:f09711580d4a | 139 | return value + 2; |
| el17sm | 46:f09711580d4a | 140 | } else { |
| el17sm | 46:f09711580d4a | 141 | return value - 2; |
| el17sm | 46:f09711580d4a | 142 | } |
| el17sm | 46:f09711580d4a | 143 | } |
| el17sm | 46:f09711580d4a | 144 | |
| el17sm | 46:f09711580d4a | 145 | int count_doorways() // counts number of exisisting doorways |
| el17sm | 46:f09711580d4a | 146 | { |
| el17sm | 46:f09711580d4a | 147 | int count = 0; |
| el17sm | 46:f09711580d4a | 148 | for (int i = 0; i < 4; i++){ |
| el17sm | 46:f09711580d4a | 149 | if (rooms[room_y][room_x]->get_doorway(i)) { |
| el17sm | 46:f09711580d4a | 150 | count++; |
| el17sm | 46:f09711580d4a | 151 | } |
| el17sm | 46:f09711580d4a | 152 | } |
| el17sm | 46:f09711580d4a | 153 | return count; |
| el17sm | 46:f09711580d4a | 154 | } |
| el17sm | 46:f09711580d4a | 155 | |
| el17sm | 46:f09711580d4a | 156 | void update_definite_doorways() |
| el17sm | 46:f09711580d4a | 157 | { |
| el17sm | 46:f09711580d4a | 158 | // UP |
| el17sm | 46:f09711580d4a | 159 | if (room_y == 1) { |
| el17sm | 46:f09711580d4a | 160 | cannot[0] = true; |
| el17sm | 46:f09711580d4a | 161 | have_to[0] = false; |
| el17sm | 46:f09711580d4a | 162 | } else if (valid_rooms[room_y - 1][room_x]){ |
| el17sm | 46:f09711580d4a | 163 | if (rooms[room_y - 1][room_x]->get_doorway(2)){ |
| el17sm | 46:f09711580d4a | 164 | have_to[0] = true; |
| el17sm | 46:f09711580d4a | 165 | cannot[0] = false; |
| el17sm | 46:f09711580d4a | 166 | } else { |
| el17sm | 46:f09711580d4a | 167 | have_to[0] = false; |
| el17sm | 46:f09711580d4a | 168 | cannot[0] = true; |
| el17sm | 46:f09711580d4a | 169 | } |
| el17sm | 46:f09711580d4a | 170 | } else { |
| el17sm | 46:f09711580d4a | 171 | have_to[0] = false; |
| el17sm | 46:f09711580d4a | 172 | cannot[0] = false; |
| el17sm | 46:f09711580d4a | 173 | } |
| el17sm | 46:f09711580d4a | 174 | |
| el17sm | 46:f09711580d4a | 175 | // RIGHT |
| el17sm | 46:f09711580d4a | 176 | if (room_x == 10) { |
| el17sm | 46:f09711580d4a | 177 | cannot[1] = true; |
| el17sm | 46:f09711580d4a | 178 | have_to[1] = false; |
| el17sm | 46:f09711580d4a | 179 | } else if (valid_rooms[room_y][room_x + 1]){ |
| el17sm | 46:f09711580d4a | 180 | if (rooms[room_y][room_x + 1]->get_doorway(3)){ |
| el17sm | 46:f09711580d4a | 181 | have_to[1] = true; |
| el17sm | 46:f09711580d4a | 182 | cannot[1] = false; |
| el17sm | 46:f09711580d4a | 183 | } else { |
| el17sm | 46:f09711580d4a | 184 | have_to[1] = false; |
| el17sm | 46:f09711580d4a | 185 | cannot[1] = true; |
| el17sm | 46:f09711580d4a | 186 | } |
| el17sm | 46:f09711580d4a | 187 | } else { |
| el17sm | 46:f09711580d4a | 188 | have_to[1] = false; |
| el17sm | 46:f09711580d4a | 189 | cannot[1] = false; |
| el17sm | 46:f09711580d4a | 190 | } |
| el17sm | 46:f09711580d4a | 191 | |
| el17sm | 46:f09711580d4a | 192 | // DOWN |
| el17sm | 46:f09711580d4a | 193 | if (room_y == 10) { |
| el17sm | 46:f09711580d4a | 194 | cannot[2] = true; |
| el17sm | 46:f09711580d4a | 195 | have_to[2] = false; |
| el17sm | 46:f09711580d4a | 196 | } else if (valid_rooms[room_y + 1][room_x]){ |
| el17sm | 46:f09711580d4a | 197 | if (rooms[room_y + 1][room_x]->get_doorway(0)){ |
| el17sm | 46:f09711580d4a | 198 | have_to[2] = true; |
| el17sm | 46:f09711580d4a | 199 | cannot[2] = false; |
| el17sm | 46:f09711580d4a | 200 | } else { |
| el17sm | 46:f09711580d4a | 201 | have_to[2] = false; |
| el17sm | 46:f09711580d4a | 202 | cannot[2] = true; |
| el17sm | 46:f09711580d4a | 203 | } |
| el17sm | 46:f09711580d4a | 204 | } else { |
| el17sm | 46:f09711580d4a | 205 | have_to[2] = false; |
| el17sm | 46:f09711580d4a | 206 | cannot[2] = false; |
| el17sm | 46:f09711580d4a | 207 | } |
| el17sm | 46:f09711580d4a | 208 | |
| el17sm | 46:f09711580d4a | 209 | // LEFT |
| el17sm | 46:f09711580d4a | 210 | if (room_x == 1) { |
| el17sm | 46:f09711580d4a | 211 | cannot[3] = true; |
| el17sm | 46:f09711580d4a | 212 | have_to[3] = false; |
| el17sm | 46:f09711580d4a | 213 | } else if (valid_rooms[room_y][room_x - 1]){ |
| el17sm | 46:f09711580d4a | 214 | if (rooms[room_y][room_x - 1]->get_doorway(1)){ |
| el17sm | 46:f09711580d4a | 215 | have_to[3] = true; |
| el17sm | 46:f09711580d4a | 216 | cannot[3] = false; |
| el17sm | 46:f09711580d4a | 217 | } else { |
| el17sm | 46:f09711580d4a | 218 | have_to[3] = false; |
| el17sm | 46:f09711580d4a | 219 | cannot[3] = true; |
| el17sm | 46:f09711580d4a | 220 | } |
| el17sm | 46:f09711580d4a | 221 | } else { |
| el17sm | 46:f09711580d4a | 222 | have_to[3] = false; |
| el17sm | 46:f09711580d4a | 223 | cannot[3] = false; |
| el17sm | 46:f09711580d4a | 224 | } |
| el17sm | 46:f09711580d4a | 225 | } |
| el17sm | 46:f09711580d4a | 226 | |
| el17sm | 46:f09711580d4a | 227 | int available_boss_room() |
| el17sm | 46:f09711580d4a | 228 | { |
| el17sm | 46:f09711580d4a | 229 | if (!valid_rooms[room_y - 1][room_x]){ |
| el17sm | 46:f09711580d4a | 230 | rooms[room_y][room_x]->set_doorway(0, true); |
| el17sm | 46:f09711580d4a | 231 | valid_rooms[room_y - 1][room_x] = true; |
| el17sm | 46:f09711580d4a | 232 | rooms[room_y - 1][room_x] = new Room(0, 10); |
| el17sm | 46:f09711580d4a | 233 | rooms[room_y - 1][room_x]->set_doorway(2, true); |
| el17sm | 46:f09711580d4a | 234 | return 0; |
| el17sm | 46:f09711580d4a | 235 | } else if (!valid_rooms[room_y][room_x + 1]){ |
| el17sm | 46:f09711580d4a | 236 | rooms[room_y][room_x]->set_doorway(1, true); |
| el17sm | 46:f09711580d4a | 237 | valid_rooms[room_y][room_x + 1] = true; |
| el17sm | 46:f09711580d4a | 238 | rooms[room_y][room_x + 1] = new Room(0, 10); |
| el17sm | 46:f09711580d4a | 239 | rooms[room_y][room_x + 1]->set_doorway(3, true); |
| el17sm | 46:f09711580d4a | 240 | return 1; |
| el17sm | 46:f09711580d4a | 241 | } else if (!valid_rooms[room_y + 1][room_x]){ |
| el17sm | 46:f09711580d4a | 242 | rooms[room_y][room_x]->set_doorway(2, true); |
| el17sm | 46:f09711580d4a | 243 | valid_rooms[room_y + 1][room_x] = true; |
| el17sm | 46:f09711580d4a | 244 | rooms[room_y + 1][room_x] = new Room(0, 10); |
| el17sm | 46:f09711580d4a | 245 | rooms[room_y + 1][room_x]->set_doorway(0, true); |
| el17sm | 46:f09711580d4a | 246 | return 2; |
| el17sm | 46:f09711580d4a | 247 | } else if (!valid_rooms[room_y][room_x - 1]){ |
| el17sm | 46:f09711580d4a | 248 | rooms[room_y][room_x]->set_doorway(3, true); |
| el17sm | 46:f09711580d4a | 249 | valid_rooms[room_y][room_x - 1] = true; |
| el17sm | 46:f09711580d4a | 250 | rooms[room_y][room_x - 1] = new Room(0, 10); |
| el17sm | 46:f09711580d4a | 251 | rooms[room_y][room_x - 1]->set_doorway(1, true); |
| el17sm | 46:f09711580d4a | 252 | return 3; |
| el17sm | 46:f09711580d4a | 253 | } |
| el17sm | 46:f09711580d4a | 254 | delete rooms[room_y - 1][room_x]; |
| el17sm | 46:f09711580d4a | 255 | rooms[room_y - 1][room_x] = new Room(0, 10); |
| el17sm | 46:f09711580d4a | 256 | rooms[room_y - 1][room_x]->set_doorway(2, true); |
| el17sm | 46:f09711580d4a | 257 | return 0; |
| el17sm | 46:f09711580d4a | 258 | } |
| el17sm | 46:f09711580d4a | 259 | |
| el17sm | 46:f09711580d4a | 260 | void minimap_detection() |
| el17sm | 46:f09711580d4a | 261 | { |
| el17sm | 46:f09711580d4a | 262 | while(gamepad.check_event(Gamepad::BACK_PRESSED)) { |
| el17sm | 46:f09711580d4a | 263 | lcd.clear(); |
| el17sm | 46:f09711580d4a | 264 | lcd.refresh(); |
| el17sm | 46:f09711580d4a | 265 | wait_ms(1000/40); |
| el17sm | 46:f09711580d4a | 266 | }; |
| el17sm | 46:f09711580d4a | 267 | } |