Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NokiaLCD PS2 mbed
Fork of Pong by
main.cpp
00001 #include "mbed.h" 00002 #include "NokiaLCD.h" 00003 #include "PS2Keyboard.h" 00004 #include "ball.h" 00005 #include "paddle.h" 00006 #include "block.h" 00007 00008 // State enumerator 00009 typedef enum { 00010 RESET1, RESET2, RUN, PAUSE, WIN 00011 } STATES; 00012 00013 NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type 00014 00015 PS2Keyboard ps2kb(p12, p11); // CLK, DAT 00016 00017 DigitalIn sw2(p24); 00018 DigitalIn sw1(p25); 00019 00020 PwmOut g(p21); 00021 PwmOut b(p22); 00022 PwmOut r(p23); 00023 00024 // Button enumerator for PS/2 keyboard 00025 enum BUTTONS { 00026 UP = 0xe75, 00027 DOWN = 0xe72, 00028 }; 00029 00030 /* 00031 * Subroutine drawScreen: 00032 * Description: Draws paddle, blocks 00033 * and the ball. 00034 */ 00035 void drawScreen(Paddle paddle1, Ball theBall, Block block1, Block block2, Block block3, Block block4, 00036 Block block5, Block block6, Block block7, Block block8, Block block9, 00037 Block block11, Block block12, Block block13, Block block14, 00038 Block block15, Block block16, Block block17, Block block18, Block block19, bool isBlack) 00039 { 00040 paddle1.draw(lcd, isBlack); 00041 theBall.draw(lcd ,isBlack); 00042 block1.draw(lcd ,isBlack); 00043 block2.draw(lcd ,isBlack); 00044 block3.draw(lcd ,isBlack); 00045 block4.draw(lcd ,isBlack); 00046 block5.draw(lcd ,isBlack); 00047 block6.draw(lcd ,isBlack); 00048 block7.draw(lcd ,isBlack); 00049 block8.draw(lcd ,isBlack); 00050 block9.draw(lcd ,isBlack); 00051 block11.draw(lcd ,isBlack); 00052 block12.draw(lcd ,isBlack); 00053 block13.draw(lcd ,isBlack); 00054 block14.draw(lcd ,isBlack); 00055 block15.draw(lcd ,isBlack); 00056 block16.draw(lcd ,isBlack); 00057 block17.draw(lcd ,isBlack); 00058 block18.draw(lcd ,isBlack); 00059 block19.draw(lcd ,isBlack); 00060 } 00061 00062 /* 00063 * Subroutine drawScores: 00064 * Description: Draws the scoreboard 00065 */ 00066 void drawScores(Paddle paddle1) 00067 { 00068 lcd.locate(6.5,0); 00069 lcd.printf("%d",paddle1.getScore()); 00070 lcd.locate(7.5,15); 00071 lcd.putc('0' + paddle1.getLives()); 00072 } 00073 00074 int main() 00075 { 00076 PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt 00077 lcd.background(0x000000); 00078 lcd.cls(); 00079 Paddle paddle1; 00080 Ball theBall; 00081 Block block1, block2, block3, block4, block5, block6, block7, block8, block9; 00082 Block block11, block12, block13, block14, block15, block16, block17, block18, block19; 00083 int temp, count=0; 00084 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9, 00085 block11, block12, block13, block14, block15, block16, block17, block18, block19, false); 00086 drawScores(paddle1); 00087 STATES state = RESET1; // Initial state is RESET 00088 while(1) { 00089 switch(state) { 00090 case WIN: // When palyer gets max score 00091 lcd.locate(4,3); 00092 lcd.printf("YOU WON!"); 00093 if(!sw2) { // Reset if SW2 is pressed 00094 while(!sw2); 00095 paddle1.setLives(3); 00096 paddle1.setScore(0); 00097 state = RESET1; 00098 break; 00099 } 00100 break; 00101 case RESET1: // Reset objects, draw the screen, state = PAUSE 00102 lcd.cls(); 00103 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore()); 00104 theBall = Ball(6,57,5,5,0xFFFF00,1,1); 00105 block1 = Block(125,10,5,20,0x00FF00); 00106 block2 = Block(125,40,5,20,0xFF0000); 00107 block3 = Block(125,70,5,20,0xFFEE00); 00108 block4 = Block(125,100,5,20,0x00FFFF); 00109 block5 = Block(113,5,5,20,0x00FF00); 00110 block6 = Block(113,30,5,20,0xFF0000); 00111 block7 = Block(113,55,5,20,0xFFFFFF); 00112 block8 = Block(113,80,5,20,0xFFEE00); 00113 block9 = Block(113,105,5,20,0x00FFFF); 00114 block11 = Block(101,10,5,20,0xFF0000); 00115 block12 = Block(101,40,5,20,0x00FF00); 00116 block13 = Block(101,70,5,20,0x00FFFF); 00117 block14 = Block(101,100,5,20,0xFFEE00); 00118 block15 = Block(89,5,5,20,0xFF0000); 00119 block16 = Block(89,30,5,20,0x00FF00); 00120 block17 = Block(89,55,5,20,0xFFFFFF); 00121 block18 = Block(89,80,5,20,0x00FFFF); 00122 block19 = Block(89,105,5,20,0xFFEE00); 00123 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9, 00124 block11, block12, block13, block14, block15, block16, block17, block18, block19, false); 00125 drawScores(paddle1); 00126 state = PAUSE; 00127 break; 00128 case RESET2: // Reset objects, draw the screen, state = PAUSE 00129 lcd.cls(); 00130 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore()); 00131 theBall = Ball(6,57,5,5,0xFFFF00,1,1); 00132 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9, 00133 block11, block12, block13, block14, block15, block16, block17, block18, block19, false); 00134 drawScores(paddle1); 00135 state = PAUSE; 00136 break; 00137 case PAUSE: // Set RGB LED to Red, wait for switch input 00138 r = 0; 00139 b = g = 1; 00140 if(!sw2) { 00141 while(!sw2); 00142 paddle1.setLives(3); 00143 paddle1.setScore(0); 00144 state = RESET1; 00145 break; 00146 } 00147 if(!sw1) { 00148 while(!sw1); 00149 state = RUN; 00150 } 00151 break; 00152 case RUN: // Set RGB LED to Blue and run program 00153 r = g = 1; 00154 b = 0; 00155 if(!sw2) { // Reset if SW2 is pressed 00156 while(!sw2); 00157 paddle1.setLives(3); 00158 paddle1.setScore(0); 00159 state = RESET1; 00160 break; 00161 } 00162 if(!sw1) { // Pause if SW1 is pressed 00163 while(!sw1); 00164 state = PAUSE; 00165 break; 00166 } 00167 if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed 00168 temp = evt_kb.scancode[0]; 00169 for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key 00170 temp <<= 4; 00171 temp |= evt_kb.scancode[i]; 00172 } 00173 switch(temp) { // Use key enumerator to move paddle1 00174 case UP: 00175 if(paddle1.getY()>2) 00176 paddle1.move(lcd, -2); 00177 break; 00178 case DOWN: 00179 if(paddle1.getY()+paddle1.getHeight()<128) 00180 paddle1.move(lcd, 2); 00181 break; 00182 } 00183 00184 00185 } 00186 00187 if(++count==3) { // Only move the ball once every 4 times through the loop 00188 count = 0; 00189 if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight())) 00190 theBall.reverseX(); 00191 if(theBall.hitB1((block1.getX()+block1.getWidth()), block1.getY(), block1.getHeight())) { 00192 theBall.reverseX(); 00193 paddle1.addPoints(25); 00194 block1.move(lcd, -100); 00195 } 00196 if(theBall.hitB1((block2.getX()+block2.getWidth()), block2.getY(), block2.getHeight())) { 00197 theBall.reverseX(); 00198 paddle1.addPoints(25); 00199 block2.move(lcd, -100); 00200 } 00201 if(theBall.hitB1((block3.getX()+block3.getWidth()), block3.getY(), block3.getHeight())) { 00202 theBall.reverseX(); 00203 paddle1.addPoints(25); 00204 block3.move(lcd, -100); 00205 } 00206 if(theBall.hitB1((block4.getX()+block4.getWidth()), block4.getY(), block4.getHeight())) { 00207 theBall.reverseX(); 00208 paddle1.addPoints(25); 00209 block4.move(lcd, -200); 00210 } 00211 if(theBall.hitB1((block5.getX()+block5.getWidth()), block5.getY(), block5.getHeight())) { 00212 theBall.reverseX(); 00213 paddle1.addPoints(20); 00214 block5.move(lcd, -100); 00215 } 00216 if(theBall.hitB1((block6.getX()+block6.getWidth()), block6.getY(), block6.getHeight())) { 00217 theBall.reverseX(); 00218 paddle1.addPoints(20); 00219 block6.move(lcd, -100); 00220 } 00221 if(theBall.hitB1((block7.getX()+block7.getWidth()), block7.getY(), block7.getHeight())) { 00222 theBall.reverseX(); 00223 paddle1.addPoints(20); 00224 block7.move(lcd, -100); 00225 } 00226 if(theBall.hitB1((block8.getX()+block8.getWidth()), block8.getY(), block8.getHeight())) { 00227 theBall.reverseX(); 00228 paddle1.addPoints(20); 00229 block8.move(lcd, -200); 00230 } 00231 if(theBall.hitB1((block9.getX()+block9.getWidth()), block9.getY(), block9.getHeight())) { 00232 theBall.reverseX(); 00233 paddle1.addPoints(20); 00234 block9.move(lcd, -200); 00235 } 00236 if(theBall.hitB1((block11.getX()+block11.getWidth()), block11.getY(), block11.getHeight())) { 00237 theBall.reverseX(); 00238 paddle1.addPoints(15); 00239 block11.move(lcd, -100); 00240 } 00241 if(theBall.hitB1((block12.getX()+block12.getWidth()), block12.getY(), block12.getHeight())) { 00242 theBall.reverseX(); 00243 paddle1.addPoints(15); 00244 block12.move(lcd, -100); 00245 } 00246 if(theBall.hitB1((block13.getX()+block13.getWidth()), block13.getY(), block13.getHeight())) { 00247 theBall.reverseX(); 00248 paddle1.addPoints(15); 00249 block13.move(lcd, -100); 00250 } 00251 if(theBall.hitB1((block14.getX()+block14.getWidth()), block14.getY(), block14.getHeight())) { 00252 theBall.reverseX(); 00253 paddle1.addPoints(15); 00254 block14.move(lcd, -200); 00255 } 00256 if(theBall.hitB1((block15.getX()+block15.getWidth()), block15.getY(), block15.getHeight())) { 00257 theBall.reverseX(); 00258 paddle1.addPoints(10); 00259 block15.move(lcd, -100); 00260 } 00261 if(theBall.hitB1((block16.getX()+block16.getWidth()), block16.getY(), block16.getHeight())) { 00262 theBall.reverseX(); 00263 paddle1.addPoints(10); 00264 block16.move(lcd, -100); 00265 } 00266 if(theBall.hitB1((block17.getX()+block17.getWidth()), block17.getY(), block17.getHeight())) { 00267 theBall.reverseX(); 00268 paddle1.addPoints(10); 00269 block17.move(lcd, -100); 00270 } 00271 if(theBall.hitB1((block18.getX()+block18.getWidth()), block18.getY(), block18.getHeight())) { 00272 theBall.reverseX(); 00273 paddle1.addPoints(10); 00274 block18.move(lcd, -200); 00275 } 00276 if(theBall.hitB1((block19.getX()+block19.getWidth()), block19.getY(), block19.getHeight())) { 00277 theBall.reverseX(); 00278 paddle1.addPoints(10); 00279 block19.move(lcd, -200); 00280 } 00281 if(theBall.hitX()) { // If the ball hits one of the sides of the screen 00282 if(theBall.getX()<7) { // If the ball hit paddle1's side 00283 if(!paddle1.loseLife()) { // If paddle1 has no more lives 00284 paddle1.setLives(3); 00285 paddle1.setScore(0); 00286 state = RESET1; // Reset the objects 00287 break; 00288 } 00289 state = RESET2; // Reset the objects 00290 } 00291 theBall.reverseX(); 00292 } 00293 if(theBall.hitY()) 00294 theBall.reverseY(); 00295 theBall.move(lcd); 00296 } 00297 if(paddle1.getScore()==310) { 00298 state=WIN; 00299 } 00300 break; 00301 } 00302 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9, 00303 block11, block12, block13, block14, block15, block16, block17, block18, block19, false); 00304 drawScores(paddle1); 00305 } 00306 }
Generated on Thu Jul 14 2022 09:10:06 by
1.7.2
