Brian Eason / Mbed 2 deprecated BrickBreak

Dependencies:   mbed

Committer:
brianeason92
Date:
Tue Nov 01 18:29:26 2016 +0000
Revision:
0:64079f49da67
Full functioning brick break game for lab 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brianeason92 0:64079f49da67 1 #include "mbed.h"
brianeason92 0:64079f49da67 2 #include "uLCD_4DGL.h"
brianeason92 0:64079f49da67 3
brianeason92 0:64079f49da67 4 /* ==== Navigation Switch ===== */
brianeason92 0:64079f49da67 5 class Nav_Switch
brianeason92 0:64079f49da67 6 {
brianeason92 0:64079f49da67 7 public:
brianeason92 0:64079f49da67 8 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
brianeason92 0:64079f49da67 9 int read();
brianeason92 0:64079f49da67 10 //boolean functions to test each switch
brianeason92 0:64079f49da67 11 bool up();
brianeason92 0:64079f49da67 12 bool down();
brianeason92 0:64079f49da67 13 bool left();
brianeason92 0:64079f49da67 14 bool right();
brianeason92 0:64079f49da67 15 bool fire();
brianeason92 0:64079f49da67 16 //automatic read on RHS
brianeason92 0:64079f49da67 17 operator int ();
brianeason92 0:64079f49da67 18 //index to any switch array style
brianeason92 0:64079f49da67 19 bool operator[](int index) {
brianeason92 0:64079f49da67 20 return _pins[index];
brianeason92 0:64079f49da67 21 };
brianeason92 0:64079f49da67 22 private:
brianeason92 0:64079f49da67 23 BusIn _pins;
brianeason92 0:64079f49da67 24
brianeason92 0:64079f49da67 25 };
brianeason92 0:64079f49da67 26 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
brianeason92 0:64079f49da67 27 _pins(up, down, left, right, fire)
brianeason92 0:64079f49da67 28 {
brianeason92 0:64079f49da67 29 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
brianeason92 0:64079f49da67 30 wait(0.001); //delays just a bit for pullups to pull inputs high
brianeason92 0:64079f49da67 31 }
brianeason92 0:64079f49da67 32 inline bool Nav_Switch::up()
brianeason92 0:64079f49da67 33 {
brianeason92 0:64079f49da67 34 return !(_pins[0]);
brianeason92 0:64079f49da67 35 }
brianeason92 0:64079f49da67 36 inline bool Nav_Switch::down()
brianeason92 0:64079f49da67 37 {
brianeason92 0:64079f49da67 38 return !(_pins[1]);
brianeason92 0:64079f49da67 39 }
brianeason92 0:64079f49da67 40 inline bool Nav_Switch::left()
brianeason92 0:64079f49da67 41 {
brianeason92 0:64079f49da67 42 return !(_pins[2]);
brianeason92 0:64079f49da67 43 }
brianeason92 0:64079f49da67 44 inline bool Nav_Switch::right()
brianeason92 0:64079f49da67 45 {
brianeason92 0:64079f49da67 46 return !(_pins[3]);
brianeason92 0:64079f49da67 47 }
brianeason92 0:64079f49da67 48 inline bool Nav_Switch::fire()
brianeason92 0:64079f49da67 49 {
brianeason92 0:64079f49da67 50 return !(_pins[4]);
brianeason92 0:64079f49da67 51 }
brianeason92 0:64079f49da67 52 inline int Nav_Switch::read()
brianeason92 0:64079f49da67 53 {
brianeason92 0:64079f49da67 54 return _pins.read();
brianeason92 0:64079f49da67 55 }
brianeason92 0:64079f49da67 56 inline Nav_Switch::operator int ()
brianeason92 0:64079f49da67 57 {
brianeason92 0:64079f49da67 58 return _pins.read();
brianeason92 0:64079f49da67 59 }
brianeason92 0:64079f49da67 60
brianeason92 0:64079f49da67 61 uLCD_4DGL uLCD(p9,p10,p11);
brianeason92 0:64079f49da67 62 Nav_Switch myNav(p15,p16,p12,p13,p14);
brianeason92 0:64079f49da67 63 PwmOut myled(LED1);
brianeason92 0:64079f49da67 64 AnalogIn mypotentiometer(p20);
brianeason92 0:64079f49da67 65
brianeason92 0:64079f49da67 66 void drawTile(int x, int y, int color){
brianeason92 0:64079f49da67 67 uLCD.filled_rectangle(x, y, x+20, y+2, color);
brianeason92 0:64079f49da67 68 }
brianeason92 0:64079f49da67 69
brianeason92 0:64079f49da67 70 void drawAllTiles(int *enemy_x1, int *enemy_y1, int *enemy_color, bool *alive){
brianeason92 0:64079f49da67 71 int i = 0;
brianeason92 0:64079f49da67 72 while(i < 16){
brianeason92 0:64079f49da67 73 if(alive[i]){
brianeason92 0:64079f49da67 74 drawTile(enemy_x1[i], enemy_y1[i], enemy_color[i]);
brianeason92 0:64079f49da67 75 }
brianeason92 0:64079f49da67 76 i++;
brianeason92 0:64079f49da67 77 }
brianeason92 0:64079f49da67 78 }
brianeason92 0:64079f49da67 79
brianeason92 0:64079f49da67 80 int position(float pot, int prev_position){
brianeason92 0:64079f49da67 81 int player_x1 = pot*108;
brianeason92 0:64079f49da67 82 drawTile(prev_position, 125, BLACK);
brianeason92 0:64079f49da67 83 drawTile(player_x1, 125, WHITE);
brianeason92 0:64079f49da67 84 return player_x1;
brianeason92 0:64079f49da67 85 }
brianeason92 0:64079f49da67 86
brianeason92 0:64079f49da67 87 int moveRight(int player_x1){
brianeason92 0:64079f49da67 88 int prev_position = player_x1;
brianeason92 0:64079f49da67 89 player_x1 = player_x1 + 6;
brianeason92 0:64079f49da67 90 if(player_x1 > 108){
brianeason92 0:64079f49da67 91 player_x1 = 108;
brianeason92 0:64079f49da67 92 }
brianeason92 0:64079f49da67 93 else{
brianeason92 0:64079f49da67 94 drawTile(prev_position, 125, BLACK);
brianeason92 0:64079f49da67 95 drawTile(player_x1, 125, WHITE);
brianeason92 0:64079f49da67 96 }
brianeason92 0:64079f49da67 97 return player_x1;
brianeason92 0:64079f49da67 98 }
brianeason92 0:64079f49da67 99
brianeason92 0:64079f49da67 100 int moveLeft(int player_x1){
brianeason92 0:64079f49da67 101 int prev_position = player_x1;
brianeason92 0:64079f49da67 102 player_x1 = player_x1 - 6;
brianeason92 0:64079f49da67 103 if(player_x1 < 0){
brianeason92 0:64079f49da67 104 player_x1 = 0;
brianeason92 0:64079f49da67 105 }
brianeason92 0:64079f49da67 106 else{
brianeason92 0:64079f49da67 107 drawTile(prev_position, 125, BLACK);
brianeason92 0:64079f49da67 108 drawTile(player_x1, 125, WHITE);
brianeason92 0:64079f49da67 109 }
brianeason92 0:64079f49da67 110 return player_x1;
brianeason92 0:64079f49da67 111 }
brianeason92 0:64079f49da67 112
brianeason92 0:64079f49da67 113 void printInfo(int lives, int points){
brianeason92 0:64079f49da67 114 uLCD.locate(0,0);
brianeason92 0:64079f49da67 115 uLCD.printf("Lives:%i", lives);
brianeason92 0:64079f49da67 116
brianeason92 0:64079f49da67 117 uLCD.locate(9,0);
brianeason92 0:64079f49da67 118 uLCD.printf("Points:%i", points);
brianeason92 0:64079f49da67 119 }
brianeason92 0:64079f49da67 120
brianeason92 0:64079f49da67 121 void drawBall(int x1, int y1, int color){
brianeason92 0:64079f49da67 122 uLCD.filled_circle(x1, y1, 5, color);
brianeason92 0:64079f49da67 123 }
brianeason92 0:64079f49da67 124
brianeason92 0:64079f49da67 125 int main() {
brianeason92 0:64079f49da67 126 uLCD.baudrate(3000000);
brianeason92 0:64079f49da67 127
brianeason92 0:64079f49da67 128 //draw initial player tile
brianeason92 0:64079f49da67 129 int player_x1 = 5;
brianeason92 0:64079f49da67 130 int player_y1 = 125;
brianeason92 0:64079f49da67 131
brianeason92 0:64079f49da67 132 //array to keep track of all enemy tiles
brianeason92 0:64079f49da67 133 bool alive[16];
brianeason92 0:64079f49da67 134 int enemy_x1[16];
brianeason92 0:64079f49da67 135 int enemy_x2[16];
brianeason92 0:64079f49da67 136 int enemy_y1[16];
brianeason92 0:64079f49da67 137 int enemy_y2[16];
brianeason92 0:64079f49da67 138 int enemy_color[16];
brianeason92 0:64079f49da67 139 int i = 0;
brianeason92 0:64079f49da67 140 int x = 5;
brianeason92 0:64079f49da67 141 int y = 20;
brianeason92 0:64079f49da67 142 int color = GREEN;
brianeason92 0:64079f49da67 143 while(i<16){
brianeason92 0:64079f49da67 144 alive[i] = true;
brianeason92 0:64079f49da67 145 enemy_x1[i] = x;
brianeason92 0:64079f49da67 146 enemy_x2[i] = x+20;
brianeason92 0:64079f49da67 147 enemy_y1[i] = y;
brianeason92 0:64079f49da67 148 enemy_y2[i] = y+2;
brianeason92 0:64079f49da67 149 enemy_color[i] = color;
brianeason92 0:64079f49da67 150
brianeason92 0:64079f49da67 151 //setup next tile
brianeason92 0:64079f49da67 152 y = y + 10;
brianeason92 0:64079f49da67 153 if(y>50){
brianeason92 0:64079f49da67 154 x = x + 30;
brianeason92 0:64079f49da67 155 y = 20;
brianeason92 0:64079f49da67 156 }
brianeason92 0:64079f49da67 157 if(color == GREEN){
brianeason92 0:64079f49da67 158 color = BLUE;
brianeason92 0:64079f49da67 159 }
brianeason92 0:64079f49da67 160 else if(color == BLUE){
brianeason92 0:64079f49da67 161 color = LGREY;
brianeason92 0:64079f49da67 162 }
brianeason92 0:64079f49da67 163 else if(color == LGREY){
brianeason92 0:64079f49da67 164 color = RED;
brianeason92 0:64079f49da67 165 }
brianeason92 0:64079f49da67 166 else{
brianeason92 0:64079f49da67 167 color = GREEN;
brianeason92 0:64079f49da67 168 }
brianeason92 0:64079f49da67 169 i++;
brianeason92 0:64079f49da67 170 }
brianeason92 0:64079f49da67 171 int lives = 3;
brianeason92 0:64079f49da67 172 int points = 0;
brianeason92 0:64079f49da67 173 int ball_x1 = 7;
brianeason92 0:64079f49da67 174 int ball_y1 = 70;
brianeason92 0:64079f49da67 175
brianeason92 0:64079f49da67 176 //0-up
brianeason92 0:64079f49da67 177 //1-left
brianeason92 0:64079f49da67 178 //2-down
brianeason92 0:64079f49da67 179 //3-right
brianeason92 0:64079f49da67 180 //4-topright
brianeason92 0:64079f49da67 181 //5-topleft
brianeason92 0:64079f49da67 182 //6-bottomleft
brianeason92 0:64079f49da67 183 //7-bottomright
brianeason92 0:64079f49da67 184 int dir = 7;
brianeason92 0:64079f49da67 185 bool flip = true;
brianeason92 0:64079f49da67 186 int start = true;
brianeason92 0:64079f49da67 187 bool erase = false;
brianeason92 0:64079f49da67 188 bool winner = false;
brianeason92 0:64079f49da67 189 bool loser = false;
brianeason92 0:64079f49da67 190 bool gameover = false;
brianeason92 0:64079f49da67 191
brianeason92 0:64079f49da67 192 while(1){
brianeason92 0:64079f49da67 193 myled = mypotentiometer;
brianeason92 0:64079f49da67 194 if(myNav.fire()){
brianeason92 0:64079f49da67 195 if(start==true){erase = true;}
brianeason92 0:64079f49da67 196 start = false;
brianeason92 0:64079f49da67 197 }
brianeason92 0:64079f49da67 198 if(start==true){
brianeason92 0:64079f49da67 199 uLCD.media_init();
brianeason92 0:64079f49da67 200 uLCD.set_sector_address(0x003A, 0x4001);
brianeason92 0:64079f49da67 201 uLCD.display_image(0,0);
brianeason92 0:64079f49da67 202 }
brianeason92 0:64079f49da67 203 else if(gameover==false){
brianeason92 0:64079f49da67 204 if(erase==true){uLCD.cls(); erase = false;}
brianeason92 0:64079f49da67 205 if(winner==true){uLCD.locate(4,9); uLCD.printf("YOU WIN!!!!"); gameover = true;}
brianeason92 0:64079f49da67 206 if(loser==true){uLCD.locate(4,9); uLCD.printf("YOU LOSE :("); gameover = true;}
brianeason92 0:64079f49da67 207 if(lives==0 && loser==false){loser = true; erase=true;}
brianeason92 0:64079f49da67 208 if(points==16 && winner==false){winner = true; erase = true;}
brianeason92 0:64079f49da67 209 drawBall(ball_x1, ball_y1, RED);
brianeason92 0:64079f49da67 210 drawAllTiles(enemy_x1, enemy_y1, enemy_color, alive);
brianeason92 0:64079f49da67 211 drawTile(player_x1, player_y1, WHITE);
brianeason92 0:64079f49da67 212 printInfo(lives, points);
brianeason92 0:64079f49da67 213 player_x1 = position(mypotentiometer, player_x1);
brianeason92 0:64079f49da67 214
brianeason92 0:64079f49da67 215 if(myNav.right()){
brianeason92 0:64079f49da67 216 flip = !flip;
brianeason92 0:64079f49da67 217 player_x1 = moveRight(player_x1);
brianeason92 0:64079f49da67 218 }
brianeason92 0:64079f49da67 219 else if(myNav.left()){
brianeason92 0:64079f49da67 220 flip = !flip;
brianeason92 0:64079f49da67 221 player_x1 = moveLeft(player_x1);
brianeason92 0:64079f49da67 222 }
brianeason92 0:64079f49da67 223
brianeason92 0:64079f49da67 224 drawBall(ball_x1, ball_y1, BLACK);
brianeason92 0:64079f49da67 225 //move ball
brianeason92 0:64079f49da67 226 if(dir==0){
brianeason92 0:64079f49da67 227 ball_y1 = ball_y1 - 3;
brianeason92 0:64079f49da67 228 }
brianeason92 0:64079f49da67 229 if(dir==2){
brianeason92 0:64079f49da67 230 ball_y1 = ball_y1 + 3;
brianeason92 0:64079f49da67 231 }
brianeason92 0:64079f49da67 232 if(dir==4){
brianeason92 0:64079f49da67 233 ball_y1 = ball_y1 -2;
brianeason92 0:64079f49da67 234 ball_x1 = ball_x1 +2;
brianeason92 0:64079f49da67 235 }
brianeason92 0:64079f49da67 236 if(dir==5){
brianeason92 0:64079f49da67 237 ball_y1 = ball_y1 - 2;
brianeason92 0:64079f49da67 238 ball_x1 = ball_x1 - 2;
brianeason92 0:64079f49da67 239 }
brianeason92 0:64079f49da67 240 if(dir==6){
brianeason92 0:64079f49da67 241 ball_y1 = ball_y1 +2;
brianeason92 0:64079f49da67 242 ball_x1 = ball_x1 - 2;
brianeason92 0:64079f49da67 243 }
brianeason92 0:64079f49da67 244 if(dir==7){
brianeason92 0:64079f49da67 245 ball_y1 = ball_y1+2;
brianeason92 0:64079f49da67 246 ball_x1 = ball_x1 + 2;
brianeason92 0:64079f49da67 247 }
brianeason92 0:64079f49da67 248 drawBall(ball_x1, ball_y1, RED);
brianeason92 0:64079f49da67 249 drawTile(player_x1, player_y1, WHITE);
brianeason92 0:64079f49da67 250
brianeason92 0:64079f49da67 251 //check ball collision with player
brianeason92 0:64079f49da67 252 int ball_bottom = ball_y1 + 2.5;
brianeason92 0:64079f49da67 253 int ball_right = ball_x1 + 2.5;
brianeason92 0:64079f49da67 254 int ball_left = ball_x1 - 2.5;
brianeason92 0:64079f49da67 255 int ball_top = ball_y1 - 2.5;
brianeason92 0:64079f49da67 256 if(ball_bottom>=player_y1 && ball_x1 >= player_x1 && ball_x1 <= player_x1+20){
brianeason92 0:64079f49da67 257 if(dir==0){dir=2;}
brianeason92 0:64079f49da67 258 if(dir==6){dir=5;if(flip){dir=4;}}
brianeason92 0:64079f49da67 259 if(dir==7){dir=4;if(flip){dir=5;}}
brianeason92 0:64079f49da67 260 }
brianeason92 0:64079f49da67 261
brianeason92 0:64079f49da67 262 //check ball collision with walls
brianeason92 0:64079f49da67 263 if(ball_bottom>=128){
brianeason92 0:64079f49da67 264 lives--;
brianeason92 0:64079f49da67 265 drawBall(ball_x1, ball_y1, BLACK);
brianeason92 0:64079f49da67 266 ball_x1 = 7;
brianeason92 0:64079f49da67 267 ball_y1 = 70;
brianeason92 0:64079f49da67 268 dir = 7;
brianeason92 0:64079f49da67 269 }
brianeason92 0:64079f49da67 270 if(ball_top<=9){
brianeason92 0:64079f49da67 271 if(dir==0){dir=2;}
brianeason92 0:64079f49da67 272 if(dir==5){dir=6;if(flip){dir=7;}}
brianeason92 0:64079f49da67 273 if(dir==4){dir=7;if(flip){dir=6;}}
brianeason92 0:64079f49da67 274 flip=!flip;
brianeason92 0:64079f49da67 275 }
brianeason92 0:64079f49da67 276 if(ball_left<=0){
brianeason92 0:64079f49da67 277 if(dir==1){dir=3;}
brianeason92 0:64079f49da67 278 if(dir==5){dir=4;if(flip){dir=7;}}
brianeason92 0:64079f49da67 279 if(dir==6){dir=7;if(flip){dir=4;}}
brianeason92 0:64079f49da67 280 flip=!flip;
brianeason92 0:64079f49da67 281 }
brianeason92 0:64079f49da67 282 if(ball_right>=128){
brianeason92 0:64079f49da67 283 if(dir==3){dir=1;}
brianeason92 0:64079f49da67 284 if(dir==4){dir=5;if(flip){dir=6;}}
brianeason92 0:64079f49da67 285 if(dir==7){dir=6;if(flip){dir=5;}}
brianeason92 0:64079f49da67 286 flip=!flip;
brianeason92 0:64079f49da67 287 }
brianeason92 0:64079f49da67 288
brianeason92 0:64079f49da67 289 //check if ball collided with enemies
brianeason92 0:64079f49da67 290 i = 0;
brianeason92 0:64079f49da67 291 while(i < 16){
brianeason92 0:64079f49da67 292 if(alive[i]==true){
brianeason92 0:64079f49da67 293 int enemyX1 = enemy_x1[i];
brianeason92 0:64079f49da67 294 int enemyX2 = enemy_x2[i];
brianeason92 0:64079f49da67 295 int enemyY1 = enemy_y1[i];
brianeason92 0:64079f49da67 296 int enemyY2 = enemy_y2[i];
brianeason92 0:64079f49da67 297 if(ball_x1 >= enemyX1 && ball_x1 <= enemyX2){
brianeason92 0:64079f49da67 298 if(ball_top <= enemyY2 && ball_top >=enemyY1){
brianeason92 0:64079f49da67 299 points++;
brianeason92 0:64079f49da67 300 alive[i] = false;
brianeason92 0:64079f49da67 301 if(dir==0){dir=2;}
brianeason92 0:64079f49da67 302 if(dir==5){dir=6;if(flip){dir=7;}}
brianeason92 0:64079f49da67 303 if(dir==4){dir=7;if(flip){dir=6;}}
brianeason92 0:64079f49da67 304 drawTile(enemyX1, enemyY1, BLACK);
brianeason92 0:64079f49da67 305 }
brianeason92 0:64079f49da67 306 else if(ball_bottom>=enemyY1 && ball_bottom <=enemyY2){
brianeason92 0:64079f49da67 307 points++;
brianeason92 0:64079f49da67 308 alive[i] = false;
brianeason92 0:64079f49da67 309 if(dir==2){dir=0;}
brianeason92 0:64079f49da67 310 if(dir==6){dir=5;if(flip){dir=4;}}
brianeason92 0:64079f49da67 311 if(dir==7){dir=4;if(flip){dir=5;}}
brianeason92 0:64079f49da67 312 drawTile(enemyX1, enemyY1, BLACK);
brianeason92 0:64079f49da67 313
brianeason92 0:64079f49da67 314 }
brianeason92 0:64079f49da67 315 }
brianeason92 0:64079f49da67 316 else if(ball_y1 >= enemyY1 && ball_y1 <= enemyY2){
brianeason92 0:64079f49da67 317 if(ball_right >= enemyX1 && ball_right <= enemyX2){
brianeason92 0:64079f49da67 318 points++;
brianeason92 0:64079f49da67 319 alive[i] = false;
brianeason92 0:64079f49da67 320 if(dir==3){dir=1;}
brianeason92 0:64079f49da67 321 if(dir==4){dir=5;if(flip){dir=6;}}
brianeason92 0:64079f49da67 322 if(dir==7){dir=6;if(flip){dir=5;}}
brianeason92 0:64079f49da67 323 drawTile(enemyX1, enemyY1, BLACK);
brianeason92 0:64079f49da67 324 }
brianeason92 0:64079f49da67 325 else if(ball_left >= enemyX2 && ball_left <= enemyX1){
brianeason92 0:64079f49da67 326 points++;
brianeason92 0:64079f49da67 327 alive[i] = false;
brianeason92 0:64079f49da67 328 if(dir==1){dir=3;}
brianeason92 0:64079f49da67 329 if(dir==5){dir=4;if(flip){dir=6;}}
brianeason92 0:64079f49da67 330 if(dir==6){dir=7;if(flip){dir=5;}}
brianeason92 0:64079f49da67 331 drawTile(enemyX1, enemyY1, BLACK);
brianeason92 0:64079f49da67 332 }
brianeason92 0:64079f49da67 333 }
brianeason92 0:64079f49da67 334 }
brianeason92 0:64079f49da67 335 i++;
brianeason92 0:64079f49da67 336 }
brianeason92 0:64079f49da67 337
brianeason92 0:64079f49da67 338 }}
brianeason92 0:64079f49da67 339
brianeason92 0:64079f49da67 340 }