ECE 2036 Project
Dependencies: mbed wave_player 4DGL-uLCD-SE
main.cpp@2:2042f29de6b7, 2019-11-21 (annotated)
- Committer:
- abraha2d
- Date:
- Thu Nov 21 16:10:57 2019 +0000
- Revision:
- 2:2042f29de6b7
- Parent:
- 0:cf4396614a79
Because other peeps is wanting dis...
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rconnorlawson | 0:cf4396614a79 | 1 | /* Gatech ECE2035 2017 FALL MAZE RUNNER |
rconnorlawson | 0:cf4396614a79 | 2 | * Copyright (c) 2017 Gatech ECE2035 |
rconnorlawson | 0:cf4396614a79 | 3 | * |
rconnorlawson | 0:cf4396614a79 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
rconnorlawson | 0:cf4396614a79 | 5 | * of this software and associated documentation files (the "Software"), to deal |
rconnorlawson | 0:cf4396614a79 | 6 | * in the Software without restriction, including without limitation the rights |
rconnorlawson | 0:cf4396614a79 | 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
rconnorlawson | 0:cf4396614a79 | 8 | * copies of the Software, and to permit persons to whom the Software is |
rconnorlawson | 0:cf4396614a79 | 9 | * furnished to do so, subject to the following conditions: |
rconnorlawson | 0:cf4396614a79 | 10 | * |
rconnorlawson | 0:cf4396614a79 | 11 | * The above copyright notice and this permission notice shall be included in |
rconnorlawson | 0:cf4396614a79 | 12 | * all copies or substantial portions of the Software. |
rconnorlawson | 0:cf4396614a79 | 13 | * |
rconnorlawson | 0:cf4396614a79 | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
rconnorlawson | 0:cf4396614a79 | 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
rconnorlawson | 0:cf4396614a79 | 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
rconnorlawson | 0:cf4396614a79 | 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
rconnorlawson | 0:cf4396614a79 | 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
rconnorlawson | 0:cf4396614a79 | 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
rconnorlawson | 0:cf4396614a79 | 20 | * SOFTWARE. |
rconnorlawson | 0:cf4396614a79 | 21 | */ |
rconnorlawson | 0:cf4396614a79 | 22 | |
rconnorlawson | 0:cf4396614a79 | 23 | // Include header files for platform |
rconnorlawson | 0:cf4396614a79 | 24 | #include "mbed.h" |
rconnorlawson | 0:cf4396614a79 | 25 | |
rconnorlawson | 0:cf4396614a79 | 26 | // Include header files for pacman project |
rconnorlawson | 0:cf4396614a79 | 27 | #include "globals.h" |
rconnorlawson | 0:cf4396614a79 | 28 | #include "math_extra.h" |
rconnorlawson | 0:cf4396614a79 | 29 | #include "physics.h" |
rconnorlawson | 0:cf4396614a79 | 30 | #include "game.h" |
rconnorlawson | 0:cf4396614a79 | 31 | #include "wall.h" |
rconnorlawson | 0:cf4396614a79 | 32 | #include "doublely_linked_list.h" |
rconnorlawson | 0:cf4396614a79 | 33 | |
rconnorlawson | 0:cf4396614a79 | 34 | // Hardware initialization |
abraha2d | 2:2042f29de6b7 | 35 | DigitalIn left_pb(p21); // push button |
abraha2d | 2:2042f29de6b7 | 36 | DigitalIn right_pb(p22); // push button |
abraha2d | 2:2042f29de6b7 | 37 | DigitalIn up_pb(p23); // push button |
abraha2d | 2:2042f29de6b7 | 38 | DigitalIn down_pb(p24); // push button |
rconnorlawson | 0:cf4396614a79 | 39 | uLCD_4DGL uLCD(p9,p10,p11); // LCD (serial tx, serial rx, reset pin;) |
rconnorlawson | 0:cf4396614a79 | 40 | Serial pc(USBTX,USBRX); // used by Accelerometer |
abraha2d | 2:2042f29de6b7 | 41 | MMA8452 acc(p28, p27, 100000); // Accelerometer |
abraha2d | 2:2042f29de6b7 | 42 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem |
abraha2d | 2:2042f29de6b7 | 43 | |
abraha2d | 2:2042f29de6b7 | 44 | DigitalOut redLED(p25); // Red LED |
abraha2d | 2:2042f29de6b7 | 45 | DigitalOut greenLED(p26); // Green LED |
abraha2d | 2:2042f29de6b7 | 46 | Speaker speaker(p18); // Speaker |
abraha2d | 2:2042f29de6b7 | 47 | |
abraha2d | 2:2042f29de6b7 | 48 | // Menu screen drawing functions |
abraha2d | 2:2042f29de6b7 | 49 | void do_main_menu(); |
abraha2d | 2:2042f29de6b7 | 50 | void do_setup_menu(); |
abraha2d | 2:2042f29de6b7 | 51 | void do_help_menu(); |
abraha2d | 2:2042f29de6b7 | 52 | void do_level_start(int); |
abraha2d | 2:2042f29de6b7 | 53 | void do_level_complete(int, int); |
abraha2d | 2:2042f29de6b7 | 54 | void do_game_over(); |
rconnorlawson | 0:cf4396614a79 | 55 | |
rconnorlawson | 0:cf4396614a79 | 56 | // Level creation method declaration |
rconnorlawson | 0:cf4396614a79 | 57 | DLinkedList* create_blank_level(); |
abraha2d | 2:2042f29de6b7 | 58 | DLinkedList* create_level_1(); |
abraha2d | 2:2042f29de6b7 | 59 | DLinkedList* create_level_2(); |
abraha2d | 2:2042f29de6b7 | 60 | DLinkedList* create_level_3(); |
rconnorlawson | 0:cf4396614a79 | 61 | |
rconnorlawson | 0:cf4396614a79 | 62 | // Parameters. Declared in globals.h |
rconnorlawson | 0:cf4396614a79 | 63 | const float mass = 0.001; |
rconnorlawson | 0:cf4396614a79 | 64 | const int radius = 4; |
abraha2d | 2:2042f29de6b7 | 65 | const float bounce = 0.5; |
abraha2d | 2:2042f29de6b7 | 66 | int sound = 1; |
rconnorlawson | 0:cf4396614a79 | 67 | |
rconnorlawson | 0:cf4396614a79 | 68 | /** Main() is where you start your implementation */ |
rconnorlawson | 0:cf4396614a79 | 69 | int main() |
rconnorlawson | 0:cf4396614a79 | 70 | { |
rconnorlawson | 0:cf4396614a79 | 71 | //////////////////////////// |
rconnorlawson | 0:cf4396614a79 | 72 | // Power-on initialization |
rconnorlawson | 0:cf4396614a79 | 73 | //////////////////////////// |
abraha2d | 2:2042f29de6b7 | 74 | |
rconnorlawson | 0:cf4396614a79 | 75 | // Turn up the serial data rate so we don't lag |
rconnorlawson | 0:cf4396614a79 | 76 | uLCD.baudrate(3000000); |
rconnorlawson | 0:cf4396614a79 | 77 | pc.baud(115200); |
rconnorlawson | 0:cf4396614a79 | 78 | |
rconnorlawson | 0:cf4396614a79 | 79 | // Initialize the buttons |
rconnorlawson | 0:cf4396614a79 | 80 | // Each *_pb variable is 0 when pressed |
rconnorlawson | 0:cf4396614a79 | 81 | left_pb.mode(PullUp); |
rconnorlawson | 0:cf4396614a79 | 82 | right_pb.mode(PullUp); |
rconnorlawson | 0:cf4396614a79 | 83 | up_pb.mode(PullUp); |
rconnorlawson | 0:cf4396614a79 | 84 | down_pb.mode(PullUp); |
rconnorlawson | 0:cf4396614a79 | 85 | |
rconnorlawson | 0:cf4396614a79 | 86 | // Other hardware initialization here (SD card, speaker, etc.) |
rconnorlawson | 0:cf4396614a79 | 87 | |
abraha2d | 2:2042f29de6b7 | 88 | DLinkedList* levels = create_dlinkedlist(); |
abraha2d | 2:2042f29de6b7 | 89 | insertTail(levels, create_level_1()); |
abraha2d | 2:2042f29de6b7 | 90 | insertTail(levels, create_level_2()); |
abraha2d | 2:2042f29de6b7 | 91 | insertTail(levels, create_level_3()); |
abraha2d | 2:2042f29de6b7 | 92 | |
abraha2d | 2:2042f29de6b7 | 93 | do_main_menu(); |
abraha2d | 2:2042f29de6b7 | 94 | |
rconnorlawson | 0:cf4396614a79 | 95 | /////////////// |
rconnorlawson | 0:cf4396614a79 | 96 | // Reset loop |
rconnorlawson | 0:cf4396614a79 | 97 | /////////////// |
rconnorlawson | 0:cf4396614a79 | 98 | // This is where control between major phases of the game happens |
rconnorlawson | 0:cf4396614a79 | 99 | // This is a good place to add choose levels, add the game menu, etc. |
abraha2d | 2:2042f29de6b7 | 100 | |
abraha2d | 2:2042f29de6b7 | 101 | // Start with the first level |
abraha2d | 2:2042f29de6b7 | 102 | DLinkedList* arena = (DLinkedList*)getHead(levels); |
abraha2d | 2:2042f29de6b7 | 103 | int level = 1; |
abraha2d | 2:2042f29de6b7 | 104 | |
abraha2d | 2:2042f29de6b7 | 105 | int gameOver = 0; |
abraha2d | 2:2042f29de6b7 | 106 | while(gameOver == 0) { |
abraha2d | 2:2042f29de6b7 | 107 | |
abraha2d | 2:2042f29de6b7 | 108 | do_level_start(level); |
abraha2d | 2:2042f29de6b7 | 109 | |
abraha2d | 2:2042f29de6b7 | 110 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 111 | |
abraha2d | 2:2042f29de6b7 | 112 | // (Re)Initialze game state |
rconnorlawson | 0:cf4396614a79 | 113 | Physics state = {0}; |
abraha2d | 2:2042f29de6b7 | 114 | int ix, iy; |
abraha2d | 2:2042f29de6b7 | 115 | state.px = ix = ((Ball*)getTail(arena))->x; // Initial position of ball |
abraha2d | 2:2042f29de6b7 | 116 | state.py = iy = ((Ball*)getTail(arena))->y; |
abraha2d | 2:2042f29de6b7 | 117 | state.vx = 0.0; // Initial velocity of ball |
rconnorlawson | 0:cf4396614a79 | 118 | state.vy = 0.0; |
rconnorlawson | 0:cf4396614a79 | 119 | |
rconnorlawson | 0:cf4396614a79 | 120 | // Delegate to the game loop to execute the level |
rconnorlawson | 0:cf4396614a79 | 121 | // run_game() is in game.cpp |
abraha2d | 2:2042f29de6b7 | 122 | int ret = run_game(arena, &state); |
abraha2d | 2:2042f29de6b7 | 123 | |
abraha2d | 2:2042f29de6b7 | 124 | // If we hit the goal, advance to the next level |
abraha2d | 2:2042f29de6b7 | 125 | if (ret <= 30) { |
abraha2d | 2:2042f29de6b7 | 126 | |
abraha2d | 2:2042f29de6b7 | 127 | do_level_complete(level++, ret); |
abraha2d | 2:2042f29de6b7 | 128 | |
abraha2d | 2:2042f29de6b7 | 129 | // Destroy the arena and entities once we're done with the level |
abraha2d | 2:2042f29de6b7 | 130 | destroyList(arena); |
abraha2d | 2:2042f29de6b7 | 131 | |
abraha2d | 2:2042f29de6b7 | 132 | // Get the next level |
abraha2d | 2:2042f29de6b7 | 133 | arena = (DLinkedList*)getNext(levels); |
abraha2d | 2:2042f29de6b7 | 134 | // If the next level is NULL, game over! |
abraha2d | 2:2042f29de6b7 | 135 | if (arena == NULL) { |
abraha2d | 2:2042f29de6b7 | 136 | gameOver = 1; |
abraha2d | 2:2042f29de6b7 | 137 | } |
abraha2d | 2:2042f29de6b7 | 138 | |
abraha2d | 2:2042f29de6b7 | 139 | } else { |
abraha2d | 2:2042f29de6b7 | 140 | |
abraha2d | 2:2042f29de6b7 | 141 | if (ret == 32) { |
abraha2d | 2:2042f29de6b7 | 142 | // Show help screen |
abraha2d | 2:2042f29de6b7 | 143 | do_help_menu(); |
abraha2d | 2:2042f29de6b7 | 144 | } else { |
abraha2d | 2:2042f29de6b7 | 145 | // Collision effect |
abraha2d | 2:2042f29de6b7 | 146 | redLED = 1; |
abraha2d | 2:2042f29de6b7 | 147 | for (int i = 4; i < 29; i++) { |
abraha2d | 2:2042f29de6b7 | 148 | redLED = !redLED; |
abraha2d | 2:2042f29de6b7 | 149 | int tone = (29 - i) * 5 + 100; |
abraha2d | 2:2042f29de6b7 | 150 | speaker.PlayNote(tone, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 151 | uLCD.circle(64, 64, i, RED); |
abraha2d | 2:2042f29de6b7 | 152 | uLCD.circle(64, 64, i - 1, 0xFFCC00); |
abraha2d | 2:2042f29de6b7 | 153 | uLCD.circle(64, 64, i - 2, WHITE); |
abraha2d | 2:2042f29de6b7 | 154 | uLCD.circle(64, 64, i - 3, 0); |
abraha2d | 2:2042f29de6b7 | 155 | } |
abraha2d | 2:2042f29de6b7 | 156 | } |
abraha2d | 2:2042f29de6b7 | 157 | |
abraha2d | 2:2042f29de6b7 | 158 | // If we hit a pothole, restart the level by redrawing all elements |
abraha2d | 2:2042f29de6b7 | 159 | // and resetting the state |
abraha2d | 2:2042f29de6b7 | 160 | ArenaElement* elem = (ArenaElement*)getHead(arena); |
abraha2d | 2:2042f29de6b7 | 161 | do { |
abraha2d | 2:2042f29de6b7 | 162 | switch(elem->type) { |
abraha2d | 2:2042f29de6b7 | 163 | case WALL: |
abraha2d | 2:2042f29de6b7 | 164 | // Redraw walls |
abraha2d | 2:2042f29de6b7 | 165 | ((Wall*)elem)->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 166 | break; |
abraha2d | 2:2042f29de6b7 | 167 | case BALL: |
abraha2d | 2:2042f29de6b7 | 168 | // Reset ball position |
abraha2d | 2:2042f29de6b7 | 169 | ((Ball*)elem)->x = ix; |
abraha2d | 2:2042f29de6b7 | 170 | ((Ball*)elem)->y = iy; |
abraha2d | 2:2042f29de6b7 | 171 | break; |
abraha2d | 2:2042f29de6b7 | 172 | case HOLE: |
abraha2d | 2:2042f29de6b7 | 173 | // Redraw holes |
abraha2d | 2:2042f29de6b7 | 174 | ((Hole*)elem)->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 175 | break; |
abraha2d | 2:2042f29de6b7 | 176 | case GOAL: |
abraha2d | 2:2042f29de6b7 | 177 | // Redraw goal |
abraha2d | 2:2042f29de6b7 | 178 | ((Goal*)elem)->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 179 | break; |
abraha2d | 2:2042f29de6b7 | 180 | default: |
abraha2d | 2:2042f29de6b7 | 181 | break; |
abraha2d | 2:2042f29de6b7 | 182 | } |
abraha2d | 2:2042f29de6b7 | 183 | } while(elem = (ArenaElement*)getNext(arena)); |
abraha2d | 2:2042f29de6b7 | 184 | |
abraha2d | 2:2042f29de6b7 | 185 | } |
abraha2d | 2:2042f29de6b7 | 186 | |
abraha2d | 2:2042f29de6b7 | 187 | } |
abraha2d | 2:2042f29de6b7 | 188 | |
abraha2d | 2:2042f29de6b7 | 189 | do_game_over(); |
abraha2d | 2:2042f29de6b7 | 190 | |
abraha2d | 2:2042f29de6b7 | 191 | } |
abraha2d | 2:2042f29de6b7 | 192 | |
abraha2d | 2:2042f29de6b7 | 193 | void do_main_menu() |
abraha2d | 2:2042f29de6b7 | 194 | { |
abraha2d | 2:2042f29de6b7 | 195 | |
abraha2d | 2:2042f29de6b7 | 196 | int cont = 1; |
abraha2d | 2:2042f29de6b7 | 197 | while (cont) { |
abraha2d | 2:2042f29de6b7 | 198 | |
abraha2d | 2:2042f29de6b7 | 199 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 200 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 201 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 202 | uLCD.printf(" Maze Runner! "); |
abraha2d | 2:2042f29de6b7 | 203 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 204 | uLCD.printf(" Play "); |
abraha2d | 2:2042f29de6b7 | 205 | uLCD.printf("\n"); |
abraha2d | 2:2042f29de6b7 | 206 | uLCD.printf(" Setup "); |
abraha2d | 2:2042f29de6b7 | 207 | uLCD.printf("\n"); |
abraha2d | 2:2042f29de6b7 | 208 | uLCD.printf(" Help "); |
abraha2d | 2:2042f29de6b7 | 209 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 210 | |
abraha2d | 2:2042f29de6b7 | 211 | uLCD.rectangle(15, 34, 112, 51, WHITE); |
abraha2d | 2:2042f29de6b7 | 212 | uLCD.rectangle(15, 51, 112, 67, WHITE); |
abraha2d | 2:2042f29de6b7 | 213 | uLCD.rectangle(15, 67, 112, 84, WHITE); |
abraha2d | 2:2042f29de6b7 | 214 | uLCD.rectangle(16, 35, 111, 51, WHITE); |
abraha2d | 2:2042f29de6b7 | 215 | uLCD.rectangle(16, 51, 111, 67, WHITE); |
abraha2d | 2:2042f29de6b7 | 216 | uLCD.rectangle(16, 67, 111, 83, WHITE); |
abraha2d | 2:2042f29de6b7 | 217 | |
abraha2d | 2:2042f29de6b7 | 218 | int offset = 35; |
abraha2d | 2:2042f29de6b7 | 219 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, BLUE); |
abraha2d | 2:2042f29de6b7 | 220 | |
abraha2d | 2:2042f29de6b7 | 221 | int rpb = right_pb; |
abraha2d | 2:2042f29de6b7 | 222 | int upb = up_pb; |
abraha2d | 2:2042f29de6b7 | 223 | int dpb = down_pb; |
abraha2d | 2:2042f29de6b7 | 224 | int rpb2 = rpb; |
abraha2d | 2:2042f29de6b7 | 225 | int upb2 = upb; |
abraha2d | 2:2042f29de6b7 | 226 | int dpb2 = dpb; |
abraha2d | 2:2042f29de6b7 | 227 | |
abraha2d | 2:2042f29de6b7 | 228 | int cont2 = 1; |
abraha2d | 2:2042f29de6b7 | 229 | while(cont2) { |
abraha2d | 2:2042f29de6b7 | 230 | |
abraha2d | 2:2042f29de6b7 | 231 | int crpb = right_pb; |
abraha2d | 2:2042f29de6b7 | 232 | int cupb = up_pb; |
abraha2d | 2:2042f29de6b7 | 233 | int cdpb = down_pb; |
abraha2d | 2:2042f29de6b7 | 234 | |
abraha2d | 2:2042f29de6b7 | 235 | if (!cupb && upb && upb2) { |
abraha2d | 2:2042f29de6b7 | 236 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, WHITE); |
abraha2d | 2:2042f29de6b7 | 237 | if (offset > 35) { |
abraha2d | 2:2042f29de6b7 | 238 | offset -= 16; |
abraha2d | 2:2042f29de6b7 | 239 | } |
abraha2d | 2:2042f29de6b7 | 240 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, BLUE); |
abraha2d | 2:2042f29de6b7 | 241 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 242 | } |
abraha2d | 2:2042f29de6b7 | 243 | |
abraha2d | 2:2042f29de6b7 | 244 | if (!cdpb && dpb && dpb2) { |
abraha2d | 2:2042f29de6b7 | 245 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, WHITE); |
abraha2d | 2:2042f29de6b7 | 246 | if (offset < 67) { |
abraha2d | 2:2042f29de6b7 | 247 | offset += 16; |
abraha2d | 2:2042f29de6b7 | 248 | } |
abraha2d | 2:2042f29de6b7 | 249 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, BLUE); |
abraha2d | 2:2042f29de6b7 | 250 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 251 | } |
abraha2d | 2:2042f29de6b7 | 252 | |
abraha2d | 2:2042f29de6b7 | 253 | if (!crpb && rpb && rpb2) { |
abraha2d | 2:2042f29de6b7 | 254 | |
abraha2d | 2:2042f29de6b7 | 255 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, GREEN); |
abraha2d | 2:2042f29de6b7 | 256 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 257 | wait(0.25); |
abraha2d | 2:2042f29de6b7 | 258 | |
abraha2d | 2:2042f29de6b7 | 259 | if (offset == 51) { |
abraha2d | 2:2042f29de6b7 | 260 | do_setup_menu(); |
abraha2d | 2:2042f29de6b7 | 261 | cont2 = 0; |
abraha2d | 2:2042f29de6b7 | 262 | } else if (offset == 67) { |
abraha2d | 2:2042f29de6b7 | 263 | do_help_menu(); |
abraha2d | 2:2042f29de6b7 | 264 | cont2 = 0; |
abraha2d | 2:2042f29de6b7 | 265 | } else { |
abraha2d | 2:2042f29de6b7 | 266 | cont = 0; |
abraha2d | 2:2042f29de6b7 | 267 | cont2 = 0; |
abraha2d | 2:2042f29de6b7 | 268 | } |
abraha2d | 2:2042f29de6b7 | 269 | |
abraha2d | 2:2042f29de6b7 | 270 | } |
abraha2d | 2:2042f29de6b7 | 271 | |
abraha2d | 2:2042f29de6b7 | 272 | rpb2 = rpb; |
abraha2d | 2:2042f29de6b7 | 273 | upb2 = upb; |
abraha2d | 2:2042f29de6b7 | 274 | dpb2 = dpb; |
abraha2d | 2:2042f29de6b7 | 275 | rpb = crpb; |
abraha2d | 2:2042f29de6b7 | 276 | upb = cupb; |
abraha2d | 2:2042f29de6b7 | 277 | dpb = cdpb; |
abraha2d | 2:2042f29de6b7 | 278 | |
abraha2d | 2:2042f29de6b7 | 279 | } |
abraha2d | 2:2042f29de6b7 | 280 | |
abraha2d | 2:2042f29de6b7 | 281 | } |
abraha2d | 2:2042f29de6b7 | 282 | |
abraha2d | 2:2042f29de6b7 | 283 | } |
abraha2d | 2:2042f29de6b7 | 284 | |
abraha2d | 2:2042f29de6b7 | 285 | void do_setup_menu() |
abraha2d | 2:2042f29de6b7 | 286 | { |
abraha2d | 2:2042f29de6b7 | 287 | |
abraha2d | 2:2042f29de6b7 | 288 | int cont = 1; |
abraha2d | 2:2042f29de6b7 | 289 | while (cont) { |
abraha2d | 2:2042f29de6b7 | 290 | |
abraha2d | 2:2042f29de6b7 | 291 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 292 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 293 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 294 | uLCD.printf(" Setup "); |
abraha2d | 2:2042f29de6b7 | 295 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 296 | if (sound) { |
abraha2d | 2:2042f29de6b7 | 297 | uLCD.printf(" Sound ON "); |
abraha2d | 2:2042f29de6b7 | 298 | } else { |
abraha2d | 2:2042f29de6b7 | 299 | uLCD.printf(" Sound OFF "); |
abraha2d | 2:2042f29de6b7 | 300 | } |
abraha2d | 2:2042f29de6b7 | 301 | |
abraha2d | 2:2042f29de6b7 | 302 | int offset = 35; |
abraha2d | 2:2042f29de6b7 | 303 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, BLUE); |
abraha2d | 2:2042f29de6b7 | 304 | |
abraha2d | 2:2042f29de6b7 | 305 | int lpb = left_pb; |
abraha2d | 2:2042f29de6b7 | 306 | int rpb = right_pb; |
abraha2d | 2:2042f29de6b7 | 307 | |
abraha2d | 2:2042f29de6b7 | 308 | int cont2 = 1; |
abraha2d | 2:2042f29de6b7 | 309 | while(cont2) { |
abraha2d | 2:2042f29de6b7 | 310 | |
abraha2d | 2:2042f29de6b7 | 311 | int clpb = left_pb; |
abraha2d | 2:2042f29de6b7 | 312 | int crpb = right_pb; |
abraha2d | 2:2042f29de6b7 | 313 | |
abraha2d | 2:2042f29de6b7 | 314 | if (!crpb && rpb) { |
abraha2d | 2:2042f29de6b7 | 315 | uLCD.rectangle(16, 0 + offset, 111, 16 + offset, GREEN); |
abraha2d | 2:2042f29de6b7 | 316 | wait(0.25); |
abraha2d | 2:2042f29de6b7 | 317 | if (sound == 1) { |
abraha2d | 2:2042f29de6b7 | 318 | sound = 0; |
abraha2d | 2:2042f29de6b7 | 319 | } else { |
abraha2d | 2:2042f29de6b7 | 320 | sound = 1; |
abraha2d | 2:2042f29de6b7 | 321 | } |
abraha2d | 2:2042f29de6b7 | 322 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 323 | cont2 = 0; |
abraha2d | 2:2042f29de6b7 | 324 | } |
abraha2d | 2:2042f29de6b7 | 325 | |
abraha2d | 2:2042f29de6b7 | 326 | if (!clpb && lpb) { |
abraha2d | 2:2042f29de6b7 | 327 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 328 | cont = 0; |
abraha2d | 2:2042f29de6b7 | 329 | cont2 = 0; |
abraha2d | 2:2042f29de6b7 | 330 | } |
abraha2d | 2:2042f29de6b7 | 331 | |
abraha2d | 2:2042f29de6b7 | 332 | lpb = clpb; |
abraha2d | 2:2042f29de6b7 | 333 | rpb = crpb; |
abraha2d | 2:2042f29de6b7 | 334 | |
abraha2d | 2:2042f29de6b7 | 335 | } |
abraha2d | 2:2042f29de6b7 | 336 | |
abraha2d | 2:2042f29de6b7 | 337 | } |
abraha2d | 2:2042f29de6b7 | 338 | |
abraha2d | 2:2042f29de6b7 | 339 | } |
abraha2d | 2:2042f29de6b7 | 340 | |
abraha2d | 2:2042f29de6b7 | 341 | void do_help_menu() |
abraha2d | 2:2042f29de6b7 | 342 | { |
abraha2d | 2:2042f29de6b7 | 343 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 344 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 345 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 346 | uLCD.printf(" Help "); |
abraha2d | 2:2042f29de6b7 | 347 | uLCD.printf("\n\n"); |
abraha2d | 2:2042f29de6b7 | 348 | |
abraha2d | 2:2042f29de6b7 | 349 | uLCD.printf("Tilt the game to "); |
abraha2d | 2:2042f29de6b7 | 350 | uLCD.printf("get through the "); |
abraha2d | 2:2042f29de6b7 | 351 | uLCD.printf("maze to the "); |
abraha2d | 2:2042f29de6b7 | 352 | uLCD.color(GREEN); |
abraha2d | 2:2042f29de6b7 | 353 | uLCD.printf("green "); |
abraha2d | 2:2042f29de6b7 | 354 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 355 | uLCD.printf("dot. Don't touch "); |
abraha2d | 2:2042f29de6b7 | 356 | uLCD.printf("the "); |
abraha2d | 2:2042f29de6b7 | 357 | uLCD.color(RED); |
abraha2d | 2:2042f29de6b7 | 358 | uLCD.printf("red"); |
abraha2d | 2:2042f29de6b7 | 359 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 360 | uLCD.printf(" dots! "); |
abraha2d | 2:2042f29de6b7 | 361 | uLCD.printf("\n"); |
abraha2d | 2:2042f29de6b7 | 362 | |
abraha2d | 2:2042f29de6b7 | 363 | uLCD.color(BLUE); |
abraha2d | 2:2042f29de6b7 | 364 | uLCD.printf("UP"); |
abraha2d | 2:2042f29de6b7 | 365 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 366 | uLCD.printf(" saves state. "); |
abraha2d | 2:2042f29de6b7 | 367 | uLCD.printf("\n"); |
abraha2d | 2:2042f29de6b7 | 368 | |
abraha2d | 2:2042f29de6b7 | 369 | uLCD.color(BLUE); |
abraha2d | 2:2042f29de6b7 | 370 | uLCD.printf("DOWN"); |
abraha2d | 2:2042f29de6b7 | 371 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 372 | uLCD.printf(" jumps to the "); |
abraha2d | 2:2042f29de6b7 | 373 | uLCD.printf("last saved state. "); |
abraha2d | 2:2042f29de6b7 | 374 | |
abraha2d | 2:2042f29de6b7 | 375 | while(left_pb) {} |
abraha2d | 2:2042f29de6b7 | 376 | |
abraha2d | 2:2042f29de6b7 | 377 | speaker.PlayNote(100, 0.01, sound); |
abraha2d | 2:2042f29de6b7 | 378 | |
abraha2d | 2:2042f29de6b7 | 379 | } |
rconnorlawson | 0:cf4396614a79 | 380 | |
abraha2d | 2:2042f29de6b7 | 381 | void do_level_start(int level) |
abraha2d | 2:2042f29de6b7 | 382 | { |
abraha2d | 2:2042f29de6b7 | 383 | |
abraha2d | 2:2042f29de6b7 | 384 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 385 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 386 | uLCD.printf("\n\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 387 | uLCD.printf(" Level %d ", level); |
abraha2d | 2:2042f29de6b7 | 388 | uLCD.printf("\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 389 | |
abraha2d | 2:2042f29de6b7 | 390 | uLCD.rectangle(16, 19, 103, 51, WHITE); |
abraha2d | 2:2042f29de6b7 | 391 | |
abraha2d | 2:2042f29de6b7 | 392 | uLCD.printf(" "); |
abraha2d | 2:2042f29de6b7 | 393 | for (int i = 3; i > 0; i--) { |
abraha2d | 2:2042f29de6b7 | 394 | redLED = 1; |
abraha2d | 2:2042f29de6b7 | 395 | uLCD.printf("%i... ", i); |
abraha2d | 2:2042f29de6b7 | 396 | speaker.PlayNote(293.665, 0.25, sound); |
abraha2d | 2:2042f29de6b7 | 397 | redLED = 0; |
abraha2d | 2:2042f29de6b7 | 398 | wait(0.75); |
rconnorlawson | 0:cf4396614a79 | 399 | } |
abraha2d | 2:2042f29de6b7 | 400 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 401 | uLCD.printf("\n\n Go!"); |
abraha2d | 2:2042f29de6b7 | 402 | speaker.PlayNote(391.995, 0.75, sound); |
abraha2d | 2:2042f29de6b7 | 403 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 404 | |
abraha2d | 2:2042f29de6b7 | 405 | } |
abraha2d | 2:2042f29de6b7 | 406 | |
abraha2d | 2:2042f29de6b7 | 407 | void do_level_complete(int level, int time) |
abraha2d | 2:2042f29de6b7 | 408 | { |
abraha2d | 2:2042f29de6b7 | 409 | |
abraha2d | 2:2042f29de6b7 | 410 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 411 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 412 | uLCD.printf("\n\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 413 | uLCD.printf(" Level %d \n", level); |
abraha2d | 2:2042f29de6b7 | 414 | uLCD.printf(" Complete! "); |
abraha2d | 2:2042f29de6b7 | 415 | uLCD.printf("\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 416 | uLCD.printf(" Score: %d/30 ", time); |
abraha2d | 2:2042f29de6b7 | 417 | |
abraha2d | 2:2042f29de6b7 | 418 | uLCD.rectangle(16, 19, 103, 67, WHITE); |
abraha2d | 2:2042f29de6b7 | 419 | |
abraha2d | 2:2042f29de6b7 | 420 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 421 | speaker.PlayNote(391.995, 0.12, sound); |
abraha2d | 2:2042f29de6b7 | 422 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 423 | wait(0.12); |
abraha2d | 2:2042f29de6b7 | 424 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 425 | speaker.PlayNote(493.883, 0.12, sound); |
abraha2d | 2:2042f29de6b7 | 426 | speaker.PlayNote(587.330, 0.24, sound); |
abraha2d | 2:2042f29de6b7 | 427 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 428 | wait(1); |
abraha2d | 2:2042f29de6b7 | 429 | |
abraha2d | 2:2042f29de6b7 | 430 | } |
abraha2d | 2:2042f29de6b7 | 431 | |
abraha2d | 2:2042f29de6b7 | 432 | void do_game_over() |
abraha2d | 2:2042f29de6b7 | 433 | { |
abraha2d | 2:2042f29de6b7 | 434 | uLCD.cls(); |
abraha2d | 2:2042f29de6b7 | 435 | uLCD.color(WHITE); |
abraha2d | 2:2042f29de6b7 | 436 | uLCD.printf("\n\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 437 | uLCD.printf(" Game Over! "); |
abraha2d | 2:2042f29de6b7 | 438 | uLCD.printf("\n\n\n"); |
abraha2d | 2:2042f29de6b7 | 439 | |
abraha2d | 2:2042f29de6b7 | 440 | uLCD.rectangle(16, 19, 103, 51, WHITE); |
abraha2d | 2:2042f29de6b7 | 441 | |
abraha2d | 2:2042f29de6b7 | 442 | uLCD.printf(" Press the blue "); |
abraha2d | 2:2042f29de6b7 | 443 | uLCD.printf(" button to play "); |
abraha2d | 2:2042f29de6b7 | 444 | uLCD.printf(" again! "); |
abraha2d | 2:2042f29de6b7 | 445 | |
abraha2d | 2:2042f29de6b7 | 446 | |
abraha2d | 2:2042f29de6b7 | 447 | |
abraha2d | 2:2042f29de6b7 | 448 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 449 | speaker.PlayNote(587.330, 0.2, sound); |
abraha2d | 2:2042f29de6b7 | 450 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 451 | wait(0.2); |
abraha2d | 2:2042f29de6b7 | 452 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 453 | speaker.PlayNote(587.330, 0.1, sound); |
abraha2d | 2:2042f29de6b7 | 454 | wait(0.1); |
abraha2d | 2:2042f29de6b7 | 455 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 456 | speaker.PlayNote(587.330, 0.2, sound); |
abraha2d | 2:2042f29de6b7 | 457 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 458 | speaker.PlayNote(493.883, 0.2, sound); |
abraha2d | 2:2042f29de6b7 | 459 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 460 | speaker.PlayNote(587.330, 0.1, sound); |
abraha2d | 2:2042f29de6b7 | 461 | wait(0.1); |
abraha2d | 2:2042f29de6b7 | 462 | greenLED = 1; |
abraha2d | 2:2042f29de6b7 | 463 | speaker.PlayNote(783.991, 0.5, sound); |
abraha2d | 2:2042f29de6b7 | 464 | greenLED = 0; |
abraha2d | 2:2042f29de6b7 | 465 | } |
abraha2d | 2:2042f29de6b7 | 466 | |
abraha2d | 2:2042f29de6b7 | 467 | /** Creates the first level. */ |
abraha2d | 2:2042f29de6b7 | 468 | DLinkedList* create_level_1() |
abraha2d | 2:2042f29de6b7 | 469 | { |
abraha2d | 2:2042f29de6b7 | 470 | DLinkedList* arena = create_dlinkedlist(); |
abraha2d | 2:2042f29de6b7 | 471 | |
abraha2d | 2:2042f29de6b7 | 472 | // Initialize the walls |
abraha2d | 2:2042f29de6b7 | 473 | Wall* walls[12]; |
abraha2d | 2:2042f29de6b7 | 474 | walls[0] = create_wall(HORIZONTAL, 0, 2, 127, bounce); // top |
abraha2d | 2:2042f29de6b7 | 475 | walls[1] = create_wall(HORIZONTAL, 0, 127, 127, bounce);// bottom |
abraha2d | 2:2042f29de6b7 | 476 | walls[2] = create_wall(VERTICAL, 0, 2, 127, bounce); // left |
abraha2d | 2:2042f29de6b7 | 477 | walls[3] = create_wall(VERTICAL, 127, 2, 127, bounce); // right |
abraha2d | 2:2042f29de6b7 | 478 | walls[4] = create_wall(VERTICAL, 21, 21, 84, bounce); |
abraha2d | 2:2042f29de6b7 | 479 | walls[5] = create_wall(VERTICAL, 42, 2, 42, bounce); |
abraha2d | 2:2042f29de6b7 | 480 | walls[6] = create_wall(VERTICAL, 63, 21, 106, bounce); |
abraha2d | 2:2042f29de6b7 | 481 | walls[7] = create_wall(VERTICAL, 84, 64, 32, bounce); |
abraha2d | 2:2042f29de6b7 | 482 | walls[8] = create_wall(VERTICAL, 42, 84, 21, bounce); |
abraha2d | 2:2042f29de6b7 | 483 | walls[9] = create_wall(HORIZONTAL, 21, 64, 42, bounce); |
abraha2d | 2:2042f29de6b7 | 484 | walls[10] = create_wall(HORIZONTAL, 21, 105, 21, bounce); |
abraha2d | 2:2042f29de6b7 | 485 | walls[11] = create_wall(HORIZONTAL, 84, 64, 43, bounce); |
abraha2d | 2:2042f29de6b7 | 486 | |
abraha2d | 2:2042f29de6b7 | 487 | // Add the walls to the arena |
abraha2d | 2:2042f29de6b7 | 488 | for (int i = 0; i < 12; i++) |
abraha2d | 2:2042f29de6b7 | 489 | insertTail(arena, (void*)walls[i]); |
abraha2d | 2:2042f29de6b7 | 490 | |
abraha2d | 2:2042f29de6b7 | 491 | // Initialize the goal |
abraha2d | 2:2042f29de6b7 | 492 | Goal* goal = (Goal*) malloc(sizeof(Goal)); |
abraha2d | 2:2042f29de6b7 | 493 | goal->type = GOAL; |
abraha2d | 2:2042f29de6b7 | 494 | goal->x = 95; |
abraha2d | 2:2042f29de6b7 | 495 | goal->y = 80; |
abraha2d | 2:2042f29de6b7 | 496 | goal->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 497 | |
abraha2d | 2:2042f29de6b7 | 498 | // Add goal to the arena |
abraha2d | 2:2042f29de6b7 | 499 | insertTail(arena, (void*)goal); |
abraha2d | 2:2042f29de6b7 | 500 | |
abraha2d | 2:2042f29de6b7 | 501 | // Initialize the ball |
abraha2d | 2:2042f29de6b7 | 502 | Ball* ball = (Ball*) malloc(sizeof(Ball)); |
abraha2d | 2:2042f29de6b7 | 503 | ball->type = BALL; |
abraha2d | 2:2042f29de6b7 | 504 | ball->x = 31; |
abraha2d | 2:2042f29de6b7 | 505 | ball->y = 95; |
abraha2d | 2:2042f29de6b7 | 506 | |
abraha2d | 2:2042f29de6b7 | 507 | // Add ball to the arena |
abraha2d | 2:2042f29de6b7 | 508 | insertTail(arena, (void*)ball); |
abraha2d | 2:2042f29de6b7 | 509 | |
abraha2d | 2:2042f29de6b7 | 510 | return arena; |
abraha2d | 2:2042f29de6b7 | 511 | } |
abraha2d | 2:2042f29de6b7 | 512 | |
abraha2d | 2:2042f29de6b7 | 513 | /** Creates the second level. */ |
abraha2d | 2:2042f29de6b7 | 514 | DLinkedList* create_level_2() |
abraha2d | 2:2042f29de6b7 | 515 | { |
abraha2d | 2:2042f29de6b7 | 516 | DLinkedList* arena = create_dlinkedlist(); |
abraha2d | 2:2042f29de6b7 | 517 | |
abraha2d | 2:2042f29de6b7 | 518 | // Initialize the walls |
abraha2d | 2:2042f29de6b7 | 519 | Wall* walls[15]; |
abraha2d | 2:2042f29de6b7 | 520 | walls[0] = create_wall(HORIZONTAL, 0, 2, 127, bounce); // top |
abraha2d | 2:2042f29de6b7 | 521 | walls[1] = create_wall(HORIZONTAL, 0, 127, 127, bounce);// bottom |
abraha2d | 2:2042f29de6b7 | 522 | walls[2] = create_wall(VERTICAL, 0, 2, 127, bounce); // left |
abraha2d | 2:2042f29de6b7 | 523 | walls[3] = create_wall(VERTICAL, 127, 2, 127, bounce); // right |
abraha2d | 2:2042f29de6b7 | 524 | walls[4] = create_wall(VERTICAL, 64, 2, 21, bounce); |
abraha2d | 2:2042f29de6b7 | 525 | walls[5] = create_wall(HORIZONTAL, 0, 21, 32, bounce); |
abraha2d | 2:2042f29de6b7 | 526 | walls[6] = create_wall(VERTICAL, 32, 21, 43, bounce); |
abraha2d | 2:2042f29de6b7 | 527 | walls[7] = create_wall(VERTICAL, 96, 21, 22, bounce); |
abraha2d | 2:2042f29de6b7 | 528 | walls[8] = create_wall(HORIZONTAL, 64, 43, 63, bounce); |
abraha2d | 2:2042f29de6b7 | 529 | walls[9] = create_wall(HORIZONTAL, 32, 64, 32, bounce); |
abraha2d | 2:2042f29de6b7 | 530 | walls[10] = create_wall(HORIZONTAL, 64, 85, 32, bounce); |
abraha2d | 2:2042f29de6b7 | 531 | walls[11] = create_wall(VERTICAL, 64, 85, 42, bounce); |
abraha2d | 2:2042f29de6b7 | 532 | walls[12] = create_wall(HORIZONTAL, 0, 85, 32, bounce); |
abraha2d | 2:2042f29de6b7 | 533 | walls[13] = create_wall(VERTICAL, 32, 85, 22, bounce); |
abraha2d | 2:2042f29de6b7 | 534 | walls[14] = create_wall(HORIZONTAL, 96, 107, 31, bounce); |
abraha2d | 2:2042f29de6b7 | 535 | |
abraha2d | 2:2042f29de6b7 | 536 | // Add the walls to the arena |
abraha2d | 2:2042f29de6b7 | 537 | for (int i = 0; i < 15; i++) |
abraha2d | 2:2042f29de6b7 | 538 | insertTail(arena, (void*)walls[i]); |
abraha2d | 2:2042f29de6b7 | 539 | |
abraha2d | 2:2042f29de6b7 | 540 | // Initialize a hole |
abraha2d | 2:2042f29de6b7 | 541 | Hole* hole = (Hole*) malloc(sizeof(Hole)); |
abraha2d | 2:2042f29de6b7 | 542 | hole->type = HOLE; |
abraha2d | 2:2042f29de6b7 | 543 | hole->x = 96; |
abraha2d | 2:2042f29de6b7 | 544 | hole->y = 64; |
abraha2d | 2:2042f29de6b7 | 545 | hole->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 546 | |
abraha2d | 2:2042f29de6b7 | 547 | // Add hole to the arena |
abraha2d | 2:2042f29de6b7 | 548 | insertTail(arena, (void*)hole); |
abraha2d | 2:2042f29de6b7 | 549 | |
abraha2d | 2:2042f29de6b7 | 550 | // Initialize the goal |
abraha2d | 2:2042f29de6b7 | 551 | Goal* goal = (Goal*) malloc(sizeof(Goal)); |
abraha2d | 2:2042f29de6b7 | 552 | goal->type = GOAL; |
abraha2d | 2:2042f29de6b7 | 553 | goal->x = 112; |
abraha2d | 2:2042f29de6b7 | 554 | goal->y = 21; |
abraha2d | 2:2042f29de6b7 | 555 | goal->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 556 | |
abraha2d | 2:2042f29de6b7 | 557 | // Add goal to the arena |
abraha2d | 2:2042f29de6b7 | 558 | insertTail(arena, (void*)goal); |
abraha2d | 2:2042f29de6b7 | 559 | |
abraha2d | 2:2042f29de6b7 | 560 | // Initialize the ball |
abraha2d | 2:2042f29de6b7 | 561 | Ball* ball = (Ball*) malloc(sizeof(Ball)); |
abraha2d | 2:2042f29de6b7 | 562 | ball->type = BALL; |
abraha2d | 2:2042f29de6b7 | 563 | ball->x = 16; |
abraha2d | 2:2042f29de6b7 | 564 | ball->y = 96; |
abraha2d | 2:2042f29de6b7 | 565 | |
abraha2d | 2:2042f29de6b7 | 566 | // Add ball to the arena |
abraha2d | 2:2042f29de6b7 | 567 | insertTail(arena, (void*)ball); |
abraha2d | 2:2042f29de6b7 | 568 | |
abraha2d | 2:2042f29de6b7 | 569 | return arena; |
abraha2d | 2:2042f29de6b7 | 570 | } |
abraha2d | 2:2042f29de6b7 | 571 | |
abraha2d | 2:2042f29de6b7 | 572 | /** Creates the third level. */ |
abraha2d | 2:2042f29de6b7 | 573 | DLinkedList* create_level_3() |
abraha2d | 2:2042f29de6b7 | 574 | { |
abraha2d | 2:2042f29de6b7 | 575 | DLinkedList* arena = create_dlinkedlist(); |
abraha2d | 2:2042f29de6b7 | 576 | |
abraha2d | 2:2042f29de6b7 | 577 | // Initialize the walls |
abraha2d | 2:2042f29de6b7 | 578 | Wall* walls[15]; |
abraha2d | 2:2042f29de6b7 | 579 | walls[0] = create_wall(HORIZONTAL, 0, 2, 127, bounce); // top |
abraha2d | 2:2042f29de6b7 | 580 | walls[1] = create_wall(HORIZONTAL, 0, 127, 127, bounce);// bottom |
abraha2d | 2:2042f29de6b7 | 581 | walls[2] = create_wall(VERTICAL, 0, 2, 127, bounce); // left |
abraha2d | 2:2042f29de6b7 | 582 | walls[3] = create_wall(VERTICAL, 127, 2, 127, bounce); // right |
abraha2d | 2:2042f29de6b7 | 583 | walls[4] = create_wall(HORIZONTAL, 0, 18, 107, bounce); |
abraha2d | 2:2042f29de6b7 | 584 | walls[5] = create_wall(VERTICAL, 107, 18, 92, bounce); |
abraha2d | 2:2042f29de6b7 | 585 | walls[6] = create_wall(HORIZONTAL, 64, 110, 43, bounce); |
abraha2d | 2:2042f29de6b7 | 586 | walls[7] = create_wall(HORIZONTAL, 43, 91, 42, bounce); |
abraha2d | 2:2042f29de6b7 | 587 | walls[8] = create_wall(VERTICAL, 43, 91, 36, bounce); |
abraha2d | 2:2042f29de6b7 | 588 | walls[9] = create_wall(HORIZONTAL, 0, 91, 21, bounce); |
abraha2d | 2:2042f29de6b7 | 589 | walls[10] = create_wall(VERTICAL, 21, 73, 18, bounce); |
abraha2d | 2:2042f29de6b7 | 590 | walls[11] = create_wall(HORIZONTAL, 21, 73, 64, bounce); |
abraha2d | 2:2042f29de6b7 | 591 | walls[12] = create_wall(VERTICAL, 85, 37, 36, bounce); |
abraha2d | 2:2042f29de6b7 | 592 | walls[13] = create_wall(HORIZONTAL, 21, 37, 64, bounce); |
abraha2d | 2:2042f29de6b7 | 593 | walls[14] = create_wall(HORIZONTAL, 0, 55, 43, bounce); |
abraha2d | 2:2042f29de6b7 | 594 | |
abraha2d | 2:2042f29de6b7 | 595 | // Add the walls to the arena |
abraha2d | 2:2042f29de6b7 | 596 | for (int i = 0; i < 15; i++) |
abraha2d | 2:2042f29de6b7 | 597 | insertTail(arena, (void*)walls[i]); |
abraha2d | 2:2042f29de6b7 | 598 | |
abraha2d | 2:2042f29de6b7 | 599 | // Initialize a hole |
abraha2d | 2:2042f29de6b7 | 600 | Hole* hole = (Hole*) malloc(sizeof(Hole)); |
abraha2d | 2:2042f29de6b7 | 601 | hole->type = HOLE; |
abraha2d | 2:2042f29de6b7 | 602 | hole->x = 96; |
abraha2d | 2:2042f29de6b7 | 603 | hole->y = 82; |
abraha2d | 2:2042f29de6b7 | 604 | hole->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 605 | |
abraha2d | 2:2042f29de6b7 | 606 | // Add hole to the arena |
abraha2d | 2:2042f29de6b7 | 607 | insertTail(arena, (void*)hole); |
abraha2d | 2:2042f29de6b7 | 608 | |
abraha2d | 2:2042f29de6b7 | 609 | // Initialize a hole |
abraha2d | 2:2042f29de6b7 | 610 | Hole* hole2 = (Hole*) malloc(sizeof(Hole)); |
abraha2d | 2:2042f29de6b7 | 611 | hole2->type = HOLE; |
abraha2d | 2:2042f29de6b7 | 612 | hole2->x = 64; |
abraha2d | 2:2042f29de6b7 | 613 | hole2->y = 55; |
abraha2d | 2:2042f29de6b7 | 614 | hole2->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 615 | |
abraha2d | 2:2042f29de6b7 | 616 | // Add hole to the arena |
abraha2d | 2:2042f29de6b7 | 617 | insertTail(arena, (void*)hole2); |
abraha2d | 2:2042f29de6b7 | 618 | |
abraha2d | 2:2042f29de6b7 | 619 | // Initialize the goal |
abraha2d | 2:2042f29de6b7 | 620 | Goal* goal = (Goal*) malloc(sizeof(Goal)); |
abraha2d | 2:2042f29de6b7 | 621 | goal->type = GOAL; |
abraha2d | 2:2042f29de6b7 | 622 | goal->x = 11; |
abraha2d | 2:2042f29de6b7 | 623 | goal->y = 82; |
abraha2d | 2:2042f29de6b7 | 624 | goal->should_draw = 1; |
abraha2d | 2:2042f29de6b7 | 625 | |
abraha2d | 2:2042f29de6b7 | 626 | // Add goal to the arena |
abraha2d | 2:2042f29de6b7 | 627 | insertTail(arena, (void*)goal); |
abraha2d | 2:2042f29de6b7 | 628 | |
abraha2d | 2:2042f29de6b7 | 629 | // Initialize the ball |
abraha2d | 2:2042f29de6b7 | 630 | Ball* ball = (Ball*) malloc(sizeof(Ball)); |
abraha2d | 2:2042f29de6b7 | 631 | ball->type = BALL; |
abraha2d | 2:2042f29de6b7 | 632 | ball->x = 21; |
abraha2d | 2:2042f29de6b7 | 633 | ball->y = 110; |
abraha2d | 2:2042f29de6b7 | 634 | |
abraha2d | 2:2042f29de6b7 | 635 | // Add ball to the arena |
abraha2d | 2:2042f29de6b7 | 636 | insertTail(arena, (void*)ball); |
abraha2d | 2:2042f29de6b7 | 637 | |
abraha2d | 2:2042f29de6b7 | 638 | return arena; |
rconnorlawson | 0:cf4396614a79 | 639 | } |
rconnorlawson | 0:cf4396614a79 | 640 | |
rconnorlawson | 0:cf4396614a79 | 641 | /** Creates a level with only bounding walls and a ball. */ |
rconnorlawson | 0:cf4396614a79 | 642 | DLinkedList* create_blank_level() |
rconnorlawson | 0:cf4396614a79 | 643 | { |
rconnorlawson | 0:cf4396614a79 | 644 | DLinkedList* arena = create_dlinkedlist(); |
rconnorlawson | 0:cf4396614a79 | 645 | |
rconnorlawson | 0:cf4396614a79 | 646 | // Initialize the walls |
rconnorlawson | 0:cf4396614a79 | 647 | Wall* walls[4]; |
abraha2d | 2:2042f29de6b7 | 648 | walls[0] = create_wall(HORIZONTAL, 0, 2, 127, bounce); // top |
rconnorlawson | 0:cf4396614a79 | 649 | walls[1] = create_wall(HORIZONTAL, 0, 127, 127, bounce);// bottom |
rconnorlawson | 0:cf4396614a79 | 650 | walls[2] = create_wall(VERTICAL, 0, 0, 127, bounce); // left |
rconnorlawson | 0:cf4396614a79 | 651 | walls[3] = create_wall(VERTICAL, 127, 0, 127, bounce); // right |
abraha2d | 2:2042f29de6b7 | 652 | |
rconnorlawson | 0:cf4396614a79 | 653 | // Add the walls to the arena |
rconnorlawson | 0:cf4396614a79 | 654 | for (int i = 0; i < 4; i++) |
rconnorlawson | 0:cf4396614a79 | 655 | insertTail(arena, (void*)walls[i]); |
rconnorlawson | 0:cf4396614a79 | 656 | |
rconnorlawson | 0:cf4396614a79 | 657 | // Initialize the ball |
rconnorlawson | 0:cf4396614a79 | 658 | Ball* ball = (Ball*) malloc(sizeof(Ball)); |
rconnorlawson | 0:cf4396614a79 | 659 | ball->type = BALL; |
rconnorlawson | 0:cf4396614a79 | 660 | ball->x = 20; |
rconnorlawson | 0:cf4396614a79 | 661 | ball->y = 20; |
abraha2d | 2:2042f29de6b7 | 662 | |
abraha2d | 2:2042f29de6b7 | 663 | // Add ball to the arena |
abraha2d | 2:2042f29de6b7 | 664 | // NOTE: The ball should always be last in the arena list, so that the other |
abraha2d | 2:2042f29de6b7 | 665 | // ArenaElements have a chance to compute the Physics updates before the |
rconnorlawson | 0:cf4396614a79 | 666 | // ball applies forward euler method. |
rconnorlawson | 0:cf4396614a79 | 667 | insertTail(arena, (void*)ball); |
abraha2d | 2:2042f29de6b7 | 668 | |
rconnorlawson | 0:cf4396614a79 | 669 | return arena; |
rconnorlawson | 0:cf4396614a79 | 670 | } |