ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

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?

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