Brickbreaker

Dependencies:   NokiaLCD PS2 mbed

Fork of Pong by William Johnston

Revision:
3:e1328f84b107
Parent:
2:d1031c73e187
diff -r d1031c73e187 -r e1328f84b107 main.cpp
--- a/main.cpp	Mon Feb 28 00:22:23 2011 +0000
+++ b/main.cpp	Mon Apr 29 18:14:57 2013 +0000
@@ -3,10 +3,11 @@
 #include "PS2Keyboard.h"
 #include "ball.h"
 #include "paddle.h"
+#include "block.h"
 
 // State enumerator
 typedef enum {
-  RESET, RUN, PAUSE
+    RESET1, RESET2, RUN, PAUSE, WIN
 } STATES;
 
 NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type
@@ -21,139 +22,285 @@
 PwmOut r(p23);
 
 // Button enumerator for PS/2 keyboard
-enum BUTTONS{
-  UP = 0xe75,
-  DOWN = 0xe72,
+enum BUTTONS {
+    UP = 0xe75,
+    DOWN = 0xe72,
 };
 
-/* 
+/*
  * Subroutine drawScreen:
- * Description: Draws both paddles
+ * Description: Draws paddle, blocks
  *  and the ball.
  */
-void drawScreen(Paddle paddle1, Paddle paddle2, Ball theBall, bool isBlack) {
-  paddle1.draw(lcd, isBlack);
-  paddle2.draw(lcd ,isBlack);
-  theBall.draw(lcd ,isBlack);
+void drawScreen(Paddle paddle1, Ball theBall, Block block1, Block block2, Block block3, Block block4,
+                Block block5, Block block6, Block block7, Block block8, Block block9,
+                Block block11, Block block12, Block block13, Block block14,
+                Block block15, Block block16, Block block17, Block block18, Block block19, bool isBlack)
+{
+    paddle1.draw(lcd, isBlack);
+    theBall.draw(lcd ,isBlack);
+    block1.draw(lcd ,isBlack);
+    block2.draw(lcd ,isBlack);
+    block3.draw(lcd ,isBlack);
+    block4.draw(lcd ,isBlack);
+    block5.draw(lcd ,isBlack);
+    block6.draw(lcd ,isBlack);
+    block7.draw(lcd ,isBlack);
+    block8.draw(lcd ,isBlack);
+    block9.draw(lcd ,isBlack);
+    block11.draw(lcd ,isBlack);
+    block12.draw(lcd ,isBlack);
+    block13.draw(lcd ,isBlack);
+    block14.draw(lcd ,isBlack);
+    block15.draw(lcd ,isBlack);
+    block16.draw(lcd ,isBlack);
+    block17.draw(lcd ,isBlack);
+    block18.draw(lcd ,isBlack);
+    block19.draw(lcd ,isBlack);
 }
 
-/* 
+/*
  * Subroutine drawScores:
  * Description: Draws the scoreboard
  */
-void drawScores(Paddle paddle1, Paddle paddle2) {
-  lcd.locate(7,0);
-  lcd.putc('0' + paddle1.getScore());
-  lcd.locate(9,0);
-  lcd.putc('0' + paddle2.getScore());
-  lcd.fill(66,0,2,130,0xFFFFFF);
-  lcd.locate(7,15);
-  lcd.putc('0' + paddle1.getLives());
-  lcd.locate(9,15);
-  lcd.putc('0' + paddle2.getLives());
+void drawScores(Paddle paddle1)
+{
+    lcd.locate(6.5,0);
+    lcd.printf("%d",paddle1.getScore());
+    lcd.locate(7.5,15);
+    lcd.putc('0' + paddle1.getLives());
 }
 
-int main() {
-  PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt
-  lcd.background(0x000000);
-  lcd.cls();
-  Paddle paddle1, paddle2;
-  Ball theBall;
-  int temp, count=0;
-  drawScreen(paddle1, paddle2, theBall, false);
-  drawScores(paddle1, paddle2);
-  STATES state = RESET; // Initial state is RESET
-  while(1) {
-    switch(state) {
-      case RESET: // Reset objects, draw the screen, state = PAUSE
-        lcd.cls();
-        paddle1 = Paddle(1,10,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
-        paddle2 = Paddle(125,3,5,25,0xFFFFFF,paddle2.getLives(),paddle2.getScore());
-        theBall = Ball(6,25,5,5,0xFFFF00,1,1);
-        drawScreen(paddle1, paddle2, theBall, false);
-        drawScores(paddle1, paddle2);
-        state = PAUSE;
-        break;
-      case PAUSE: // Set RGB LED to Red, wait for switch input
-        r = 0;
-        b = g = 1;
-        if(!sw2) {
-          while(!sw2);
-          paddle2.setLives(3);
-          paddle1.setLives(3);
-          state = RESET;
-          break;
-        }
-        if(!sw1) {
-          while(!sw1);
-          state = RUN;
-        }
-        break;
-      case RUN: // Set RGB LED to Blue and run program
-        r = g = 1;
-        b = 0;
-        if(!sw2) { // Reset if SW2 is pressed
-          while(!sw2);
-          paddle2.setLives(3);
-          paddle1.setLives(3);
-          state = RESET;
-          break;
-        }
-        if(!sw1) { // Pause if SW1 is pressed
-          while(!sw1);
-          state = PAUSE;
-          break;
+int main()
+{
+    PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt
+    lcd.background(0x000000);
+    lcd.cls();
+    Paddle paddle1;
+    Ball theBall;
+    Block block1, block2, block3, block4, block5, block6, block7, block8, block9;
+    Block block11, block12, block13, block14, block15, block16, block17, block18, block19;
+    int temp, count=0;
+    drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
+               block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
+    drawScores(paddle1);
+    STATES state = RESET1; // Initial state is RESET
+    while(1) {
+        switch(state) {
+            case WIN: // When palyer gets max score
+                lcd.locate(4,3);
+                lcd.printf("YOU WON!");
+                if(!sw2) { // Reset if SW2 is pressed
+                    while(!sw2);
+                    paddle1.setLives(3);
+                    paddle1.setScore(0);
+                    state = RESET1;
+                    break;
+                }
+                break;
+            case RESET1: // Reset objects, draw the screen, state = PAUSE
+                lcd.cls();
+                paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
+                theBall = Ball(6,57,5,5,0xFFFF00,1,1);
+                block1 = Block(125,10,5,20,0x00FF00);
+                block2 = Block(125,40,5,20,0xFF0000);
+                block3 = Block(125,70,5,20,0xFFEE00);
+                block4 = Block(125,100,5,20,0x00FFFF);                
+                block5 = Block(113,5,5,20,0x00FF00);
+                block6 = Block(113,30,5,20,0xFF0000);
+                block7 = Block(113,55,5,20,0xFFFFFF);
+                block8 = Block(113,80,5,20,0xFFEE00);
+                block9 = Block(113,105,5,20,0x00FFFF);                
+                block11 = Block(101,10,5,20,0xFF0000);
+                block12 = Block(101,40,5,20,0x00FF00);
+                block13 = Block(101,70,5,20,0x00FFFF);
+                block14 = Block(101,100,5,20,0xFFEE00);           
+                block15 = Block(89,5,5,20,0xFF0000);
+                block16 = Block(89,30,5,20,0x00FF00);
+                block17 = Block(89,55,5,20,0xFFFFFF);
+                block18 = Block(89,80,5,20,0x00FFFF);
+                block19 = Block(89,105,5,20,0xFFEE00);
+                drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
+                           block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
+                drawScores(paddle1);
+                state = PAUSE;
+                break;
+            case RESET2: // Reset objects, draw the screen, state = PAUSE
+                lcd.cls();
+                paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
+                theBall = Ball(6,57,5,5,0xFFFF00,1,1);
+                drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
+                           block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
+                drawScores(paddle1);
+                state = PAUSE;
+                break;
+            case PAUSE: // Set RGB LED to Red, wait for switch input
+                r = 0;
+                b = g = 1;
+                if(!sw2) {
+                    while(!sw2);
+                    paddle1.setLives(3);
+                    paddle1.setScore(0);
+                    state = RESET1;
+                    break;
+                }
+                if(!sw1) {
+                    while(!sw1);
+                    state = RUN;
+                }
+                break;
+            case RUN: // Set RGB LED to Blue and run program
+                r = g = 1;
+                b = 0;
+                if(!sw2) { // Reset if SW2 is pressed
+                    while(!sw2);
+                    paddle1.setLives(3);
+                    paddle1.setScore(0);
+                    state = RESET1;
+                    break;
+                }
+                if(!sw1) { // Pause if SW1 is pressed
+                    while(!sw1);
+                    state = PAUSE;
+                    break;
+                }
+                if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed
+                    temp = evt_kb.scancode[0];
+                    for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key
+                        temp <<= 4;
+                        temp |= evt_kb.scancode[i];
+                    }
+                    switch(temp) { // Use key enumerator to move paddle1
+                        case UP:
+                            if(paddle1.getY()>2)
+                                paddle1.move(lcd, -2);
+                            break;
+                        case DOWN:
+                            if(paddle1.getY()+paddle1.getHeight()<128)
+                                paddle1.move(lcd, 2);
+                            break;
+                    }
+
+
+                }
+
+                if(++count==3) { // Only move the ball once every 4 times through the loop
+                    count = 0;
+                    if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
+                        theBall.reverseX();
+                    if(theBall.hitB1((block1.getX()+block1.getWidth()), block1.getY(), block1.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(25);
+                        block1.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block2.getX()+block2.getWidth()), block2.getY(), block2.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(25);
+                        block2.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block3.getX()+block3.getWidth()), block3.getY(), block3.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(25);
+                        block3.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block4.getX()+block4.getWidth()), block4.getY(), block4.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(25);
+                        block4.move(lcd, -200);
+                    }
+                    if(theBall.hitB1((block5.getX()+block5.getWidth()), block5.getY(), block5.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(20);
+                        block5.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block6.getX()+block6.getWidth()), block6.getY(), block6.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(20);
+                        block6.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block7.getX()+block7.getWidth()), block7.getY(), block7.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(20);
+                        block7.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block8.getX()+block8.getWidth()), block8.getY(), block8.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(20);
+                        block8.move(lcd, -200);
+                    }
+                    if(theBall.hitB1((block9.getX()+block9.getWidth()), block9.getY(), block9.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(20);
+                        block9.move(lcd, -200);
+                    }
+                    if(theBall.hitB1((block11.getX()+block11.getWidth()), block11.getY(), block11.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(15);
+                        block11.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block12.getX()+block12.getWidth()), block12.getY(), block12.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(15);
+                        block12.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block13.getX()+block13.getWidth()), block13.getY(), block13.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(15);
+                        block13.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block14.getX()+block14.getWidth()), block14.getY(), block14.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(15);
+                        block14.move(lcd, -200);
+                    }
+                    if(theBall.hitB1((block15.getX()+block15.getWidth()), block15.getY(), block15.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(10);
+                        block15.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block16.getX()+block16.getWidth()), block16.getY(), block16.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(10);
+                        block16.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block17.getX()+block17.getWidth()), block17.getY(), block17.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(10);
+                        block17.move(lcd, -100);
+                    }
+                    if(theBall.hitB1((block18.getX()+block18.getWidth()), block18.getY(), block18.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(10);
+                        block18.move(lcd, -200);
+                    }
+                    if(theBall.hitB1((block19.getX()+block19.getWidth()), block19.getY(), block19.getHeight())) {
+                        theBall.reverseX();
+                        paddle1.addPoints(10);
+                        block19.move(lcd, -200);
+                    }
+                    if(theBall.hitX()) { // If the ball hits one of the sides of the screen
+                        if(theBall.getX()<7) { // If the ball hit paddle1's side
+                            if(!paddle1.loseLife()) { // If paddle1 has no more lives
+                                paddle1.setLives(3);
+                                paddle1.setScore(0);
+                                state = RESET1; // Reset the objects
+                                break;
+                            }
+                            state = RESET2; // Reset the objects
+                        }
+                        theBall.reverseX();
+                    }
+                    if(theBall.hitY())
+                        theBall.reverseY();
+                    theBall.move(lcd);
+                }
+                if(paddle1.getScore()==310) {
+                    state=WIN;
+                }
+                break;
         }
-        if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed
-          temp = evt_kb.scancode[0];
-          for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key
-            temp <<= 4;
-            temp |= evt_kb.scancode[i];
-          }
-          switch(temp) { // Use key enumerator to move paddle1
-            case UP:
-              if(paddle1.getY()>2)
-                paddle1.move(lcd, -2);
-              break;
-            case DOWN: 
-              if(paddle1.getY()+paddle1.getHeight()<128)
-                paddle1.move(lcd, 2);
-              break;
-          }
-        }
-        if(count%2) // Only let CPU move once every 2 times through the loop
-          paddle2.moveCPU(lcd, theBall.getY());
-        if(++count==5) { // Only move the ball once every 5 times through the loop
-          count = 0;
-          if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
-            theBall.reverseX();
-          if(theBall.hitP2(paddle2.getX(), paddle2.getY(), paddle2.getHeight()))
-            theBall.reverseX();
-          if(theBall.hitX()) { // If the ball hits one of the sides of the screen
-            if(theBall.getX()<7) { // If the ball hit paddle1's side
-              if(!paddle1.loseLife()) { // If paddle1 has no more lives
-                paddle1.setLives(3);
-                paddle2.setLives(3);
-                paddle2.addPoint();
-              }
-            }
-            else if(theBall.getX()>120) { // If the ball hit paddle2's side
-              if(!paddle2.loseLife()) { // If paddle2 has no more lives
-                paddle2.setLives(3);
-                paddle1.setLives(3);
-                paddle1.addPoint();
-              }
-            }
-            theBall.reverseX();
-            state = RESET; // Reset the objects
-          }
-          if(theBall.hitY()) 
-            theBall.reverseY();
-          theBall.move(lcd);
-        }
-        break;
+        drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
+                   block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
+        drawScores(paddle1);
     }
-    drawScreen(paddle1, paddle2, theBall, false);
-    drawScores(paddle1, paddle2);
-  }
 }