Tank Dodger Game
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp@0:350246c72962, 2017-03-14 (annotated)
- Committer:
- ashankar35
- Date:
- Tue Mar 14 19:18:48 2017 +0000
- Revision:
- 0:350246c72962
Lab4-FinalGame
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ashankar35 | 0:350246c72962 | 1 | #include "mbed.h" |
ashankar35 | 0:350246c72962 | 2 | #include "globals.h" |
ashankar35 | 0:350246c72962 | 3 | #include "uLCD_4DGL.h" |
ashankar35 | 0:350246c72962 | 4 | #include "rtos.h" |
ashankar35 | 0:350246c72962 | 5 | #include "wave_player.h" |
ashankar35 | 0:350246c72962 | 6 | #include "SDFileSystem.h" |
ashankar35 | 0:350246c72962 | 7 | #include <mpr121.h> |
ashankar35 | 0:350246c72962 | 8 | |
ashankar35 | 0:350246c72962 | 9 | |
ashankar35 | 0:350246c72962 | 10 | DigitalOut led1(LED1); |
ashankar35 | 0:350246c72962 | 11 | DigitalOut led2(LED2); |
ashankar35 | 0:350246c72962 | 12 | DigitalOut led3(LED3); |
ashankar35 | 0:350246c72962 | 13 | DigitalOut led4(LED4); |
ashankar35 | 0:350246c72962 | 14 | InterruptIn interrupt(p26); |
ashankar35 | 0:350246c72962 | 15 | uLCD_4DGL uLCD(p13,p14,p15); |
ashankar35 | 0:350246c72962 | 16 | AnalogOut DACout(p18); |
ashankar35 | 0:350246c72962 | 17 | wave_player player(&DACout); |
ashankar35 | 0:350246c72962 | 18 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
ashankar35 | 0:350246c72962 | 19 | I2C i2c(p9, p10); |
ashankar35 | 0:350246c72962 | 20 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
ashankar35 | 0:350246c72962 | 21 | |
ashankar35 | 0:350246c72962 | 22 | int ballNum = 0; |
ashankar35 | 0:350246c72962 | 23 | int tank_x; |
ashankar35 | 0:350246c72962 | 24 | int tank_y; |
ashankar35 | 0:350246c72962 | 25 | int balls_x[15]; |
ashankar35 | 0:350246c72962 | 26 | int balls_y[15]; |
ashankar35 | 0:350246c72962 | 27 | int balls_color[15]; |
ashankar35 | 0:350246c72962 | 28 | int lives = 1; |
ashankar35 | 0:350246c72962 | 29 | int dist = 0; |
ashankar35 | 0:350246c72962 | 30 | bool win = false; |
ashankar35 | 0:350246c72962 | 31 | bool playing = true; |
ashankar35 | 0:350246c72962 | 32 | volatile bool chosen = false; |
ashankar35 | 0:350246c72962 | 33 | int noOfLives; |
ashankar35 | 0:350246c72962 | 34 | volatile bool moved = false; |
ashankar35 | 0:350246c72962 | 35 | Mutex lcd_mutex; |
ashankar35 | 0:350246c72962 | 36 | |
ashankar35 | 0:350246c72962 | 37 | void fallInterrupt() { |
ashankar35 | 0:350246c72962 | 38 | int key_code=0; |
ashankar35 | 0:350246c72962 | 39 | int i=0; |
ashankar35 | 0:350246c72962 | 40 | int value=mpr121.read(0x00); |
ashankar35 | 0:350246c72962 | 41 | value +=mpr121.read(0x01)<<8; |
ashankar35 | 0:350246c72962 | 42 | for (i=0; i<12; i++) { |
ashankar35 | 0:350246c72962 | 43 | if (((value>>i)&0x01)==1) key_code=i+1; |
ashankar35 | 0:350246c72962 | 44 | } |
ashankar35 | 0:350246c72962 | 45 | led4=key_code & 0x01; |
ashankar35 | 0:350246c72962 | 46 | led3=(key_code>>1) & 0x01; |
ashankar35 | 0:350246c72962 | 47 | led2=(key_code>>2) & 0x01; |
ashankar35 | 0:350246c72962 | 48 | led1=(key_code>>3) & 0x01; |
ashankar35 | 0:350246c72962 | 49 | //uLCD.printf("%d", key_code); |
ashankar35 | 0:350246c72962 | 50 | noOfLives = key_code; |
ashankar35 | 0:350246c72962 | 51 | chosen = true; |
ashankar35 | 0:350246c72962 | 52 | } |
ashankar35 | 0:350246c72962 | 53 | |
ashankar35 | 0:350246c72962 | 54 | |
ashankar35 | 0:350246c72962 | 55 | void tankMove() { |
ashankar35 | 0:350246c72962 | 56 | int key_code=0; |
ashankar35 | 0:350246c72962 | 57 | int i=0; |
ashankar35 | 0:350246c72962 | 58 | int value=mpr121.read(0x00); |
ashankar35 | 0:350246c72962 | 59 | value +=mpr121.read(0x01)<<8; |
ashankar35 | 0:350246c72962 | 60 | for (i=0; i<12; i++) { |
ashankar35 | 0:350246c72962 | 61 | if (((value>>i)&0x01)==1) key_code=i+1; |
ashankar35 | 0:350246c72962 | 62 | } |
ashankar35 | 0:350246c72962 | 63 | dist = 0; |
ashankar35 | 0:350246c72962 | 64 | if(key_code == 5) { |
ashankar35 | 0:350246c72962 | 65 | dist = 5; |
ashankar35 | 0:350246c72962 | 66 | moved = true; |
ashankar35 | 0:350246c72962 | 67 | } else if(key_code == 7){ |
ashankar35 | 0:350246c72962 | 68 | dist = -5; |
ashankar35 | 0:350246c72962 | 69 | moved = true; |
ashankar35 | 0:350246c72962 | 70 | } |
ashankar35 | 0:350246c72962 | 71 | } |
ashankar35 | 0:350246c72962 | 72 | |
ashankar35 | 0:350246c72962 | 73 | void game_init(){ |
ashankar35 | 0:350246c72962 | 74 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 75 | uLCD.cls(); |
ashankar35 | 0:350246c72962 | 76 | const unsigned ImageHeight=128; |
ashankar35 | 0:350246c72962 | 77 | const unsigned ImageWidth=128; |
ashankar35 | 0:350246c72962 | 78 | //"c" region to display |
ashankar35 | 0:350246c72962 | 79 | double MinRe = -0.75104; |
ashankar35 | 0:350246c72962 | 80 | double MaxRe = -0.7408; |
ashankar35 | 0:350246c72962 | 81 | double MinIm = 0.10511; |
ashankar35 | 0:350246c72962 | 82 | double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth; |
ashankar35 | 0:350246c72962 | 83 | double Re_factor = (MaxRe-MinRe)/(ImageWidth-1); |
ashankar35 | 0:350246c72962 | 84 | double Im_factor = (MaxIm-MinIm)/(ImageHeight-1); |
ashankar35 | 0:350246c72962 | 85 | unsigned MaxIterations = 2048; |
ashankar35 | 0:350246c72962 | 86 | for(unsigned y=0; y<ImageHeight; ++y) { |
ashankar35 | 0:350246c72962 | 87 | double c_im = MaxIm - y*Im_factor; |
ashankar35 | 0:350246c72962 | 88 | for(unsigned x=0; x<ImageWidth; ++x) { |
ashankar35 | 0:350246c72962 | 89 | double c_re = MinRe + x*Re_factor; |
ashankar35 | 0:350246c72962 | 90 | double Z_re = c_re, Z_im = c_im; |
ashankar35 | 0:350246c72962 | 91 | int niterations=0; |
ashankar35 | 0:350246c72962 | 92 | for(unsigned n=0; n<MaxIterations; ++n) { |
ashankar35 | 0:350246c72962 | 93 | double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im; |
ashankar35 | 0:350246c72962 | 94 | if(Z_re2 + Z_im2 > 4) { |
ashankar35 | 0:350246c72962 | 95 | niterations = n; |
ashankar35 | 0:350246c72962 | 96 | break; |
ashankar35 | 0:350246c72962 | 97 | } |
ashankar35 | 0:350246c72962 | 98 | Z_im = 2*Z_re*Z_im + c_im; |
ashankar35 | 0:350246c72962 | 99 | Z_re = Z_re2 - Z_im2 + c_re; |
ashankar35 | 0:350246c72962 | 100 | } |
ashankar35 | 0:350246c72962 | 101 | if (niterations!=(MaxIterations-1)) |
ashankar35 | 0:350246c72962 | 102 | uLCD.pixel(x,y,((niterations & 0xF00)<<12)+((niterations & 0xF0)<<8)+((niterations & 0x0F)<<4) ); |
ashankar35 | 0:350246c72962 | 103 | } |
ashankar35 | 0:350246c72962 | 104 | } |
ashankar35 | 0:350246c72962 | 105 | uLCD.cls(); |
ashankar35 | 0:350246c72962 | 106 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 107 | led1 = 0; led2 = 0; led3 = 0; led4 = 0; |
ashankar35 | 0:350246c72962 | 108 | for(int i = 0 ; i <15; i++ ){ |
ashankar35 | 0:350246c72962 | 109 | balls_x[i] = rand() % 120 + 5; |
ashankar35 | 0:350246c72962 | 110 | balls_y[i] = 3; |
ashankar35 | 0:350246c72962 | 111 | balls_color[i] = rand() % 2 +1; |
ashankar35 | 0:350246c72962 | 112 | } |
ashankar35 | 0:350246c72962 | 113 | tank_x= 60; |
ashankar35 | 0:350246c72962 | 114 | tank_y= 122; |
ashankar35 | 0:350246c72962 | 115 | //uLCD.background_color(SKY_COLOR); |
ashankar35 | 0:350246c72962 | 116 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 117 | uLCD.filled_circle(tank_x+2, tank_y, 3, BLUE); |
ashankar35 | 0:350246c72962 | 118 | uLCD.filled_circle(tank_x+9, tank_y, 3, BLUE); |
ashankar35 | 0:350246c72962 | 119 | uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, RED); |
ashankar35 | 0:350246c72962 | 120 | uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, RED); |
ashankar35 | 0:350246c72962 | 121 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 122 | |
ashankar35 | 0:350246c72962 | 123 | } |
ashankar35 | 0:350246c72962 | 124 | |
ashankar35 | 0:350246c72962 | 125 | void moveBall(){ |
ashankar35 | 0:350246c72962 | 126 | uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK); |
ashankar35 | 0:350246c72962 | 127 | balls_y[ballNum] = balls_y[ballNum] + 2; |
ashankar35 | 0:350246c72962 | 128 | if(balls_color[ballNum] == 1){ |
ashankar35 | 0:350246c72962 | 129 | uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLUE); |
ashankar35 | 0:350246c72962 | 130 | } else { |
ashankar35 | 0:350246c72962 | 131 | uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, RED); |
ashankar35 | 0:350246c72962 | 132 | } |
ashankar35 | 0:350246c72962 | 133 | } |
ashankar35 | 0:350246c72962 | 134 | |
ashankar35 | 0:350246c72962 | 135 | void thread1(void const *args) |
ashankar35 | 0:350246c72962 | 136 | { |
ashankar35 | 0:350246c72962 | 137 | while(balls_y[ballNum] < 116){ |
ashankar35 | 0:350246c72962 | 138 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 139 | moveBall(); |
ashankar35 | 0:350246c72962 | 140 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 141 | if(balls_y[ballNum] >= 116){ |
ashankar35 | 0:350246c72962 | 142 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 143 | uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK); |
ashankar35 | 0:350246c72962 | 144 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 145 | ballNum++; |
ashankar35 | 0:350246c72962 | 146 | } |
ashankar35 | 0:350246c72962 | 147 | } |
ashankar35 | 0:350246c72962 | 148 | Thread::wait(1000); |
ashankar35 | 0:350246c72962 | 149 | } |
ashankar35 | 0:350246c72962 | 150 | |
ashankar35 | 0:350246c72962 | 151 | void thread2(void const *args){ |
ashankar35 | 0:350246c72962 | 152 | FILE *wave_file; |
ashankar35 | 0:350246c72962 | 153 | wave_file=fopen("/sd/wavfiles/sweeper.wav","r"); |
ashankar35 | 0:350246c72962 | 154 | if(wave_file == NULL) { |
ashankar35 | 0:350246c72962 | 155 | led1 =1; |
ashankar35 | 0:350246c72962 | 156 | } else { |
ashankar35 | 0:350246c72962 | 157 | player.play(wave_file); |
ashankar35 | 0:350246c72962 | 158 | led1 =0; |
ashankar35 | 0:350246c72962 | 159 | } |
ashankar35 | 0:350246c72962 | 160 | fclose(wave_file); |
ashankar35 | 0:350246c72962 | 161 | } |
ashankar35 | 0:350246c72962 | 162 | |
ashankar35 | 0:350246c72962 | 163 | void thread3(void const *args) |
ashankar35 | 0:350246c72962 | 164 | { |
ashankar35 | 0:350246c72962 | 165 | while(playing){ |
ashankar35 | 0:350246c72962 | 166 | interrupt.fall(&tankMove); |
ashankar35 | 0:350246c72962 | 167 | interrupt.mode(PullUp); |
ashankar35 | 0:350246c72962 | 168 | while(!moved){} |
ashankar35 | 0:350246c72962 | 169 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 170 | uLCD.filled_circle(tank_x+2, tank_y, 3, BLACK); |
ashankar35 | 0:350246c72962 | 171 | uLCD.filled_circle(tank_x+9, tank_y, 3, BLACK); |
ashankar35 | 0:350246c72962 | 172 | uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, BLACK); |
ashankar35 | 0:350246c72962 | 173 | uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, BLACK); |
ashankar35 | 0:350246c72962 | 174 | |
ashankar35 | 0:350246c72962 | 175 | tank_x = tank_x + dist; |
ashankar35 | 0:350246c72962 | 176 | |
ashankar35 | 0:350246c72962 | 177 | uLCD.filled_circle(tank_x+2, tank_y, 3, BLUE); |
ashankar35 | 0:350246c72962 | 178 | uLCD.filled_circle(tank_x+9, tank_y, 3, BLUE); |
ashankar35 | 0:350246c72962 | 179 | uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, RED); |
ashankar35 | 0:350246c72962 | 180 | uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, RED); |
ashankar35 | 0:350246c72962 | 181 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 182 | moved = false; |
ashankar35 | 0:350246c72962 | 183 | } |
ashankar35 | 0:350246c72962 | 184 | //Thread::wait(1000); |
ashankar35 | 0:350246c72962 | 185 | } |
ashankar35 | 0:350246c72962 | 186 | |
ashankar35 | 0:350246c72962 | 187 | void gameover(){ |
ashankar35 | 0:350246c72962 | 188 | uLCD.cls(); |
ashankar35 | 0:350246c72962 | 189 | led1=1; |
ashankar35 | 0:350246c72962 | 190 | uLCD.locate(0,10); |
ashankar35 | 0:350246c72962 | 191 | if(win){ |
ashankar35 | 0:350246c72962 | 192 | uLCD.printf("Win"); |
ashankar35 | 0:350246c72962 | 193 | } else { |
ashankar35 | 0:350246c72962 | 194 | uLCD.printf("Lose"); |
ashankar35 | 0:350246c72962 | 195 | } |
ashankar35 | 0:350246c72962 | 196 | } |
ashankar35 | 0:350246c72962 | 197 | |
ashankar35 | 0:350246c72962 | 198 | int main() { |
ashankar35 | 0:350246c72962 | 199 | |
ashankar35 | 0:350246c72962 | 200 | Thread t2(thread2); |
ashankar35 | 0:350246c72962 | 201 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 202 | uLCD.locate(0,5); |
ashankar35 | 0:350246c72962 | 203 | uLCD.printf("Touch to Start"); |
ashankar35 | 0:350246c72962 | 204 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 205 | interrupt.fall(&fallInterrupt); |
ashankar35 | 0:350246c72962 | 206 | interrupt.mode(PullUp); |
ashankar35 | 0:350246c72962 | 207 | while(!chosen){}; |
ashankar35 | 0:350246c72962 | 208 | //t2.terminate(); |
ashankar35 | 0:350246c72962 | 209 | game_init(); |
ashankar35 | 0:350246c72962 | 210 | Thread t1(thread1); |
ashankar35 | 0:350246c72962 | 211 | Thread t3(thread3); |
ashankar35 | 0:350246c72962 | 212 | while(ballNum < 15) { |
ashankar35 | 0:350246c72962 | 213 | Thread::wait(50); |
ashankar35 | 0:350246c72962 | 214 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 215 | uLCD.locate(0,0); |
ashankar35 | 0:350246c72962 | 216 | uLCD.printf("Lives: %d",lives); |
ashankar35 | 0:350246c72962 | 217 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 218 | if((balls_x[ballNum] < tank_x+12) && (balls_x[ballNum]+3 > tank_x) && |
ashankar35 | 0:350246c72962 | 219 | (balls_y[ballNum] > tank_y-10)){ |
ashankar35 | 0:350246c72962 | 220 | lcd_mutex.lock(); |
ashankar35 | 0:350246c72962 | 221 | uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK); |
ashankar35 | 0:350246c72962 | 222 | lcd_mutex.unlock(); |
ashankar35 | 0:350246c72962 | 223 | if(balls_color[ballNum] == 1){ |
ashankar35 | 0:350246c72962 | 224 | lives--; |
ashankar35 | 0:350246c72962 | 225 | } else { |
ashankar35 | 0:350246c72962 | 226 | lives++; |
ashankar35 | 0:350246c72962 | 227 | } |
ashankar35 | 0:350246c72962 | 228 | //ballNum++; |
ashankar35 | 0:350246c72962 | 229 | } |
ashankar35 | 0:350246c72962 | 230 | if(lives == 0){ |
ashankar35 | 0:350246c72962 | 231 | playing = false; |
ashankar35 | 0:350246c72962 | 232 | t1.terminate(); |
ashankar35 | 0:350246c72962 | 233 | t3.terminate(); |
ashankar35 | 0:350246c72962 | 234 | gameover(); |
ashankar35 | 0:350246c72962 | 235 | break; |
ashankar35 | 0:350246c72962 | 236 | } else if(lives ==3){ |
ashankar35 | 0:350246c72962 | 237 | playing = false; |
ashankar35 | 0:350246c72962 | 238 | win= true; |
ashankar35 | 0:350246c72962 | 239 | t1.terminate(); |
ashankar35 | 0:350246c72962 | 240 | t3.terminate(); |
ashankar35 | 0:350246c72962 | 241 | gameover(); |
ashankar35 | 0:350246c72962 | 242 | break; |
ashankar35 | 0:350246c72962 | 243 | } |
ashankar35 | 0:350246c72962 | 244 | } |
ashankar35 | 0:350246c72962 | 245 | t1.terminate(); |
ashankar35 | 0:350246c72962 | 246 | t3.terminate(); |
ashankar35 | 0:350246c72962 | 247 | gameover(); |
ashankar35 | 0:350246c72962 | 248 | } |