Code for The game of Pong using Photocell Resistors

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Committer:
doubster
Date:
Mon Oct 19 22:59:32 2015 +0000
Revision:
0:2a96017a6c8e
Child:
1:4352a2c0a4af
Commit For Notebook Page

Who changed what in which revision?

UserRevisionLine numberNew contents of line
doubster 0:2a96017a6c8e 1 #include "mbed.h"
doubster 0:2a96017a6c8e 2 #include "uLCD_4DGL.h"
doubster 0:2a96017a6c8e 3 #include "SDFileSystem.h"
doubster 0:2a96017a6c8e 4 #include "wave_player.h"
doubster 0:2a96017a6c8e 5 #include <string>
doubster 0:2a96017a6c8e 6 #include "rtos.h"
doubster 0:2a96017a6c8e 7
doubster 0:2a96017a6c8e 8 // ULCD
doubster 0:2a96017a6c8e 9 uLCD_4DGL uLCD(p9,p10,p17); // serial tx, serial rx, reset pin;
doubster 0:2a96017a6c8e 10
doubster 0:2a96017a6c8e 11 // Speaker Output
doubster 0:2a96017a6c8e 12 AnalogOut DACout(p18);
doubster 0:2a96017a6c8e 13 wave_player waver(&DACout);
doubster 0:2a96017a6c8e 14
doubster 0:2a96017a6c8e 15 // SD Cards
doubster 0:2a96017a6c8e 16 SDFileSystem sd(p5, p6, p7, p8, "sd");
doubster 0:2a96017a6c8e 17
doubster 0:2a96017a6c8e 18 // Paddle Left
doubster 0:2a96017a6c8e 19 AnalogIn photocellleft(p15);
doubster 0:2a96017a6c8e 20 // Paddle Right
doubster 0:2a96017a6c8e 21 AnalogIn photocellright(p16);
doubster 0:2a96017a6c8e 22
doubster 0:2a96017a6c8e 23 //std::string a
doubster 0:2a96017a6c8e 24 void Sound(std::string event){
doubster 0:2a96017a6c8e 25 FILE *wave_file;
doubster 0:2a96017a6c8e 26
doubster 0:2a96017a6c8e 27 if(event == "hit")
doubster 0:2a96017a6c8e 28 wave_file=fopen("/sd/wavfiles/pac_bonus.wav","r");
doubster 0:2a96017a6c8e 29 else if(event == "end")
doubster 0:2a96017a6c8e 30 wave_file=fopen("/sd/wavfiles/BUZZER.wav","r");
doubster 0:2a96017a6c8e 31 else if(event == "start")
doubster 0:2a96017a6c8e 32 wave_file=fopen("/sd/wavfiles/BUZZER.wav","r");
doubster 0:2a96017a6c8e 33
doubster 0:2a96017a6c8e 34 waver.play(wave_file);
doubster 0:2a96017a6c8e 35 fclose(wave_file);
doubster 0:2a96017a6c8e 36 wait(1);
doubster 0:2a96017a6c8e 37 }
doubster 0:2a96017a6c8e 38
doubster 0:2a96017a6c8e 39 int border = 128;
doubster 0:2a96017a6c8e 40 int paddlesizex = 5;
doubster 0:2a96017a6c8e 41 int paddlesizey = 20;
doubster 0:2a96017a6c8e 42 int paddlecolor = 0x00FF00;
doubster 0:2a96017a6c8e 43 int ballradius = 3;
doubster 0:2a96017a6c8e 44 int ballcolor = 0xFF00FF;
doubster 0:2a96017a6c8e 45 int black = 0x000000;
doubster 0:2a96017a6c8e 46
doubster 0:2a96017a6c8e 47 // Paddle left
doubster 0:2a96017a6c8e 48
doubster 0:2a96017a6c8e 49 int paddlelx = 0;
doubster 0:2a96017a6c8e 50 int paddlely = 0;
doubster 0:2a96017a6c8e 51 int paddlerx = border-paddlesizex;
doubster 0:2a96017a6c8e 52 int paddlery = 50;
doubster 0:2a96017a6c8e 53
doubster 0:2a96017a6c8e 54 int oldpaddlely = paddlely;
doubster 0:2a96017a6c8e 55 int oldpaddlery = paddlery;
doubster 0:2a96017a6c8e 56
doubster 0:2a96017a6c8e 57 int paddlelincr = 1;
doubster 0:2a96017a6c8e 58 int paddlerincr = 1;
doubster 0:2a96017a6c8e 59
doubster 0:2a96017a6c8e 60 // Ball x,y , should be randomized to begin
doubster 0:2a96017a6c8e 61 int ballx = border/2;
doubster 0:2a96017a6c8e 62 int bally = rand() % 100;
doubster 0:2a96017a6c8e 63
doubster 0:2a96017a6c8e 64 int oldballx = ballx;
doubster 0:2a96017a6c8e 65 int oldbally = bally;
doubster 0:2a96017a6c8e 66 // Increments for ball
doubster 0:2a96017a6c8e 67 int ballxincr = -1;
doubster 0:2a96017a6c8e 68 int ballyincr = -1;
doubster 0:2a96017a6c8e 69
doubster 0:2a96017a6c8e 70 int oldphotocell = photocellleft;
doubster 0:2a96017a6c8e 71
doubster 0:2a96017a6c8e 72 int hitvariable = 0;
doubster 0:2a96017a6c8e 73
doubster 0:2a96017a6c8e 74 // Threading
doubster 0:2a96017a6c8e 75 void function_thread3(void const *name){
doubster 0:2a96017a6c8e 76 FILE *wave_file;
doubster 0:2a96017a6c8e 77 //printf("\n\n\nHello, wave world!\n");
doubster 0:2a96017a6c8e 78 while(true){
doubster 0:2a96017a6c8e 79 if(hitvariable == 1){
doubster 0:2a96017a6c8e 80 wave_file=fopen("/sd/wavfiles/pac_bonus.wav","r");
doubster 0:2a96017a6c8e 81 waver.play(wave_file);
doubster 0:2a96017a6c8e 82 fclose(wave_file);
doubster 0:2a96017a6c8e 83 hitvariable = 0;
doubster 0:2a96017a6c8e 84 //wait(.2);
doubster 0:2a96017a6c8e 85 }
doubster 0:2a96017a6c8e 86 }
doubster 0:2a96017a6c8e 87 }
doubster 0:2a96017a6c8e 88
doubster 0:2a96017a6c8e 89 // ULCD Functions
doubster 0:2a96017a6c8e 90 void DrawPaddle(int x, int y,int color){
doubster 0:2a96017a6c8e 91 // Green paddles
doubster 0:2a96017a6c8e 92 uLCD.filled_rectangle(x, y, x+paddlesizex, y+paddlesizey, color);
doubster 0:2a96017a6c8e 93 }
doubster 0:2a96017a6c8e 94
doubster 0:2a96017a6c8e 95 void DrawBall(int x, int y,int color){
doubster 0:2a96017a6c8e 96 uLCD.filled_circle(x, y, ballradius, color);
doubster 0:2a96017a6c8e 97 }
doubster 0:2a96017a6c8e 98
doubster 0:2a96017a6c8e 99 int main() {
doubster 0:2a96017a6c8e 100 // Begin the game
doubster 0:2a96017a6c8e 101 Sound("start");
doubster 0:2a96017a6c8e 102
doubster 0:2a96017a6c8e 103 // Thread for Sound
doubster 0:2a96017a6c8e 104 Thread thread3(function_thread3);
doubster 0:2a96017a6c8e 105
doubster 0:2a96017a6c8e 106 // Baudrate
doubster 0:2a96017a6c8e 107 uLCD.baudrate(300000);
doubster 0:2a96017a6c8e 108 int initialphotocell = photocellleft*100/2;
doubster 0:2a96017a6c8e 109 //uLCD.printf("%d",initialphotocell);
doubster 0:2a96017a6c8e 110 //wait(10);
doubster 0:2a96017a6c8e 111 // Rectangle
doubster 0:2a96017a6c8e 112 DrawPaddle(paddlelx,paddlely,paddlecolor);
doubster 0:2a96017a6c8e 113 //wait(5);
doubster 0:2a96017a6c8e 114 DrawPaddle(paddlerx,paddlery,paddlecolor);
doubster 0:2a96017a6c8e 115
doubster 0:2a96017a6c8e 116 DrawBall(ballx,bally,ballcolor);
doubster 0:2a96017a6c8e 117
doubster 0:2a96017a6c8e 118 while(true){
doubster 0:2a96017a6c8e 119
doubster 0:2a96017a6c8e 120 oldballx = ballx;
doubster 0:2a96017a6c8e 121 oldbally = bally;
doubster 0:2a96017a6c8e 122 ballx += ballxincr;
doubster 0:2a96017a6c8e 123 bally += ballyincr;
doubster 0:2a96017a6c8e 124 oldpaddlely = paddlely;
doubster 0:2a96017a6c8e 125 oldpaddlery = paddlery;
doubster 0:2a96017a6c8e 126 paddlely += paddlelincr;
doubster 0:2a96017a6c8e 127 paddlery += paddlerincr;
doubster 0:2a96017a6c8e 128
doubster 0:2a96017a6c8e 129 if(ballx+ballradius>=border){
doubster 0:2a96017a6c8e 130 // Lose
doubster 0:2a96017a6c8e 131 //ballxincr = -2;
doubster 0:2a96017a6c8e 132 Sound("end");
doubster 0:2a96017a6c8e 133 ballx = border/2;
doubster 0:2a96017a6c8e 134 bally = rand() % 100;
doubster 0:2a96017a6c8e 135 ballxincr = -1;
doubster 0:2a96017a6c8e 136 ballyincr = -ballyincr;
doubster 0:2a96017a6c8e 137 //hitvariable = 1;
doubster 0:2a96017a6c8e 138 //Sound("hit");
doubster 0:2a96017a6c8e 139 }
doubster 0:2a96017a6c8e 140 else if(ballx<=0){
doubster 0:2a96017a6c8e 141 // Lose
doubster 0:2a96017a6c8e 142 Sound("end");
doubster 0:2a96017a6c8e 143 ballx = border/2;
doubster 0:2a96017a6c8e 144 bally = rand() % 100;
doubster 0:2a96017a6c8e 145 ballxincr = 1;
doubster 0:2a96017a6c8e 146 ballyincr = -ballyincr;
doubster 0:2a96017a6c8e 147 //hitvariable = 1;
doubster 0:2a96017a6c8e 148 //Sound("hit");
doubster 0:2a96017a6c8e 149 }
doubster 0:2a96017a6c8e 150 if(bally+ballradius>=border){
doubster 0:2a96017a6c8e 151 ballyincr = -1;
doubster 0:2a96017a6c8e 152 hitvariable = 1;
doubster 0:2a96017a6c8e 153 //Sound("hit");
doubster 0:2a96017a6c8e 154 }
doubster 0:2a96017a6c8e 155 else if(bally<=0){
doubster 0:2a96017a6c8e 156 ballyincr = 1;
doubster 0:2a96017a6c8e 157 hitvariable = 1;
doubster 0:2a96017a6c8e 158 //Sound("hit");
doubster 0:2a96017a6c8e 159 }
doubster 0:2a96017a6c8e 160
doubster 0:2a96017a6c8e 161 // Left Paddle Collisions
doubster 0:2a96017a6c8e 162 if(ballx-ballradius<=paddlelx+paddlesizex && bally+ballradius>paddlely && bally-ballradius<paddlely+paddlesizey){
doubster 0:2a96017a6c8e 163 ballxincr = 1;
doubster 0:2a96017a6c8e 164 }
doubster 0:2a96017a6c8e 165 // Right Paddle Collision
doubster 0:2a96017a6c8e 166 else if(ballx+ballradius>=paddlerx && bally+ballradius>paddlery && bally-ballradius<paddlery+paddlesizey){
doubster 0:2a96017a6c8e 167 ballxincr = -1;
doubster 0:2a96017a6c8e 168 }
doubster 0:2a96017a6c8e 169
doubster 0:2a96017a6c8e 170 if(paddlely<0){
doubster 0:2a96017a6c8e 171 paddlely = 0;
doubster 0:2a96017a6c8e 172 //paddlelincr = 1;
doubster 0:2a96017a6c8e 173 }
doubster 0:2a96017a6c8e 174 else if(paddlely+paddlesizey>=border){
doubster 0:2a96017a6c8e 175 paddlely = border - paddlesizey;
doubster 0:2a96017a6c8e 176 //paddlelincr = -1;
doubster 0:2a96017a6c8e 177 }
doubster 0:2a96017a6c8e 178 if(paddlery<=0){
doubster 0:2a96017a6c8e 179 paddlery = 0;
doubster 0:2a96017a6c8e 180 //paddlerincr = 1;
doubster 0:2a96017a6c8e 181 }
doubster 0:2a96017a6c8e 182 else if(paddlery+paddlesizey>=border){
doubster 0:2a96017a6c8e 183 paddlery = border - paddlesizey;
doubster 0:2a96017a6c8e 184 //paddlerincr = -1;
doubster 0:2a96017a6c8e 185 }
doubster 0:2a96017a6c8e 186
doubster 0:2a96017a6c8e 187 //paddlelincr = 1;//(oldphotocell - photocell)/oldphotocell - photocell;
doubster 0:2a96017a6c8e 188 // Find a way to multiply by a certain fraction to obtain the difference in value high enough to write the line above. From old to new
doubster 0:2a96017a6c8e 189 // A matter of change. Or just leave it the way it is. But it should fluctuate with how fast the light changes, if the change is drastic, then we slide down the line fast.
doubster 0:2a96017a6c8e 190 // Or maybe it doesn't need to be so drastic. Just a simple, cover and unveil. Cover and unveil would work for this part of the game.
doubster 0:2a96017a6c8e 191 // Hardware Wise add teh other paddle. and software wise, simply add a new photocell at pin 16. and copy the code below.
doubster 0:2a96017a6c8e 192 if(photocellleft*100 >initialphotocell)
doubster 0:2a96017a6c8e 193 {
doubster 0:2a96017a6c8e 194 paddlelincr = -2;
doubster 0:2a96017a6c8e 195 }
doubster 0:2a96017a6c8e 196 else
doubster 0:2a96017a6c8e 197 {
doubster 0:2a96017a6c8e 198 paddlelincr = 2;
doubster 0:2a96017a6c8e 199 }
doubster 0:2a96017a6c8e 200 if(photocellright*100 > initialphotocell)
doubster 0:2a96017a6c8e 201 {
doubster 0:2a96017a6c8e 202 paddlerincr = -2;
doubster 0:2a96017a6c8e 203 }
doubster 0:2a96017a6c8e 204 else
doubster 0:2a96017a6c8e 205 {
doubster 0:2a96017a6c8e 206 paddlerincr = 2;
doubster 0:2a96017a6c8e 207 }
doubster 0:2a96017a6c8e 208 //oldphotocell = photocell;
doubster 0:2a96017a6c8e 209 DrawBall(oldballx,oldbally,black);
doubster 0:2a96017a6c8e 210 DrawBall(ballx,bally,ballcolor);
doubster 0:2a96017a6c8e 211 DrawPaddle(paddlelx,oldpaddlely,black);
doubster 0:2a96017a6c8e 212 DrawPaddle(paddlerx,oldpaddlery,black);
doubster 0:2a96017a6c8e 213 DrawPaddle(paddlelx,paddlely,paddlecolor);
doubster 0:2a96017a6c8e 214 DrawPaddle(paddlerx,paddlery,paddlecolor);
doubster 0:2a96017a6c8e 215 }
doubster 0:2a96017a6c8e 216
doubster 0:2a96017a6c8e 217
doubster 0:2a96017a6c8e 218
doubster 0:2a96017a6c8e 219 // Collisions
doubster 0:2a96017a6c8e 220 // For the hits might have to use threading, so that gameplay doesn't slow down when sound
doubster 0:2a96017a6c8e 221 // plays
doubster 0:2a96017a6c8e 222 //Sound("hit");
doubster 0:2a96017a6c8e 223
doubster 0:2a96017a6c8e 224 // Game over
doubster 0:2a96017a6c8e 225 //Sound("end");
doubster 0:2a96017a6c8e 226 }
doubster 0:2a96017a6c8e 227
doubster 0:2a96017a6c8e 228
doubster 0:2a96017a6c8e 229
doubster 0:2a96017a6c8e 230
doubster 0:2a96017a6c8e 231
doubster 0:2a96017a6c8e 232
doubster 0:2a96017a6c8e 233
doubster 0:2a96017a6c8e 234
doubster 0:2a96017a6c8e 235
doubster 0:2a96017a6c8e 236
doubster 0:2a96017a6c8e 237
doubster 0:2a96017a6c8e 238
doubster 0:2a96017a6c8e 239
doubster 0:2a96017a6c8e 240