Cave Runner Game w/Accelerometer and Nokia LCD

Dependencies:   mbed ADXL345 beep

Committer:
jhaksar
Date:
Tue Oct 11 16:42:41 2011 +0000
Revision:
0:200970a8c0bf

        

Who changed what in which revision?

UserRevisionLine numberNew 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