Cave Runner Game w/Accelerometer and Nokia LCD
Dependencies: mbed ADXL345 beep
main.cpp@0:200970a8c0bf, 2011-10-11 (annotated)
- Committer:
- jhaksar
- Date:
- Tue Oct 11 16:42:41 2011 +0000
- Revision:
- 0:200970a8c0bf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jhaksar | 0:200970a8c0bf | 1 | //Cave Runner Game |
jhaksar | 0:200970a8c0bf | 2 | //Jay Haksar |
jhaksar | 0:200970a8c0bf | 3 | //Anchit Nair |
jhaksar | 0:200970a8c0bf | 4 | |
jhaksar | 0:200970a8c0bf | 5 | #include "mbed.h" |
jhaksar | 0:200970a8c0bf | 6 | #include "NokiaLCD.h" |
jhaksar | 0:200970a8c0bf | 7 | #include "ADXL345.h" |
jhaksar | 0:200970a8c0bf | 8 | #include "beep.h" |
jhaksar | 0:200970a8c0bf | 9 | |
jhaksar | 0:200970a8c0bf | 10 | Serial pc(USBTX, USBRX); |
jhaksar | 0:200970a8c0bf | 11 | NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); //dio sck cs rst |
jhaksar | 0:200970a8c0bf | 12 | ADXL345 accelerometer(p11, p12, p13, p14); //sda sdo scl cs |
jhaksar | 0:200970a8c0bf | 13 | Beep speaker(p21); |
jhaksar | 0:200970a8c0bf | 14 | DigitalIn sw(p18); |
jhaksar | 0:200970a8c0bf | 15 | AnalogIn xin(p19); |
jhaksar | 0:200970a8c0bf | 16 | AnalogIn yin(p20); |
jhaksar | 0:200970a8c0bf | 17 | Ticker scorecounter; |
jhaksar | 0:200970a8c0bf | 18 | |
jhaksar | 0:200970a8c0bf | 19 | int score = 0; |
jhaksar | 0:200970a8c0bf | 20 | float difficulty = 0.05; |
jhaksar | 0:200970a8c0bf | 21 | |
jhaksar | 0:200970a8c0bf | 22 | void scoreincrease(){ |
jhaksar | 0:200970a8c0bf | 23 | score+=10; |
jhaksar | 0:200970a8c0bf | 24 | difficulty-=0.0005; |
jhaksar | 0:200970a8c0bf | 25 | } |
jhaksar | 0:200970a8c0bf | 26 | |
jhaksar | 0:200970a8c0bf | 27 | |
jhaksar | 0:200970a8c0bf | 28 | void setScreen(int wall[], int width, int numwalls){ |
jhaksar | 0:200970a8c0bf | 29 | //Sets the initial screen |
jhaksar | 0:200970a8c0bf | 30 | int current=0; |
jhaksar | 0:200970a8c0bf | 31 | |
jhaksar | 0:200970a8c0bf | 32 | lcd.fill(0,0, 130, 132, 0x00FF00); |
jhaksar | 0:200970a8c0bf | 33 | for(int j=0;j<131;j+=numwalls){ |
jhaksar | 0:200970a8c0bf | 34 | lcd.fill(wall[current], j, width, numwalls, 0x000000); |
jhaksar | 0:200970a8c0bf | 35 | current++; |
jhaksar | 0:200970a8c0bf | 36 | } |
jhaksar | 0:200970a8c0bf | 37 | } |
jhaksar | 0:200970a8c0bf | 38 | |
jhaksar | 0:200970a8c0bf | 39 | |
jhaksar | 0:200970a8c0bf | 40 | int main() { |
jhaksar | 0:200970a8c0bf | 41 | |
jhaksar | 0:200970a8c0bf | 42 | long average[3] = {0, 0, 0}; |
jhaksar | 0:200970a8c0bf | 43 | int measurement[3] = {0, 0, 0}; |
jhaksar | 0:200970a8c0bf | 44 | int scaled[2] = {0,0}; |
jhaksar | 0:200970a8c0bf | 45 | int gamestate = 0; |
jhaksar | 0:200970a8c0bf | 46 | int scoreboard[5] = {200, 150, 100, 50, 0}; |
jhaksar | 0:200970a8c0bf | 47 | |
jhaksar | 0:200970a8c0bf | 48 | |
jhaksar | 0:200970a8c0bf | 49 | int ballx = 65, bally = 70, ballw = 4, ballh = 4; |
jhaksar | 0:200970a8c0bf | 50 | int width = 40; |
jhaksar | 0:200970a8c0bf | 51 | int wall[66] = {0}; |
jhaksar | 0:200970a8c0bf | 52 | int change; |
jhaksar | 0:200970a8c0bf | 53 | int offset = 0; |
jhaksar | 0:200970a8c0bf | 54 | int numwalls = 2; |
jhaksar | 0:200970a8c0bf | 55 | int check = 0; |
jhaksar | 0:200970a8c0bf | 56 | int prevWall; |
jhaksar | 0:200970a8c0bf | 57 | |
jhaksar | 0:200970a8c0bf | 58 | sw.mode(PullUp); |
jhaksar | 0:200970a8c0bf | 59 | |
jhaksar | 0:200970a8c0bf | 60 | accelerometer.setPowerControl(0x00); |
jhaksar | 0:200970a8c0bf | 61 | accelerometer.setDataFormatControl(0x0B); |
jhaksar | 0:200970a8c0bf | 62 | accelerometer.setDataRate(ADXL345_3200HZ); |
jhaksar | 0:200970a8c0bf | 63 | accelerometer.setPowerControl(0x08); |
jhaksar | 0:200970a8c0bf | 64 | |
jhaksar | 0:200970a8c0bf | 65 | for(int i=0;i<=65;i++){ |
jhaksar | 0:200970a8c0bf | 66 | wall[i] = 46; |
jhaksar | 0:200970a8c0bf | 67 | } |
jhaksar | 0:200970a8c0bf | 68 | setScreen(wall, width, numwalls); |
jhaksar | 0:200970a8c0bf | 69 | |
jhaksar | 0:200970a8c0bf | 70 | while(1){ |
jhaksar | 0:200970a8c0bf | 71 | |
jhaksar | 0:200970a8c0bf | 72 | while(gamestate == 0){ |
jhaksar | 0:200970a8c0bf | 73 | |
jhaksar | 0:200970a8c0bf | 74 | lcd.fill(ballx, bally, ballw, ballh, 0x000000); |
jhaksar | 0:200970a8c0bf | 75 | |
jhaksar | 0:200970a8c0bf | 76 | for(int i=65;i>=1;i--){ |
jhaksar | 0:200970a8c0bf | 77 | if(i>=15){ |
jhaksar | 0:200970a8c0bf | 78 | change = wall[i] - wall[i-1]; |
jhaksar | 0:200970a8c0bf | 79 | if(change<0){ |
jhaksar | 0:200970a8c0bf | 80 | lcd.fill(wall[i],i*2,-change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 81 | lcd.fill(wall[i]+width,i*2,-change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 82 | } |
jhaksar | 0:200970a8c0bf | 83 | else if(change>0){ |
jhaksar | 0:200970a8c0bf | 84 | lcd.fill(wall[i-1],i*2,change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 85 | lcd.fill(wall[i-1]+width,i*2,change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 86 | } |
jhaksar | 0:200970a8c0bf | 87 | } |
jhaksar | 0:200970a8c0bf | 88 | wall[i] = wall[i-1]; |
jhaksar | 0:200970a8c0bf | 89 | } |
jhaksar | 0:200970a8c0bf | 90 | |
jhaksar | 0:200970a8c0bf | 91 | |
jhaksar | 0:200970a8c0bf | 92 | prevWall = wall[0]; |
jhaksar | 0:200970a8c0bf | 93 | |
jhaksar | 0:200970a8c0bf | 94 | if(wall[0] < 10){offset = -1;} |
jhaksar | 0:200970a8c0bf | 95 | else if(wall[0]+width > 120){offset = 1;} |
jhaksar | 0:200970a8c0bf | 96 | |
jhaksar | 0:200970a8c0bf | 97 | wall[0] = wall[0] + ((rand() % 5) - 2 - offset); |
jhaksar | 0:200970a8c0bf | 98 | |
jhaksar | 0:200970a8c0bf | 99 | if(wall[0] <= 0){wall[0] = 1;} |
jhaksar | 0:200970a8c0bf | 100 | if(wall[0]+width >= 130){wall[0] = 130-width;} |
jhaksar | 0:200970a8c0bf | 101 | |
jhaksar | 0:200970a8c0bf | 102 | check = bally/numwalls; |
jhaksar | 0:200970a8c0bf | 103 | ballx = (wall[check] + (width/2)) - (ballw/2); |
jhaksar | 0:200970a8c0bf | 104 | |
jhaksar | 0:200970a8c0bf | 105 | |
jhaksar | 0:200970a8c0bf | 106 | lcd.fill(ballx, bally, ballw, ballh, 0xFF0000); |
jhaksar | 0:200970a8c0bf | 107 | |
jhaksar | 0:200970a8c0bf | 108 | wait(0.02); |
jhaksar | 0:200970a8c0bf | 109 | |
jhaksar | 0:200970a8c0bf | 110 | lcd.fill(0,0,130,30,0x000000); |
jhaksar | 0:200970a8c0bf | 111 | |
jhaksar | 0:200970a8c0bf | 112 | lcd.locate(5,1); |
jhaksar | 0:200970a8c0bf | 113 | lcd.printf(" CAVE"); |
jhaksar | 0:200970a8c0bf | 114 | lcd.locate(5,2); |
jhaksar | 0:200970a8c0bf | 115 | lcd.printf("RUNNER"); |
jhaksar | 0:200970a8c0bf | 116 | |
jhaksar | 0:200970a8c0bf | 117 | |
jhaksar | 0:200970a8c0bf | 118 | if(sw == 0){ |
jhaksar | 0:200970a8c0bf | 119 | lcd.cls(); |
jhaksar | 0:200970a8c0bf | 120 | |
jhaksar | 0:200970a8c0bf | 121 | srand(time(NULL)); |
jhaksar | 0:200970a8c0bf | 122 | |
jhaksar | 0:200970a8c0bf | 123 | for(int i=0;i<=65;i++){ |
jhaksar | 0:200970a8c0bf | 124 | wall[i] = 46; |
jhaksar | 0:200970a8c0bf | 125 | } |
jhaksar | 0:200970a8c0bf | 126 | setScreen(wall, width, numwalls); |
jhaksar | 0:200970a8c0bf | 127 | |
jhaksar | 0:200970a8c0bf | 128 | speaker.beep(100, 0.1); |
jhaksar | 0:200970a8c0bf | 129 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 130 | speaker.beep(200, 0.1); |
jhaksar | 0:200970a8c0bf | 131 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 132 | speaker.beep(300, 0.1); |
jhaksar | 0:200970a8c0bf | 133 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 134 | speaker.beep(400, 0.2); |
jhaksar | 0:200970a8c0bf | 135 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 136 | |
jhaksar | 0:200970a8c0bf | 137 | ballx = 65; |
jhaksar | 0:200970a8c0bf | 138 | bally = 65; |
jhaksar | 0:200970a8c0bf | 139 | scorecounter.attach(&scoreincrease, 1.0); |
jhaksar | 0:200970a8c0bf | 140 | |
jhaksar | 0:200970a8c0bf | 141 | gamestate = 1; |
jhaksar | 0:200970a8c0bf | 142 | } |
jhaksar | 0:200970a8c0bf | 143 | } |
jhaksar | 0:200970a8c0bf | 144 | |
jhaksar | 0:200970a8c0bf | 145 | while(gamestate == 1){ |
jhaksar | 0:200970a8c0bf | 146 | |
jhaksar | 0:200970a8c0bf | 147 | |
jhaksar | 0:200970a8c0bf | 148 | lcd.fill(ballx, bally, ballw, ballh, 0x000000); |
jhaksar | 0:200970a8c0bf | 149 | /* |
jhaksar | 0:200970a8c0bf | 150 | if(xin > 0.6 && ((ballx+ballw) < 127)){ballx+=2;} |
jhaksar | 0:200970a8c0bf | 151 | if(xin < 0.4 && ((ballx) > 3)){ballx-=2;} |
jhaksar | 0:200970a8c0bf | 152 | if(yin < 0.4 && ((bally) > 5)){bally-=2;} |
jhaksar | 0:200970a8c0bf | 153 | if(yin > 0.6 && ((bally+ballh) < 127)){bally+=2;} |
jhaksar | 0:200970a8c0bf | 154 | |
jhaksar | 0:200970a8c0bf | 155 | if(xin > 0.8 && ((ballx+ballw) < 126)){ballx+=3;} |
jhaksar | 0:200970a8c0bf | 156 | else if(xin > 0.6 && ((ballx+ballw) < 128)){ballx++;} |
jhaksar | 0:200970a8c0bf | 157 | else if(xin < 0.2 && ((ballx) > 4)){ballx-=3;} |
jhaksar | 0:200970a8c0bf | 158 | else if(xin < 0.4 && ((ballx) > 2)){ballx--;} |
jhaksar | 0:200970a8c0bf | 159 | |
jhaksar | 0:200970a8c0bf | 160 | if(yin > 0.8 && ((bally+ballh) < 128)){bally+=3;} |
jhaksar | 0:200970a8c0bf | 161 | else if(yin > 0.6 && ((bally+ballh) < 130)){bally++;} |
jhaksar | 0:200970a8c0bf | 162 | else if(yin < 0.2 && ((bally) > 6)){bally-=3;} |
jhaksar | 0:200970a8c0bf | 163 | else if(yin < 0.4 && ((bally) > 4)){bally--;} |
jhaksar | 0:200970a8c0bf | 164 | */ |
jhaksar | 0:200970a8c0bf | 165 | |
jhaksar | 0:200970a8c0bf | 166 | accelerometer.getOutput(measurement); |
jhaksar | 0:200970a8c0bf | 167 | |
jhaksar | 0:200970a8c0bf | 168 | average[0] = ((49*(long)measurement[0]) + average[0]) / 50; |
jhaksar | 0:200970a8c0bf | 169 | average[1] = ((49*(long)measurement[1]) + average[1]) / 50; |
jhaksar | 0:200970a8c0bf | 170 | average[2] = ((49*(long)measurement[2]) + average[2]) / 50; |
jhaksar | 0:200970a8c0bf | 171 | |
jhaksar | 0:200970a8c0bf | 172 | if((int16_t)average[0] > 50 && (int16_t)average[0] < 200){scaled[0] = 1;} |
jhaksar | 0:200970a8c0bf | 173 | else if((int16_t)average[0] < -10 && (int16_t)average[0] > -200){scaled[0] = -1;} |
jhaksar | 0:200970a8c0bf | 174 | else{scaled[0] = 0;} |
jhaksar | 0:200970a8c0bf | 175 | |
jhaksar | 0:200970a8c0bf | 176 | if((int16_t)average[1] > 10 && (int16_t)average[0] < 200){scaled[1] = 1;} |
jhaksar | 0:200970a8c0bf | 177 | else if((int16_t)average[1] < -50 && (int16_t)average[0] > -200){scaled[1] = -1;} |
jhaksar | 0:200970a8c0bf | 178 | else{scaled[1] = 0;} |
jhaksar | 0:200970a8c0bf | 179 | |
jhaksar | 0:200970a8c0bf | 180 | if(scaled[0] > 0 && ((ballx+ballw) < 127)){ballx+=2;} |
jhaksar | 0:200970a8c0bf | 181 | if(scaled[0] < 0 && ((ballx) > 3)){ballx-=2;} |
jhaksar | 0:200970a8c0bf | 182 | if(scaled[1] > 0 && ((bally) > 5)){bally-=2;} |
jhaksar | 0:200970a8c0bf | 183 | if(scaled[1] < 0 && ((bally+ballh) < 127)){bally+=2;} |
jhaksar | 0:200970a8c0bf | 184 | |
jhaksar | 0:200970a8c0bf | 185 | |
jhaksar | 0:200970a8c0bf | 186 | |
jhaksar | 0:200970a8c0bf | 187 | for(int i=65;i>=1;i--){ |
jhaksar | 0:200970a8c0bf | 188 | change = wall[i] - wall[i-1]; |
jhaksar | 0:200970a8c0bf | 189 | if(change<0){ |
jhaksar | 0:200970a8c0bf | 190 | lcd.fill(wall[i],i*2,-change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 191 | lcd.fill(wall[i]+width,i*2,-change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 192 | } |
jhaksar | 0:200970a8c0bf | 193 | else if(change>0){ |
jhaksar | 0:200970a8c0bf | 194 | lcd.fill(wall[i-1],i*2,change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 195 | lcd.fill(wall[i-1]+width,i*2,change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 196 | } |
jhaksar | 0:200970a8c0bf | 197 | wall[i] = wall[i-1]; |
jhaksar | 0:200970a8c0bf | 198 | } |
jhaksar | 0:200970a8c0bf | 199 | |
jhaksar | 0:200970a8c0bf | 200 | |
jhaksar | 0:200970a8c0bf | 201 | prevWall = wall[0]; |
jhaksar | 0:200970a8c0bf | 202 | |
jhaksar | 0:200970a8c0bf | 203 | if(wall[0] < 10){offset = -1;} |
jhaksar | 0:200970a8c0bf | 204 | else if(wall[0]+width > 120){offset = 1;} |
jhaksar | 0:200970a8c0bf | 205 | |
jhaksar | 0:200970a8c0bf | 206 | wall[0] = wall[0] + ((rand() % 5) - 2 - offset); |
jhaksar | 0:200970a8c0bf | 207 | |
jhaksar | 0:200970a8c0bf | 208 | if(wall[0] <= 0){wall[0] = 1;} |
jhaksar | 0:200970a8c0bf | 209 | if(wall[0]+width >= 130){wall[0] = 130-width;} |
jhaksar | 0:200970a8c0bf | 210 | |
jhaksar | 0:200970a8c0bf | 211 | |
jhaksar | 0:200970a8c0bf | 212 | |
jhaksar | 0:200970a8c0bf | 213 | change = prevWall - wall[0]; |
jhaksar | 0:200970a8c0bf | 214 | if(change<0){ |
jhaksar | 0:200970a8c0bf | 215 | lcd.fill(prevWall,0,-change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 216 | lcd.fill(prevWall+width,0,-change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 217 | } |
jhaksar | 0:200970a8c0bf | 218 | else if(change>0){ |
jhaksar | 0:200970a8c0bf | 219 | lcd.fill(wall[0],0,change,numwalls,0x000000); |
jhaksar | 0:200970a8c0bf | 220 | lcd.fill(wall[0]+width,0,change,numwalls,0x00FF00); |
jhaksar | 0:200970a8c0bf | 221 | } |
jhaksar | 0:200970a8c0bf | 222 | |
jhaksar | 0:200970a8c0bf | 223 | lcd.fill(ballx, bally, ballw, ballh, 0xFF0000); |
jhaksar | 0:200970a8c0bf | 224 | |
jhaksar | 0:200970a8c0bf | 225 | wait(difficulty); |
jhaksar | 0:200970a8c0bf | 226 | |
jhaksar | 0:200970a8c0bf | 227 | |
jhaksar | 0:200970a8c0bf | 228 | check = bally/numwalls; |
jhaksar | 0:200970a8c0bf | 229 | if(wall[check] >= ballx || (wall[check]+width) <= (ballx+ballh)){ |
jhaksar | 0:200970a8c0bf | 230 | gamestate = 2; |
jhaksar | 0:200970a8c0bf | 231 | scorecounter.detach(); |
jhaksar | 0:200970a8c0bf | 232 | speaker.beep(400, 0.1); |
jhaksar | 0:200970a8c0bf | 233 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 234 | speaker.beep(300, 0.1); |
jhaksar | 0:200970a8c0bf | 235 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 236 | speaker.beep(200, 0.1); |
jhaksar | 0:200970a8c0bf | 237 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 238 | speaker.beep(100, 0.2); |
jhaksar | 0:200970a8c0bf | 239 | wait(0.1); |
jhaksar | 0:200970a8c0bf | 240 | } |
jhaksar | 0:200970a8c0bf | 241 | |
jhaksar | 0:200970a8c0bf | 242 | } |
jhaksar | 0:200970a8c0bf | 243 | while(gamestate == 2){ |
jhaksar | 0:200970a8c0bf | 244 | |
jhaksar | 0:200970a8c0bf | 245 | for(int i=4;i>=0;i--){ |
jhaksar | 0:200970a8c0bf | 246 | if(score > scoreboard[i] && score < scoreboard[i-1]){ |
jhaksar | 0:200970a8c0bf | 247 | scoreboard[i] = score; |
jhaksar | 0:200970a8c0bf | 248 | } |
jhaksar | 0:200970a8c0bf | 249 | } |
jhaksar | 0:200970a8c0bf | 250 | if(score > scoreboard[0]){scoreboard[0] = score;} |
jhaksar | 0:200970a8c0bf | 251 | |
jhaksar | 0:200970a8c0bf | 252 | lcd.locate(4,3); |
jhaksar | 0:200970a8c0bf | 253 | lcd.printf("%i", score); |
jhaksar | 0:200970a8c0bf | 254 | lcd.locate(4,4); |
jhaksar | 0:200970a8c0bf | 255 | lcd.printf("GAME OVER"); |
jhaksar | 0:200970a8c0bf | 256 | for(int i=0;i<=4;i++){ |
jhaksar | 0:200970a8c0bf | 257 | lcd.locate(4,i+5); |
jhaksar | 0:200970a8c0bf | 258 | lcd.printf("%i", scoreboard[i]); |
jhaksar | 0:200970a8c0bf | 259 | } |
jhaksar | 0:200970a8c0bf | 260 | |
jhaksar | 0:200970a8c0bf | 261 | if(sw == 0){ |
jhaksar | 0:200970a8c0bf | 262 | ballx = 65; |
jhaksar | 0:200970a8c0bf | 263 | bally = 65; |
jhaksar | 0:200970a8c0bf | 264 | srand(time(NULL)); |
jhaksar | 0:200970a8c0bf | 265 | for(int i=0;i<=65;i++){ |
jhaksar | 0:200970a8c0bf | 266 | wall[i] = 46; |
jhaksar | 0:200970a8c0bf | 267 | } |
jhaksar | 0:200970a8c0bf | 268 | setScreen(wall, width, numwalls); |
jhaksar | 0:200970a8c0bf | 269 | gamestate = 0; |
jhaksar | 0:200970a8c0bf | 270 | difficulty = 0.05; |
jhaksar | 0:200970a8c0bf | 271 | score = 0; |
jhaksar | 0:200970a8c0bf | 272 | offset = 0; |
jhaksar | 0:200970a8c0bf | 273 | wait(0.5); |
jhaksar | 0:200970a8c0bf | 274 | } |
jhaksar | 0:200970a8c0bf | 275 | } |
jhaksar | 0:200970a8c0bf | 276 | |
jhaksar | 0:200970a8c0bf | 277 | } |
jhaksar | 0:200970a8c0bf | 278 | } |
jhaksar | 0:200970a8c0bf | 279 | |
jhaksar | 0:200970a8c0bf | 280 | |
jhaksar | 0:200970a8c0bf | 281 | |
jhaksar | 0:200970a8c0bf | 282 | |
jhaksar | 0:200970a8c0bf | 283 |